iOS 推送
[toc]
推送原理
APNs全拼是Apple Push Notification Service(Apple Push服务器),是苹果的服务器。
Apple推送机制可以概括为下图
图中Provider意思为供应商,就是后台服务器。
如图我们可以将消息推送分为三个阶段。
第一阶段:Java后台把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
Provisioning profile
配置文件Device Token
设备TokenApp ID
程序ID
如图我们可以理解:
1、首先是应用程序注册消息推送。
2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
3、应用程序将deviceToken发送给PUSH服务端程序。
4、 服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面我介绍一下几种用到的证书。
集成极光推送
iOS SDK概述
从上图可以看出,JPush iOS Push 包括 2 个部分,APNs 推送(代理),与 JPush 应用内消息。
红色部分是 APNs 推送,JPush 代理开发者的应用(需要基于开发者提供的应用证书),向苹果 APNs 服务器推送。由 APNs Server 推送到 iOS 设备上。
蓝色部分是 JPush 应用内推送部分,即 App 启动时,内嵌的 JPush SDK 会开启长连接到 JPush Server,从而 JPush Server 可以推送消息到 App 里。
APNs 通知
APNs 通知:是指通过向 Apple APNs 服务器发送通知,到达 iOS 设备,由 iOS 系统提供展现的推送。用户可以通过 IOS 系统的 “设置” >> “通知” 进行设置,开启或者关闭某一个 App 的推送能力。
JPush iOS SDK 不负责 APNs 通知的展现,只是向 JPush 服务器端上传 Device Token 信息,JPush 服务器端代理开发者向 Apple APNs 推送通知。
获取 APNs 推送内容
应用内消息(自定义消息推送,如QQ)
应用内消息:JPush iOS SDK 提供的应用内消息功能,在 App 在前台时能够收到推送下来的消息。App 可使用此功能来做消息下发动作。
此消息不经过 APNs 服务器,完全由 JPush 提供功能支持。
获取应用内消息推送内容
iOS 集成指南
创建应用
创建应用 :
点击[创建应用]按钮即可;
配置应用信息:
Step1: 基本信息:输入应用名称 (必填), 上传一个图标;
配置 Android 平台信息:填写应用包名, JPush 系统会在后台根据你输入的包名生成的推送的 Android 应用 Demo, 该 Demo 包含了该配置的信息;
Step2: 配置 iOS 平台信息:上传相关环境的推送证书,并填写和证书配套的密码;
Step3: 配置 WinPhone 平台信息:选择是否开启即可;
1 | 注意:Android 的包名和 iOS 的证书一旦配置,不允许修改; |
Step4: 信息配置完成后,查看应用信息如下:
应用管理
点击[home]回到首页,可浏览所有应用的信息,点击应用名称或设置可查看应用详情,点击推送可去到发送通知页,编辑并推送通知,点击统计,可查看该应用的所有统计数据;
应用详情如下
应用设置如下
#####发送通知
路径:选择应用->推送->发送通知
填写推送内容后点击页面最下方的[立即发送]按钮即可;
该功能对应 Rest API - Push - Notification
1 | 注意:如果选择别名、标签、registrationID 推送,在输入一个值后需要回车确认。 |
Web 界面会弹出对话框, 提示是否发送, 选[发送吧]即可;
推送成果后,弹出对话框,点击[去看看]即可查看推送结果;
推送历史
路径:选择应用->推送->推送历史
在右边可以浏览推送的历史数据,包含推送时间,内容,类型,IOS 目标|成功,Android 目标|成功,Winphone 目标|成功,操作; 点开操作中的 i,可以展开消息详情,查看详细的推送内容。
jpush_web
说明
统计示例:
配置工程
导入SDK
选择 1:Cocoapods 导入
通过 Cocoapods 下载地址:
1 | pod 'JPush' |
1 | 注:如果无法导入最新版本,请执行 pod repo update master 这个命令来升级本机的 pod 库,然后重 |
如果需要安装指定版本则使用以下方式(以 3.1.0 版本为例):
1 | pod 'JPush', '3.1.0' |
选择 2:手动导入
- 在极光官网下载最新 SDK
- 将 SDK 包解压,在 Xcode 中选择 “
Add files to 'Your project name'...
”,将解压后的 lib 子文件夹(包含 JPUSHService.h、jpush-ios-x.x.x.a、jcore-ios-x.x.x.a )添加到你的工程目录中。 - 添加 Framework
- CFNetwork.framework
- CoreFoundation.framework
- CoreTelephony.framework
- SystemConfiguration.framework
- CoreGraphics.framework
- Foundation.framework
- UIKit.framework
- Security.framework
- libz.tbd(Xcode 7 以下版本是 libz.dylib)
- AdSupport.framework(获取 IDFA 需要;如果不使用 IDFA,请不要添加)
- UserNotifications.framework(Xcode 8 及以上)
- libresolv.tbd(JPush 2.2.0 及以上版本需要,Xcode 7 以下版本是 libresolv.dylib)
1 | 注意: 如果集成 JPush 3.0.1 及以上版本, 且同时集成极光其他 SDK(如:JMessage 3.0.0 及以上版本) |
Build Settings
如果你的工程需要支持小于 7.0 的 iOS 系统,请到 Build Settings 关闭 bitCode 选项,否则将无法正常编译通过。
- 设置 Search Paths 下的 User Header Search Paths 和 Library Search Paths,比如 SDK 文件夹(默认为 lib )与工程文件在同一级目录下,则都设置为 “$(SRCROOT)/{静态库所在文件夹名称}” 即可。
Capabilities
如使用 Xcode 8 及以上环境开发,请开启 Application Target 的 Capabilities->Push Notifications 选项,如图:
允许 Xcode 7 支持 Http 传输方法
如果您使用的是 2.1.9 及以上的版本则不需要配置此步骤
如果用的是 Xcode 7 或更新版本,需要在 App 项目的 plist 手动配置下 key 和值以支持 http 传输:
选择1:根据域名配置
在项目的 info.plist 中添加一个 Key:NSAppTransportSecurity,类型为字典类型。
然后给它添加一个 NSExceptionDomains,类型为字典类型;
把需要的支持的域添加给 NSExceptionDomains。其中 jpush.cn 作为 Key,类型为字典类型。
每个域下面需要设置 2 个属性:NSIncludesSubdomains、NSExceptionAllowsInsecureHTTPLoads。 两个属性均为 Boolean 类型,值分别为 YES、YES。
如图: