概述:推送过程简介服务器
1、App启动过程当中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通讯,发出注册远程推送的申请。若注册成功,回调函数application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 会被触发,App能够获得deviceToken,该token就是一个与设备相关的字符串.
2、App获取到DeviceToken后,将DeviceToken发送给本身的服务端。
3、服务端拿到DeviceToken之后,使用证书文件,向苹果的APNS服务器发起一个SSL链接。链接成功以后,发送一段JSON串,该JSON串包含推送消息的类型及内容。
4、苹果的APNS服务器获得JSON串之后,向App发送通知消息,使得App的回调函数application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo被调用,App从userInfo中便可获得推送消息的内容。app
一、前期准备函数
在学习推送开发以前,开发者须要两样东西,(1)、iPhone真机,由于模拟器不支持推送(2)、付费的开发者帐号。学习
二、新建项目,选择Single View Application模板。spa
三、注册通知(Registration Notification)操作系统
(1)在AppDelegate文件的application:didFinishLaunchingWithOptions:方法中添加“注册推送”的代码。.net
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操做系统就知道该应用程序将须要处理推送消息方面的内容。code
经过上面的代码,iOS操做系统与苹果的APNS服务器联系,而且得到一个device token,这个device token用于区别运行该App的每个硬件设备。这个device token是用于你本身的服务器给该设备发送推送信息,具体的实现方式就是你的服务器将device token以及须要推送的信息打包发送给苹果的服务器,而后苹果的APNS服务器负责将推送的内容分发到对应的设备。blog
须要了解的是device token在每个App上面都不同,而且在同一个App上面会由于时间改变而不一样。因此苹果推荐在每一次App启动的时候将device token发送到你的服务器后台,以确保device token是最新的。token
四、判断注册通知失败仍是成功
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);
}
|
五、收到通知消息,进行消息处理
若是收到了通知事件,那么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);
//仅仅是我参与的项目中这样处理,见仁见智
}
|
六、制做证书,使用真机进行推送消息开发
这时候若是运行项目,那么application:didFailToRegisterForRemoteNotificationsWithError将会执行,由于模拟器不支持推送,须要制做证书,使用真机作推送开发。
七、SSL Certificate证书制做
在苹果的开发者中心,建立App Id
推送的证书必须使用精确(Explicit)的App ID,而不能使用模糊(Wildcard) App ID。
以下图所示,
勾选上Push Notifications服务,以下图所示,
而后按照建立证书的流程,使用建立的App ID,由于须要截图较多,此处再也不赘述。