iOS推送应用逻辑场景
注意要点,
《推送接收情景》根据应用状态分为,前台,后台,关闭应用,三种情况。
前台:打开应用,并处于最前端使用状态。
后台,打开应用,并处于后端运行状态。
关闭,完全关闭,杀死应用。
《推送通知类型》分为,静默推送和普通推送。
静默推送:
收到推送(没有声音,手机通知中心也不会显示,程序处于前台,后台,关闭状态下均不会显示,不管程序处于前台还是后台,主要没有完全关闭都可以触发,就能自动执行。推送服务无法自行改变应用角标)
普通推送:
收到推送后(有声音提示,程序处于前台,后台,关闭状态下均会在手机的通知中心显示推送的消息。
程序处于前台状态下,通知中心会自动提示。
通知中心已成功收到推送的消息,只能通过点击通知中心消息,来获取推送的数据进行处理。
如果通知中心已成功收到推送的消息,想通过点击应用图标,来获取,推送的数据,很抱歉无法做到。
如果非要实现这功能,需要,和后台交互一起完成,提供一下思路。
后台和推送的第三方比如信鸽,极光交互完成后。
后台记录,是否推送成功。
前端,通过点击应用图标时候,请求一次后台,来获取数据。然后获取完成,作出相应操作。
《静默推送》,获取成功,不管前台还是后台都会触发下面的代理方法一,方法二。
如果两个方法同时实现,只会触发方法二。
方法一是iOS7之前,方法二是iOS7之后。
个人建议只实现,方法一,来处理静默推送。
理由,继续往下看。
//方法一
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"====方法一收到静默推送的回调userinfo=%@", userInfo);
}
//方法二
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"====方法二收到静默推送的回调userinfo=%@", userInfo);
}
《普通推送》分为前台,后台,关闭三个状态。下面一一分析。
当应用处于《关闭状态》下,点击推送消息,同时触发代理方法三,然后依次顺序触发方法二。
//方法三
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//成功获取推送的数据
NSDictionary* remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (launchOptions) {
/*
通过关闭程序下无法查看Xcode日记,可以通过改变,应用图标,观察应用变化逻辑
*/
application.applicationIconBadgeNumber=66;
NSLog(@"存在击通知消息,并点击了改消息进入应用=%@", remoteNotification);
}
else{
NSLog(@"不存在击通知消息,并点击了应用图标进入应用");;
}
//方法二(与静默推送中方法二,是同一个方法。所以,静默推送时候,建议实现方法一就好。不然会冲突,处理就麻烦了)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
/*
可以尝试打开下面改变图标对比,方法三和方法二执行顺序
*/
// application.applicationIconBadgeNumber=77;
NSLog(@"====方法二收到推送的回调userinfo=%@", userInfo);
}
当应用处于《后台状态》下时,点击推送消息
或从《前台状态》下,切换到通知中心,点击推送消息
会触发下面代理方法四
//方法四
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler {
NSDictionary *dic=response.notification.request.content.userInfo;
NSLog(@"====[XGDemo]用户点击通知的回调成功=%@",dic);
completionHandler();
}
当应用处于《前台状态》下时,推送消息过来,首先手机的通知中心会自动提示,并展示在程序的上方,此时程序会自动执行下面代理方法五
//方法五
// App 在前台弹通知需要调用这个接口
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
NSDictionary *dic=notification.request.content.userInfo;
NSLog(@"APP前台弹通知,提示时候会自动触发,不需要用户再切换到后台点击通知或不需要用户点击弹出的dic =%@", dic);
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}
声明
本人在10.3.3系统下,使用的是信鸽推送服务测试。
网友评论