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通知。
    iOS 推送通知 功能简单实现_第1张图片

    从上图我们可以看到。
    1、首先是应用程序注册消息推送。
    2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
    3、应用程序将deviceToken发送给PUSH服务端程序。
    4、 服务端程序向APNS服务发送消息。
    5、APNS服务将消息发送给iPhone应用程序。
    无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面我介绍一下几种用到的证书。
二.创建本地请求证书文件--CertificateSigningRequest
  • 打开钥匙串-证书助理-从证书颁发机构请求证书


    iOS 推送通知 功能简单实现_第2张图片
  • 填写邮箱和名称(无特殊要求可随意填写)-选择存储到磁盘
    iOS 推送通知 功能简单实现_第3张图片
  • 选择继续-保存至桌面即可(此文件可长期重复使用,只作为本机器的一个识别作用)
    iOS 推送通知 功能简单实现_第4张图片
三.进入苹果开发者网站:https://developer.apple.com/
  • 依次选择Member Center - Certificates, Identifiers &Profiles - Certificates



    iOS 推送通知 功能简单实现_第5张图片
  • 选择当前要设置通知的APP IDs
    PS:这里我以新建一个APP IDs为例,若公司已有项目APP IDs,则略过此步

  • 选择右上角"+"号创建一个APPID


    iOS 推送通知 功能简单实现_第6张图片
  • 填写name以及Bundle ID


    iOS 推送通知 功能简单实现_第7张图片
  • Bundle ID需要与Xcode里项目Bundle ID一致


    iOS 推送通知 功能简单实现_第8张图片
  • 勾选push notification 并完成提交


    iOS 推送通知 功能简单实现_第9张图片
  • 找到刚创建好的APP IDs,可以看到下面的通知选项处提示Configurable,表示证书还没配置,点击Edit进行编辑


    iOS 推送通知 功能简单实现_第10张图片
  • 这里看到推送证书分为2个版本,一个开发模式,一个生产模式,即我们在开发测试时使用开发模式证书,发布上线后采用生产模式证书,两个都要创建(本次只作开发模式演示,当然创建生产版证书的步骤也是一样的)

    iOS 推送通知 功能简单实现_第11张图片

  • Choose File选择最开始创建在桌面的Request文件


    iOS 推送通知 功能简单实现_第12张图片

    iOS 推送通知 功能简单实现_第13张图片
  • 创建证书OK后 下载到本地


    iOS 推送通知 功能简单实现_第14张图片
  • 开发版和生产版证书都创建好后,此时这里已经都是启用状态了


    iOS 推送通知 功能简单实现_第15张图片
  • 打开下载好的开发模式证书,可以在钥匙串中看到,右键将该证书导出成.p12格式文件


    iOS 推送通知 功能简单实现_第16张图片

    iOS 推送通知 功能简单实现_第17张图片
  • 证书密码可根据需求填写(可为空)

    iOS 推送通知 功能简单实现_第18张图片

  • 这里请输入你电脑管理员密码


    iOS 推送通知 功能简单实现_第19张图片
  • 导出的.p12格式文件如下


    iOS 推送通知 功能简单实现_第20张图片
  • 接下来终端进入该文件目录下使用命令把此文件转成pem格式(因为后端需要上传pem格式文件验证)
    openssl pkcs12 -in TestPush_Dev.p12 -out Push_Dev.pem -nodes

    iOS 推送通知 功能简单实现_第21张图片

  • 推送证书创建好了,接下来回到苹果开发者官网,按以下步骤创建Provisioning Profile文件


    iOS 推送通知 功能简单实现_第22张图片

    iOS 推送通知 功能简单实现_第23张图片
  • 选择该项目APP ID


    iOS 推送通知 功能简单实现_第24张图片

    iOS 推送通知 功能简单实现_第25张图片

    iOS 推送通知 功能简单实现_第26张图片
  • 勾选测试授权的设备


    iOS 推送通知 功能简单实现_第27张图片
  • 注意右侧的状态要Active才是可用的,若是invalid则需要Edit并重新下载一次


    iOS 推送通知 功能简单实现_第28张图片
  • 到此我们开发模式所需要的证书和描述文件都创建好了

    iOS 推送通知 功能简单实现_第29张图片

四.进入百度云推送后台,登陆验证开发者身份,并创建一个推送应用
iOS 推送通知 功能简单实现_第30张图片
  • 选择iOS,并上传开发版证书(当然如果你同时也创建了生产版证书也可以上传验证)
    iOS 推送通知 功能简单实现_第31张图片
  • 保存后,我们要用到的便是右侧的API KEY


    iOS 推送通知 功能简单实现_第32张图片
五.项目里配置百度云推送
  • 下载最新的百度云推送SDK,导入到工程,SDK需要以下库:Foundation.framework、CoreTelephony.framework、libz.dylib、SystemConfiguration.framework,请在工程中添加


    iOS 推送通知 功能简单实现_第33张图片

    iOS 推送通知 功能简单实现_第34张图片
  • 再次强调要修改Bundle ID与之前创建证书时所填Bundle ID一致
    iOS 推送通知 功能简单实现_第35张图片
  • AppDelegate中导入BPush.h,并在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代码,并修改apiKey为刚才创建应用所得apiKey,推送模式为开发模式
// 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个方法
// 在 iOS8 系统中,还需要添加这个方法。通过新的 API 注册推送服务
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    [application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"test:%@",deviceToken);
    [BPush registerDeviceToken:deviceToken];
    [BPush bindChannelWithCompleteHandler:nil];   
}
// 当 DeviceToken 获取失败时,系统会回调此方法
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"DeviceToken 获取失败,原因:%@",error);
}
六.配置证书测试
  • 双击之前创建好的的TestPush_ProvisioningDev.mobileprovision描述文件,并在Xcode-Targets配置好证书
    iOS 推送通知 功能简单实现_第36张图片

    这一步编译的时候容易failed,通常检查之前配置的provisioning文件状态是否为Active,若状态为Invalid,则需删除本地provisioning文件,clean,再次重新下载配置
  • 真机运行成功后,可看到控制端打印出获得到Device Token,以及APP提示时候开启通知


    iOS 推送通知 功能简单实现_第37张图片

    iOS 推送通知 功能简单实现_第38张图片
七.创建通知测试
  • 在百度云推送后台创建一个通知测试,请选择开发模式


    iOS 推送通知 功能简单实现_第39张图片
  • 现在我们就接收到刚才创建的通知了


    iOS 推送通知 功能简单实现_第40张图片
总结:此文虽步骤繁多,但只要理解了苹果的证书机制,配置还是很快的,更多的推送操作本文不再多讲,可以去看各大推送SDK说明文档都是OK的,如有任何问题可邮箱[email protected]联系我

你可能感兴趣的:(iOS 推送通知 功能简单实现)