iOS推送应用逻辑场景
1. 根据应用状态分为,前台,后台,关闭应用,三种情况。
- 前台:打开应用,并处于最前端使用状态。
- 后台,打开应用,并处于后端运行状态。
- 关闭,完全关闭,杀死应用。
2. 推送通知类型:静默推送和普通推送
2.1 静默推送:
此功能是iOS7新增加的功能,允许应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新。
收到推送(没有声音,手机通知中心也不会显示,程序处于前台,后台,关闭状态下均不会显示,不管程序处于前台还是后台,主要没有完全关闭都可以触发,就能自动执行。推送服务无法自行改变应用角标)
收到推送(没有文字没有声音),不用点开通知,不用打开APP,就能执行(void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResultresult))handler,用户完全感觉不到
获取成功,不管前台还是后台都会触发下面的代理方法:
//iOS7之前
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"====方法一收到静默推送的回调userinfo=%@", userInfo);
}
//iOS7 -- 当应用在后台时,系统会调用didReceiveRemoteNotification方法。如果应用在前台,则不会调用此方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"====方法二收到静默推送的回调userinfo=%@", userInfo);
}
注意:使用最新格式的notification
(1)一定不能加alert,如果加入了alert就不是静默推送了
(2)一定要加"content-available" : 1
(3)sound也不能加,加入的话也是静默推送(可以测试时添加)
{
"aps" : {
参数 :XXX,
"content-available" : 1
}
}
2.2 普通推送:
收到推送后(有声音提示,程序处于前台,后台,关闭状态下均会在手机的通知中心显示推送的消息。
程序处于前台状态下,通知中心会自动提示。
通知中心已成功收到推送的消息,只能通过点击通知中心消息,来获取推送的数据进行处理。
- 当应用处于《关闭状态》下,点击推送消息,同时触发代理方法三,然后依次顺序触发方法二。
//方法三
- (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);
}