这里记录下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(); } } }
|