JSON

iOS教程:IOS推送的完整剖析

字号+ 作者:H5之家 来源:H5之家 2016-10-10 14:00 我要评论( )

推送服务可以说是所有 App 的标配,不论是哪种类型的 App,推送都从很大程度上决定了 App 的 打开率、使用率、存活率 。因此,熟知并掌握推送原理及方法,对每一

  ios教程国庆7天乐的假期,已经结束,今年的假期也就基本没有了!今天第一天,给大家带来IOS推送的完整剖析,这篇文章可是小编花了心思的!需要大家多理解才能掌握!

  推送服务可以说是所有 App 的标配,不论是哪种类型的 App,推送都从很大程度上决定了 App 的 打开率、使用率、存活率 。因此,熟知并掌握推送原理及方法,对每一个开发者来说都是必备技能,对每一个依赖 App 的公司来说都至关重要。

  从 iOS 10 新增的 UserNotifications Framework 可以发现,Apple 整合了原有散乱的 API,并且增加了许多强大的功能。以 Apple 官方的角度来看,也必然是相当重视推送服务对 App 的影响、以及对 Apple iOS 生态圈长远发展的影响。

  准备篇

  Tip 1:推送通知(Push Notification)必须购买 Apple 开发者账号,并使用特定的推送证书

  使用免费帐号不能推送。

  那如果我们使用的是第三方推送服务(以下简称第三方)呢?比如「极光推送」。也必须购买开发者帐号。因为所有的第三方都会将推送请求发至 APNs(Apple Push Notification service 苹果推送通知服务),所有推送均是由 APNs 下发。

  如何注册及正确的配置证书,参考这里 iOS 证书设置指南。

  原理篇

  Tip 2:推送通知本身是 iOS 系统的行为,所以在 App 没有运行(没有在前台也没有在后台)的时候:

  仍然能够推送及接收(通知中心通知、顶部横幅、刷新 App 右上角的小圆点即 badge [以下简称角标] 等都会由系统来控制和展示)。

  收到推送时,是无法在 App 的代码中获取到通知内容的。因为沙盒机制,此时 App 的任何代码都不可能被执行。

  Tip 3:手机向 APNs 注册推送服务

  1. 在代码中注册推送服务:

  #ifdef __IPHONE_8_0

  if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {

  UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge| UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];

  [[UIApplication sharedApplication] registerUserNotificationSettings:settings];

  } else {

  UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;

  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];

  }

  #else

  UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;

  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];

  #endif

  2. 在第一次触发这段代码的时候,会有一个系统弹窗,询问你是否允许该 App 要给你推送信息。当你选择允许时,系统会打包 App+手机唯一标识+证书 信息发送至 APNs 服务器注册推送服务,APNs 系统会对该手机安装的该 App 是否有推送权限进行验证,所以必须要加入了 Apple Deveice 的手机,使用对应 App 的推送证书才能够成功的注册。

  3. 如果注册成功,则可以在 AppDelegate.m 的如下方法中获取到 deviceToken,它是对 该手机+该App 组合的一个唯一标识,当使用远程推送时,只需将推送消息发给指定的 deviceToken 即可使推送信息传达给指定手机的指定 App 上。因此如果你使用第三方,就需要在这个方法里将 deviceToken 传给第三方。(在 iOS 9 为了更好的保护用户隐私,会出现多次重复删除/安装 App 导致 deviceToken 不断变化的情况。有时会出现一条推送手机会收到 2 次的问题,属于 iOS 9 系统问题)。

  -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

  [JPUSHService registerDeviceToken:deviceToken];//将 deviceToken 传给极光推送

  }

  4. 如果以上步骤均成功,此时你能够取到第三方提供的设备注册 id。能否取到该 id 值,可以作为判断设备是否能够成功推送的标准(见 Tip 6 - Registration ID)。因为当你取到该值时必然:

  推送证书配置正确(你拥有了推送权限)。

  设备成功在 APNs 注册并返回了 deviceToken(APNs 能识别你的设备了)。

  返回 的 deviceToken 传给第三方,成功在第三方生成了唯一标识注册 id(第三方能将你的设备信息传给 APNs 了)

  Tip 4:推送通知从 服务端 --> App 代码 的过程

  使用你们公司或第三方的服务端向 APNs 发送推送请求(请参考苹果 APNs 相关资料,或者第三方推送提供了更简单的 REST API)。

  APNs 接收并验证推送请求。

  APNs 找到设备下发推送。

  手机收到推送通知,系统根据 App 状态进行处理:

  如果点击推送横幅/通知中心而启动 App,系统将通知传到 didFinishLaunchingWithOptions。

  展示横幅、通知中心、声音、角标。

  如果开启了 Remote Notification ,系统将推送传到 didReceiveRemoteNotification:fetchCompletionHandler:(见 Tip 5 - 后台推送),否则此时代码中收不到推送。

  展示横幅、通知中心、声音、角标。

  系统会将通知内容传到 didReceiveRemoteNotification

  前台收到:

  后台收到:

  退出收到:

  推送通知内容篇

  Tip 5:推送通知分为 本地/远程 2 种类型:

  本地通知,可指定推送时间,在该时间准时弹出推送通知。

  远程推送通知,分为 普通推送/后台推送/静默推送 3 种类型。存在延迟问题(由于 Tip 1 第 2 点,APNs 的不稳定及高峰时段的巨量请求所致)。

  没有任何展示效果。

  必须携带 "content-available" = 1;,因此静默必然是后台的。

  必须不携带 alert、badge、sound。

  可携带自定义字段。

  App :

  通知内容类似如下:

  处于前台,可通过didReceiveRemoteNotification(iOS 7 before)didReceiveRemoteNotification:fetchCompletionHandler:(iOS 7 after) 获取通知内容。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【达内科技】C++中消息自动派发之About JSON Encode

    【达内科技】C++中消息自动派发之About JSON Encode

    2015-11-24 17:05

网友点评
c