iOS10 推送完整剖析和注意事项
本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解。以下是 pikacode 使用 iOS 推送的一些经验,欢迎互相交流,指出错漏之处。 推送服务可以说是所有 App 的标配,不论是哪种类型的 App,推送都从很大程度上决定了 App 的 打开率、使用率、存活率 。因此,熟知并掌握推送原理及方法,对每一个开发者来说都是必备技能,对每一个依赖 App 的公司来说都至关重要。 从 iOS 10 新增的 UserNotifications Framework 可以发现,Apple 整合了原有散乱的 API,并且增加了许多强大的功能。以 Apple 官方的角度来看,也必然是相当重视推送服务对 App 的影响、以及对 Apple iOS 生态圈长远发展的影响。 准备篇 Tip 1:推送通知(Push Notification)必须购买 Apple 开发者账号,并使用特定的推送证书 使用免费帐号不能推送。 原理篇 Tip 2:推送通知本身是 iOS 系统的行为,所以在 App 没有运行(没有在前台也没有在后台)的时候: Tip 3:手机向 APNs 注册推送服务 #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)。因为当你取到该值时必然: 推送证书配置正确(你拥有了推送权限)。 5.综上,注册及接收推送必须使用真机,必须连网。 Tip 4:推送通知从 服务端 --> App 代码 的过程 1.使用你们公司或第三方的服务端向 APNs 发送推送请求(请参考苹果 APNs 相关资料,或者第三方推送提供了更简单的 REST API)。 推送通知内容篇 Tip 5:推送通知分为 本地/远程 2 种类型: 本地通知,可指定推送时间,在该时间准时弹出推送通知。 { "_j_msgid" = 200806057; // 第三方附带的 id,用于统计点击 aps = { alert = "显示内容"; badge = 1; // App 角标,可推送 n、+n、-n 来实现角标的固定、增加、减少 sound = default; // 推送声音,默认系统三全音,如需使用自己的声音,需要将声音文件拖拽&拷贝至 Xcode 工程目录任意位置,并在推送时指定其文件名 }; key1 = value1; // 自定义字段,可设置多组,用于处理内部逻辑 key2 = value2; } 后台推送 各种显示效果跟普通推送完全一样。 App: 处于前台,可通过didReceiveRemoteNotification(iOS 7 before)didReceiveRemoteNotification:fetchCompletionHandler:(iOS 7 after) 获取通知内容。 通知内容类似如下: { "_j_msgid" = 2090737306; aps = { alert = "显示内容"; badge = 1; "content-available" = 1; // 必带字段 sound = default; }; key1 = value1; } 静默推送 通知内容类似如下: { "_j_msgid" = 3938587719; aps = { alert = ""; "content-available" = 1; // 必带字段 }; key1 = value1; } 推送目标篇 别名、标签、Registration ID 均是第三方提供的用于更方便地指定推送目标的功能。 广播 别名 alias 推送 第三方提供的功能 标签 tag 推送 第三方提供的功能。 Registration ID 推送 第三方提供的功能。 应用内消息篇 Tip 7:应用内消息(以下简称消息 )和推送通知的区别,消息: 组合大招篇 Tip 8:tags 的组合技巧 Tip 9:通知+消息的组合技巧 由于各自的特性都存在差异,因此二者结合使用是使得 App 推送性能最大化的必然选择: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |