推送的总结

主要功能连接在这里
http://my.oschina.net/u/1418722/blog/317422


在介绍以前, 咱们先回顾一下在 iOS7 以前的后台运行相关的知识。在 iOS7 以前(iOS4 以后)主要有三类的应用程序可以后台运行:

  音频播放
  后台定位服务
  IP 电话
  除了这三种应用,其余程序只能是在进入后台以前向系统请求一个额外的运行时间(最长为 10 分钟),并在该时间内来进行后台运行操做,如保存用户信息,上传或下载数据,进行视频编码等操做。

  

  - (void)applicationDidEnterBackground:(UIApplication *)application
  {
  static UIBackgroundTaskIdentifier task;
  task = [application beginBackgroundTaskWithExpirationHandler:^{
  task = UIBackgroundTaskInvalid;
  };
  // 执行后台操做
  [application endBackgroundTask:task];
  }
  此次 iOS7 支持了两种新的程序后台运行模式:

  

  须要按期请求数据的程序能够在系统中注册,这样程序就能够在后台被按期唤醒来下载新的数据。这种状况须要在程序的 Info.plist 文件中 UIBackgroundModes 项增长 fetch 类型,同时经过 setMinimumBackgroundFetchInterval: 方法来设置程序按期获取数据的最小时间间隔。你须要实现 application:performFetchWithCompletionHandler: 代理方法并在该方法内执行下载操做。

  程序还能够经过后台消息推送服务来通知用户有新的内需能够下载,同时激活后台下载操做。这种须要在 UIBackgroundModes 项中增长 remote-notification 值,同时你须要实现 AppDelegate 方法 application:didReceiveRemoteNotification:fetchCompletionHandler: 来执行你的下载操做。

  无论是支持 fetch 或 remote-notification 后台运行模式的程序,都有可能被系统在合适的时候启动或从后台挂起状态移除调。在 fetch 模式下,系统会利用有效的信息来决定启动或激活程序的最佳时期。例如:系统可能会在网络情况良好或者设备刚解锁的时候让程序执行 fetch 操做。支持 remote-notifiaction 的程序,能够在接收到推送消息的时候被唤醒,但在用户接收到推送消息以前,程序能够经过按期获取的形式下载最新内容,并在随后的推送消息以前就已经准备好将内容展示给用户。

  为了执行后台下载操做,程序应该使用新增的 NSURLSession 类,该类在以前的 NSURLConnectoin 的基础上提供了更简洁、基于任务的接口来启动并执行 NSURLRequest 对象。一个 NSURLSession 对象能够启动多个下载或上传任务,并在代理方法里面来处理来自服务器的认证请求。

  实现
  如今咱们来实现 fetch 和 remote-notifiaction 两种后台运行。

  1. 设置

  在 Xcode5.0 里面 Capabilities 下能够直接经过勾选的方式选择应用须要支持的后台运行的类型(可多选哦),咱们选中 Background fetch 和 Remote notification 两项。并在程序的 Info.plist 文件中的 Required background modes 中添加 fetch 和 remote-notification 两项。

  Multitasking SettingMultitasking Setting

  2. Background Fetch

  

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  {
  // Override point for customization after application launch.
  [application setMinimumBackgroundFetchInterval:
  UIApplicationBackgroundFetchIntervalMinimum];
  return YES;
  }

  - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
  NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:3000/update.do"];
  NSURLSession *updateSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
  [updateSession dataTaskWithHTTPGetRequest:url
  completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  NSDictionary *messageInfo = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
  NSLog(@"messageInfo:%@",messageInfo);
  completionHandler(UIBackgroundFetchResultNewData);
  }];
  }
  首先在 application:didFinishLaunchingWithOptions: 中设置 minimun background fetch interval 类型为 UIApplicationBackgroundFetchIntervalMinimum(默认为 UIApplicationBackgroundFetchIntervalNever),而后实现代理方法 application:performFetchWithCompletionHandler: 中实现数据请求。

  

  为了测试程序后台运行,咱们能够新建一个 Scheme,选中 Background Fetch(Launch due to a background fetch event),而后在该 Scheme 下运行程序,程序并不会启动,可是你能看到它给后台发了请求。

  New SchemeNew Scheme

  Remote Notifications

  相似要实现 remote-notification 模式,须要在原来支持 push 的条件下实现 application:didReceiveRemoteNotification:fetchCompletionHandler: 代理方法,程序在后台收到 payload 中包含 "content-available = 1" 的推送消息时,会执行该代理方法。(由于模拟器没法模拟消息推送,iPad 版本的 iOS7 还没提供下载,因此我暂时无法亲测)。
相关文章
相关标签/搜索