美文网首页and
iOS推送应用逻辑场景

iOS推送应用逻辑场景

作者: 呆呆羞 | 来源:发表于2017-08-15 11:14 被阅读73次

    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系统下,使用的是信鸽推送服务测试。

    如果文章帮到您,喜欢点个赞,谢谢您。
    文章内容出错,记得留言,感激不尽。

    相关文章

      网友评论

      • 桔子听:方法一,方法二,一个是iOS7之前,一个是iOS7之后。

      本文标题:iOS推送应用逻辑场景

      本文链接:https://www.haomeiwen.com/subject/qvgurxtx.html