最近在做iOS的推送,顺便整理记录一下,首先看下消息的流程,一图胜千言:
Provider将目的设备的唯一标识及消息体通过APNS传递到用户的手中。
那么,Provider如何获取到用户的设备唯一标识(DeviceToken)呢,看下图:
注,app首先要活的接受通知的权限。图中红色框区域是服务端开发需要处理的,可以通过第三方服务完成,如极光推送,百度推送等。
接下来,落实到代码上:
1、获取DeviceToken,注册远程通知,并指定类型,首次注册会提示申请权限。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
return YES;
}
2、如果获取成功后,会回调这个方法完成与Provider的通信
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"Receive DeviceToken: %@", deviceToken);
[APService registerDeviceToken:deviceToken]; //极光
}
如果失败则回调下面方法
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *) error {
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
对于远程通知 ,分两种情况讨论:
1、应用处于UIApplicationStateActive时,即应用处于开启状态时,接收到远程通知 下面这个方法会被响应
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
处理userInfo
}
2、应用处于关闭时,
①如果收到通知后点击icon进入,则无任何函数被触发
②如果是点击远程通知那一条目进入,则,有两个地方会或得到推送的内容
首先,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
......
NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
其次,下面函数也会被调用(NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
处理userInfo
}
对于本地通知:
1、应用处于UIApplicationStateActive时,即应用处于开启状态时,接收到本地通知 下面这个方法会被响应
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSDictionary *NotDict = notification.userInfo;
}
2、应用处于关闭时,
①如果收到通知后点击icon进入,则无任何函数被触发
②如果是点击本地通知那一条目进入,则,仅有一个地方会或得到推送的内容
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
......
UILocalNotification *theNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
}