iOS 推送通知 功能简单实现

PS:此文仅以简单实现推送为主,是本人个人整理,部分截图与内容来自于互联网,若对大家有所帮助,还请给个赞O(∩_∩)O~~,大神勿喷

一.推送原理

  • 图中,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,推送模式为开发模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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];
  • 添加如下3个方法
1
2
3
4
5
// 在 iOS8 系统中,还需要添加这个方法。通过新的 API 注册推送服务
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
[application registerForRemoteNotifications];
}
1
2
3
4
5
6
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"test:%@",deviceToken);
[BPush registerDeviceToken:deviceToken];
[BPush bindChannelWithCompleteHandler:nil];
}
1
2
3
4
5
// 当 DeviceToken 获取失败时,系统会回调此方法
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"DeviceToken 获取失败,原因:%@",error);
}
六.配置证书测试
  • 双击之前创建好的的TestPush_ProvisioningDev.mobileprovision描述文件,并在Xcode-Targets配置好证书

这一步编译的时候容易failed,通常检查之前配置的provisioning文件状态是否为Active,若状态为Invalid,则需删除本地provisioning文件,clean,再次重新下载配置

  • 真机运行成功后,可看到控制端打印出获得到Device Token,以及APP提示时候开启通知

七.创建通知测试
  • 在百度云推送后台创建一个通知测试,请选择开发模式
  • 现在我们就接收到刚才创建的通知了
总结:此文虽步骤繁多,但只要理解了苹果的证书机制,配置还是很快的,更多的推送操作本文不再多讲,可以去看各大推送SDK说明文档都是OK的,如有任何问题可邮箱yueyeqi@icloud.com联系我