概述:推送过程简介
一、App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请。若注册成功,回调函数application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 会被触发,App可以得到deviceToken,该token就是一个与设备相关的字符串.
二、App获取到DeviceToken后,将DeviceToken发送给自己的服务端。
三、服务端拿到DeviceToken以后,使用证书文件,向苹果的APNS服务器发起一个SSL连接。连接成功之后,发送一段JSON串,该JSON串包含推送消息的类型及内容。
四、苹果的APNS服务器得到JSON串以后,向App发送通知消息,使得App的回调函数application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo被调用,App从userInfo中即可得到推送消息的内容。
1、前期准备
在学习推送开发之前,开发者需要两样东西,(1)、iPhone真机,因为模拟器不支持推送(2)、付费的开发者账号。
2、新建项目,选择Single View Application模板。
3、注册通知(Registration Notification)
(1)在AppDelegate文件的application:didFinishLaunchingWithOptions:方法中添加“注册推送”的代码。
1
2
3
4
5
6
7
8
9
10
|
- ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Register for Remote Notifications
if (iOS8_OR_LATER) {
[[UIApplication sharedApplication] registerForRemoteNotifications];
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
}
} |
这样iOS操作系统就知道该应用程序将需要处理推送消息方面的内容。
通过上面的代码,iOS操作系统与苹果的APNS服务器联系,并且获得一个device token,这个device token用于区别运行该App的每一个硬件设备。这个device token是用于你自己的服务器给该设备发送推送信息,具体的实现方式就是你的服务器将device token以及需要推送的信息打包发送给苹果的服务器,然后苹果的APNS服务器负责将推送的内容分发到对应的设备。
需要了解的是device token在每一个App上面都不一样,并且在同一个App上面会因为时间改变而不同。所以苹果推荐在每一次App启动的时候将device token发送到你的服务器后台,以确保device token是最新的。
4、判断注册通知失败还是成功
1
2
3
4
5
6
7
8
|
- ( void )application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@ "Did Register for Remote Notifications with Device Token (%@)" , deviceToken);
} - ( void )application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@ "Did Fail to Register for Remote Notifications" );
NSLog(@ "%@, %@" , error, error.localizedDescription);
} |
5、收到通知消息,进行消息处理
如果收到了通知事件,那么UIApplicationDelegate接口中的application:didReceiveRemoteNotification将会执行,你可以在这里获取推送的信息,然后做出相应的处理。
1
2
3
4
5
6
7
8
|
- ( void )application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{ NSString *deviceTokenStr = [[[[deviceToken description]
stringByReplacingOccurrencesOfString: @ "<" withString: @ "" ]
stringByReplacingOccurrencesOfString: @ ">" withString: @ "" ]
stringByReplacingOccurrencesOfString: @ " " withString: @ "" ];
NSLog(@ "去除device token中的空格和<>字符:%@" ,deviceTokenStr); //仅仅是我参与的项目中这样处理,见仁见智
} |
6、制作证书,使用真机进行推送消息开发
这时候如果运行项目,那么application:didFailToRegisterForRemoteNotificationsWithError将会执行,因为模拟器不支持推送,需要制作证书,使用真机做推送开发。
7、SSL Certificate证书制作
在苹果的开发者中心,创建App Id
推送的证书必须使用精确(Explicit)的App ID,而不能使用模糊(Wildcard) App ID。
如下图所示,
勾选上Push Notifications服务,如下图所示,
然后按照创建证书的流程,使用创建的App ID,因为需要截图较多,此处不再赘述。