iOS APNS推送 - 静默推送和普通推送

2,798 阅读3分钟

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" : 13)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);

}