现在网上关于推送的文章不计其数,大多数很陈旧,用起来不知所措,本文就集成了极光推送的情况捋一遍常用的几个方法。
首先列举出我们经常在网上看到的几个方法:
方法一:- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
方法二:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ;
方法三:- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler ;//当设置推送content-available = 1 且应用在后台挂起时接收到推送消息时就会立即执行本方法
方法四:- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler ;
方法五:- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler;`
方法六:- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
因为现在几乎没有适配 iOS7的情况了(即使有也不考虑了),现在我们大多数都适配到 iOS8,所以当你看到方法六后,直接忽略掉,从你的代码里果断删除。
下面我们来分析收到推送后的几种情况:
1.用户点击横幅进入 APP,且 APP 进程没有开启(APP 是死掉的)。
在这种情况下,方法一、方法二、方法五都可以获取到推送内容。特别注意,方法五也会执行的!此外,方法五只在 iOS9以后有效。因此,当在 iOS8的情况下,在方法二中处理推送。iOS9以后就在方法五中处理推送。执行代码的时候加一个判断就可以了。
如果是新手想测试推送的内容格式,可以在显示主窗口后添加以下代码:
[self.window makeKeyAndVisible];
if (launchOptions) {
NSLog(@"%@",launchOptions);
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 300, 500)];
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByCharWrapping;
label.text = [NSString stringWithFormat:@"%@", launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]];
label.backgroundColor = [[UIColor grayColor] colorWithAlphaComponent:0.5];
[self.window addSubview:label];
}
当你收到推送后点击横幅进入 app 会给程序主窗口上加一个 label,显示出推送的内容,这个在调试的时候是很方便的。
当你获取到推送内容后,你就可以进行相应的处理,比如跳转到相应的界面。处理的时候需要注意一下(曾经遇到过坑),如下:
if (launchOptions) {
// 在launchOptions有值的情况下,必须得判断 app 是通过什么方式进入的,有可能是经过其他 app 打开的,也有可能是点击推送打开的,如果不做判断就会出错。
if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
// 这里是有推送内容的处理
} else if (launchOptions[UIApplicationLaunchOptionsSourceApplicationKey]) {
// 这里是通过其他 app 进入
}
}
2.通过点击横幅进入 app(app 处于后台)
在这种情况下,当进入 app后会执行方法五,此时可以处理推送。需要注意的是,当设置推送content-available = 1 时会在 app 处于后台的情况下触发方法三。
3.通过点击应用图标进入 app(不论app 是处于后台,还是死掉)
这种情况下,即使收到了推送,也不能够获取内容。 如果在这种情况下想获取推送的内容,可以在发送通知的时候同时发送一条内容相同的自定义消息。
自定义消息的推送和经过APNS的推送有几点不相同:
1.只有app在前台时才能收到推送消息;(消息为注册通知接收,在后台或者未启动时通知无效)
2.收到推送时推送通知栏是没有显示的;(iOS10即使在前台收到源生推送或者极光非自定义消息推送通知栏也是有显示的);
3.SDK解释了该自定义消息推送不经过APNS。
不点击通知栏获取消息
4.App处于前台
这种情况下会触发方法四。可以在方法四中处理。
以上就是在集成极光推送的情况下对各种方法执行情况的梳理。
网友评论