receive事件分析,iOS推送应用逻辑场景

2019-05-03 22:39 来源:未知

前端时间研究APP消息推送的机制,由于机型、版本的碎片化,消息推送的机制不太好理解,所以总结下,放在博文里以备后续查阅。

iOS推送应用逻辑场景

注意要点,
《推送接收情景》根据应用状态分为,前台,后台,关闭应用,三种情况。

前台:打开应用,并处于最前端使用状态。
后台,打开应用,并处于最后端运行状态。
关闭,完全关闭,杀死应用。

《推送通知类型》分为,静默推送和普通推送。

静默推送:
收到推送(没有声音,手机通知中心也不会显示,程序处于前台,后台,关闭状态下均不会显示,不管程序处于前台还是后台,主要没有完全关闭都可以触发,就能自动执行。推送服务无法自行改变应用角标)

普通推送:
收到推送后(有声音提示,程序处于前台,后台,关闭状态下均会在手机的通知中心显示推送的消息。
程序处于前台状态下,通知中心会自动提示。
通知中心已成功收到推送的消息,只能通过点击通知中心消息,来获取推送的数据进行处理。
如果通知中心已成功收到推送的消息,想通过点击应用图标,来获取,推送的数据,很抱歉无法做到。
如果非要实现这功能,需要,和后台交互一起完成,提供一下思路。
后台和推送的第三方比如信鸽,极光交互完成后。
后台记录,是否推送成功。
前端,通过点击应用图标时候,请求一次后台,来获取数据。然后获取完成,作出相应操作。

安卓Android系统的消息推送:

《静默推送》,获取成功,不管前台还是后台都会触发下面的代理方法一,方法二。

如果两个方法同时实现,只会触发方法二。
方法一是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系统下,使用的是信鸽推送服务测试。

安卓

如果文章帮到您,喜欢点个赞,谢谢您。

推送方式

文章内容出错,记得留言,感激不尽。

应用状态

类型

消息中心

触发receive

触发click

远程推送

应用在前台

1、普通消息

进入

不触发

不触发

2、透传消息且符合格式

进入

不触发

触发

3、透传消息且不符合格式

不进入

触发

不触发

应用不在前台

进程
存活

1、普通消息

进入

不触发

不触发

2、透传消息且符合格式

进入

不触发

触发

3、透传消息且不符合格式

不进入

不触发

不触发

本地推送

应用在前台

 

 

进入

不触发

不触发

 

苹果iOS系统的消息推送:

 

 

iOS

推送方式

应用状态

消息中心

触发receive

触发click

远程推送
APNs

应用在前台

不进入

触发

不触发

应用不在前台

进入

不触发

触发

本地推送

应用在前台

进入

触发

不触发

 

Android:

触发click事件: 发送透传数据并且格式为标准格式。

触发receive事件:发送透传数据且格式为非标准格式且应用在活动。(消息栏不会有提示!)

 

iOS:

在线:只能响应receive,但消息中心无消息;

不在线:消息中心有消息,且响应click事件.

转自:

TAG标签: 韦德娱乐1946
版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于韦德娱乐1946网页版,转载请注明出处:receive事件分析,iOS推送应用逻辑场景