ios中的推送功能实现

转载自: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提示时候开启通知


  •  

七.创建通知测试

  • 在百度云推送后台创建一个通知测试,请选择开发模式

  • 现在我们就接收到刚才创建的通知了



 

猜你喜欢

转载自blog.csdn.net/haoxuhong/article/details/81296423