[iOS]推送相关两点
来源:互联网 发布:怎么在淘宝上卖核桃 编辑:程序博客网 时间:2024/05/10 10:12
讨论一下最近遇到的两个问题:
1. 推送接收
2.点击推送打开APP时数据的处理
理想情况是:
- app处于活跃状态,有推送到来,在应用内部应当弹出我们自己生成的提示。
- app处于非活跃状态,有推送到来,弹出系统生成的提示,点击提示会进入app并且显示相关内容。
推送接收
考虑第一种情况,我们需要拿到数据,才能生成相应提示。与此相关的有两个方法:
方法1.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
方法2.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
这两个方法看起来比较眼熟,区别在于哪里呢?第二个方法是iOS7之后才出现的,与之相关的是 “iOS 7 Background Remote Notification”这种类型的通知,它允许应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新。功能使用场景:(多媒体)聊天,Email更新,基于通知的订阅内容同步等功能,提升了终端用户的体验。
如果你用到了这个类型的通知,需要在Xcode 中 Capabilities找到 Backgroud Modes,在 Remote notifications打钩,这样就开启了“Background Remote Notification”,之后notification 处理函数一律切换第二个方法,我们应该在这里拿数据。
如果你没有使用这种类型的通知,你在两个在这两个方法里二选一(Apple推荐第二个方法),如果两个方法都实现了,会默认调用第二个方法。
If your delegate implements both methods, the app object calls the application:didReceiveRemoteNotification:fetchCompletionHandler: method.
点击推送打开APP时数据的处理
当用户点击通知进入app时,你可能想要展示关于这条通知的内容,比如推送了一条商品A的打折信息,用户点击通知进入应用后弹出一个Alert:“商品A打折,是否查看?”。在第二个方法的文档里有这样一段话
If the user opens your app from the system-displayed alert, the system may call this method again when your app is about to enter the foreground so that you can update your user interface and display information pertaining to the notification
意思是当用户点击通知进入app时,会 再次 调用这个方法(之所以用再次这个词,是因为之前说过,如果你的应用处于后台状态并且收到“iOS 7 Background Remote Notification”这种通知,会调用这个方法)。如果你的iOS版本小于iOS7,这个方法就不能使用,你可以在启动方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中拿到推送的数据:
NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];if(userInfo){//do something}
结论
- 如果不考虑小于iOS7的版本,所有的问题可以在方法
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
中解决。 需要支持iOS7之前版本,不需要“iOS 7 Background Remote Notification”这种通知。
- 不实现上面第二个方法,在第一个方法
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
中接收通知。 - 用户点击通知打开app时,在方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
拿到通知数据。
- 不实现上面第二个方法,在第一个方法
需要支持iOS7之前版本,同时需要“iOS 7 Background Remote Notification”这种通知。
这时比较容易出现重复处理的情况,如iOS7中点击推送进入app,在方法2
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
和启动方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中都能获得此条通知数据。- 在方法1.
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
和推送接收方法2.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
中都获得通知内容并处理(不同版本会调用不同方法,不会重复调用)。 - 在启动方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中拿到推送的数据,判断系统版本,如果小于iOS7,拿数据并处理,反之跳过不处理。
- 在方法1.
- [iOS]推送相关两点
- ios推送相关
- iOS推送相关
- iOS推送相关
- iOS的推送相关
- ios 推送相关
- IOS-推送通知相关
- ios推送相关
- IOS消息推送相关介绍
- iOS推送相关注意点
- iOS APNS 推送相关博客
- ios推送相关资料整理
- iOS本地推送相关知识
- ios推送通知相关开源项目
- 推送相关
- 推送相关
- 推送相关
- IOS图标消息推送在不同ios版本中的推送相关
- Swift之UITableView的增删以及三种逆向传值方式
- C++ using namespace std 用法深入解析
- 利用InetAddress类确定特殊IP地址
- 判断数组重复的值 和重复个数
- RabbitMQ入门教程 For Java【6】 - Remote procedure call (RPC)
- [iOS]推送相关两点
- Android开发之app基础框架ViewPager+Fragment
- ava.lang.IllegalStateException: The specified child already has a parent. You must call removeView()
- 表格使用总结
- 搭建 openwrt 本地源
- windows 环境下面nginx的安装与配置
- NSCoding
- 关于AFN的POST请求,图片上传的二次封装
- mybatis 总结