这里记录下iOS消息推送实现的全过程
首先,申请秘钥。
如图:
下面实现创建推送证书
接上图:
下图:
第一步完:
为证书添加推送功能:
点击之后的效果:
点击之后
到现在我们已经有俩个证书了,aps_development.cer 和CertificateSigningRequest.certSigningRequest。
下面的步骤比较关键。我们需要把机器中的之前的证书清理干净,如果不清理干净的画会出现如下错误:
Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x17007d6c0 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串}
这个错误大概的意思就是证书不匹配的意思。
清理之后,我们点击
将推送证书添加进去。
之后我们导出一个可以供服务器端使用的。
以下代码来着网上的活雷锋贡献。
下面附上客户端代码:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
NSString* str = [UIDevice currentDevice];
if
([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey] != nil) {
//获取应用程序消息通知标记数(即小红圈中的数字)
int
badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
if
(badge>
0
) {
//如果应用程序消息通知标记数(即小红圈中的数字)大于0,清除标记。
badge--;
//清除标记。清除小红圈中数字,小红圈中数字为0,小红圈才会消除。
[UIApplication sharedApplication].applicationIconBadgeNumber = badge;
}
}
//消息推送注册
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
return
YES;
}
-(
void
)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString* token = [NSString stringWithFormat:@
"%@"
,deviceToken];
NSLog(@
"%@"
,token);
}
- (
void
)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSString *error_str = [NSString stringWithFormat: @
"%@"
, error];
NSLog(@
"Failed to get token, error:%@"
, error_str);
}
- (
void
)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
//在此处理接收到的消息。
NSLog(@
"Receive remote notification : %@"
,userInfo);
}
|
下面附上服务器端代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import
org.apache.log4j.Logger;
import
org.apache.log4j.PropertyConfigurator;
import
javapns.*;
import
javapns.back.PushNotificationManager;
import
javapns.back.SSLConnectionHelper;
import
javapns.data.Device;
import
javapns.data.PayLoad;
public
class
PushDemo {
public
static
void
main(String[] args)
throws
Exception {
try
{
//从客户端获取的deviceToken,在此为了测试简单,写固定的一个测试设备标识。
String deviceToken =
"9f8e0099 1e72c4ab ca835ec3 994e93d9 a09ce215 62d91bb3 6e929a33 02c29456"
;
System.out.println(
"Push Start deviceToken:"
+ deviceToken);
//定义消息模式
PayLoad payLoad =
new
PayLoad();
payLoad.addAlert(
"this is test!"
);
payLoad.addBadge(
1
);
//消息推送标记数,小红圈中显示的数字。
payLoad.addSound(
"default"
);
//注册deviceToken
PushNotificationManager pushManager = PushNotificationManager.getInstance();
pushManager.addDevice(
"iPhone"
, deviceToken);
//连接APNS
String host =
"gateway.sandbox.push.apple.com"
;
//String host = "gateway.push.apple.com";
int
port =
2195
;
String certificatePath =
"/Users/tokou/Desktop/PushDemo.p12"
;
//前面生成的用于JAVA后台连接APNS服务的*.p12文件位置
String certificatePassword =
"123"
;
//p12文件密码。
pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
//发送推送
Device client = pushManager.getDevice(
"iPhone"
);
System.out.println(
"推送消息: "
+ client.getToken()+
"\n"
+payLoad.toString() +
" "
);
pushManager.sendNotification(client, payLoad);
//停止连接APNS
pushManager.stopConnection();
//删除deviceToken
pushManager.removeDevice(
"iPhone"
);
System.out.println(
"Push End"
);
}
catch
(Exception ex)
{
ex.printStackTrace();
}
}
}
|