转载自:https://www.jianshu.com/p/fda61af94d09
一.推送原理
- 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用百度云推送服务作为Provider。
APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
上图可以分为三个阶段。
第一阶段:Push服务器应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。 - 从上图我们可以看到。
1、首先是应用程序注册消息推送。
2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
3、应用程序将deviceToken发送给PUSH服务端程序。
4、 服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面我介绍一下几种用到的证书。
二.创建本地请求证书文件--CertificateSigningRequest
-
打开钥匙串-证书助理-从证书颁发机构请求证书
- 填写邮箱和名称(无特殊要求可随意填写)-选择存储到磁盘
- 选择继续-保存至桌面即可(此文件可长期重复使用,只作为本机器的一个识别作用)
三.进入苹果开发者网站:https://developer.apple.com/
-
依次选择Member Center - Certificates, Identifiers &Profiles - Certificates
-
选择当前要设置通知的APP IDs
PS:这里我以新建一个APP IDs为例,若公司已有项目APP IDs,则略过此步 -
选择右上角"+"号创建一个APPID
-
填写name以及Bundle ID
-
Bundle ID需要与Xcode里项目Bundle ID一致
-
勾选push notification 并完成提交
-
找到刚创建好的APP IDs,可以看到下面的通知选项处提示Configurable,表示证书还没配置,点击Edit进行编辑
-
这里看到推送证书分为2个版本,一个开发模式,一个生产模式,即我们在开发测试时使用开发模式证书,发布上线后采用生产模式证书,两个都要创建(本次只作开发模式演示,当然创建生产版证书的步骤也是一样的)
-
Choose File选择最开始创建在桌面的Request文件
-
创建证书OK后 下载到本地
-
开发版和生产版证书都创建好后,此时这里已经都是启用状态了
-
打开下载好的开发模式证书,可以在钥匙串中看到,右键将该证书导出成.p12格式文件
-
证书密码可根据需求填写(可为空)
-
这里请输入你电脑管理员密码
-
导出的.p12格式文件如下
-
接下来终端进入该文件目录下使用命令把此文件转成pem格式(因为后端需要上传pem格式文件验证)
openssl pkcs12 -in TestPush_Dev.p12 -out Push_Dev.pem -nodes
-
推送证书创建好了,接下来回到苹果开发者官网,按以下步骤创建Provisioning Profile文件
-
选择该项目APP ID
-
勾选测试授权的设备
-
注意右侧的状态要Active才是可用的,若是invalid则需要Edit并重新下载一次
-
到此我们开发模式所需要的证书和描述文件都创建好了
四.进入百度云推送后台,登陆验证开发者身份,并创建一个推送应用
- 选择iOS,并上传开发版证书(当然如果你同时也创建了生产版证书也可以上传验证)
-
保存后,我们要用到的便是右侧的API KEY
五.项目里配置百度云推送
-
下载最新的百度云推送SDK,导入到工程,SDK需要以下库:Foundation.framework、CoreTelephony.framework、libz.dylib、SystemConfiguration.framework,请在工程中添加
- 再次强调要修改Bundle ID与之前创建证书时所填Bundle ID一致
- 在
AppDelegate
中导入BPush.h
,并在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中添加如下代码,并修改apiKey为刚才创建应用所得apiKey,推送模式为开发模式
<pre><code>`// iOS8 下需要使用新的 API
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
UIUserNotificationType myTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:myTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
}
#warning 测试 开发环境 时需要修改BPushMode为BPushModeDevelopment 需要修改Apikey为自己的Apikey
// 在 App 启动时注册百度云推送服务,需要提供 Apikey
[BPush registerChannel:launchOptions apiKey:<#在百度云推送官网上注册后得到的apikey#> pushMode:BPushModeDevelopment withFirstAction:nil withSecondAction:nil withCategory:nil isDebug:YES];`</code></pre>
- 添加如下3个方法
<pre><code>`// 在 iOS8 系统中,还需要添加这个方法。通过新的 API 注册推送服务
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
[application registerForRemoteNotifications];
}
`</code></pre>
<pre><code>- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"test:%@",deviceToken); [BPush registerDeviceToken:deviceToken]; [BPush bindChannelWithCompleteHandler:nil]; }
</code></pre>
<pre><code>`// 当 DeviceToken 获取失败时,系统会回调此方法
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"DeviceToken 获取失败,原因:%@",error);
}`</code></pre>
六.配置证书测试
- 双击之前创建好的的TestPush_ProvisioningDev.mobileprovision描述文件,并在Xcode-Targets配置好证书
这一步编译的时候容易failed,通常检查之前配置的provisioning文件状态是否为Active,若状态为Invalid,则需删除本地provisioning文件,clean,再次重新下载配置-
真机运行成功后,可看到控制端打印出获得到Device Token,以及APP提示时候开启通知
七.创建通知测试
-
在百度云推送后台创建一个通知测试,请选择开发模式
-
现在我们就接收到刚才创建的通知了