美文网首页SwiftiOS DeveloperiOS && Android
iOS10.0 Swift 远程推送通知教程

iOS10.0 Swift 远程推送通知教程

作者: onehao16 | 来源:发表于2016-10-21 11:38 被阅读6246次

    前言:
    最近在做远程推送的开发,学习了友盟的远程推送,和网上查阅到的OC版本的资料,但是没有查阅到有关swift 远程推送的资料 ,感觉Swift版本的资料有点少。自己就想奉献一点给大家,资料仅供学习交流。

    一、什么是远程推送:
    在联网的情况下,由远程服务器推送给客户端的通知,又称APNs(Apple Push Notification Services)不管应用是打开还是关闭的情况下,都能接收到服务器推送的远程通知在联网状态下,所有苹果设备都会与苹果服务器建立长连接
    二、远程推送的实现原理:
    1.打开App时: 发送UDID和BundleID给APNs加密后返回deviceToken2.获取Token后,App调用接口,将用户身份信息和deviceToken发给服务器,服务器记录3.当推送消息时, 服务器按照用户身份信息找到存储的deviceToken,将消息和deviToken发送给APNs4.苹果的APNs通过deviceToken, 找到指定设备的指定程序, 并将消息推送给用户
    三、实现远程推送功能的前提
    1.真机2.调试阶段的证书
    iOS_development.cer 用于真机调试的证书
    aps_development.cer 用于真机推送调试能的证书
    xxx.mobileprovision 描述文件,记录了能够调试的手机、电脑和程序

    3.发布阶段的证书
    iOS_distribution.cer 用于发布app的证书
    aps.cer 用于发布时,让app有推送功能的证书
    xxx.mobileprovision 描述文件,记录了能够发布app的电脑

    四、废话不说了,直接上代码吧

    1、导入框架 import UserNotifications,并遵守通知相关协议 UNUserNotificationCenterDelegate 
    在AppDelegate的didFinishLaunchingWithOptions 方法中调用
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
       registerAppNotificationSettings(launchOptions)
    }
    

    2、//注册远程通知

    private func registerAppNotificationSettings(launchOptions: [NSObject: AnyObject]?) {
        if #available(iOS 10.0, *) {
            let notifiCenter = UNUserNotificationCenter.currentNotificationCenter()
            notifiCenter.delegate = self
            let types = UNAuthorizationOptions(arrayLiteral: [.Alert, .Badge, .Sound])
            notifiCenter.requestAuthorizationWithOptions(types) { (flag, error) in
                if flag {
                    MPrintLog("iOS request notification success")
                }else{
                    MPrintLog(" iOS 10 request notification fail")
                }
            }
        } else { //iOS8,iOS9注册通知
            let setting = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
            UIApplication.sharedApplication().registerUserNotificationSettings(setting)
        }
        
        UIApplication.sharedApplication().registerForRemoteNotifications()
    }
    

    3、实现iOS10处理通知方法

    //iOS10新增:处理前台收到通知的代理方法
    @available(iOS 10.0, *)
    
    func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void){
        let userInfo = notification.request.content.userInfo
       print("userInfo10:\(userInfo)")
        completionHandler([.Sound,.Alert])
        
    }
    
    //iOS10新增:处理后台点击通知的代理方法
    @available(iOS 10.0, *)
    func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void){
        let userInfo = response.notification.request.content.userInfo
        print("userInfo10:\(userInfo)")
        completionHandler()
    }
    

    4.iOS8和iOS9只需要执行以下方法就好了

    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
        print("收到新消息Active\(userInfo)")
        if application.applicationState == UIApplicationState.Active {
            // 代表从前台接受消息app
        }else{
            // 代表从后台接受消息后进入app
            UIApplication.sharedApplication().applicationIconBadgeNumber = 0
        }
        completionHandler(.NewData)
        
    }
    

    五、注意

    1、一定要先配置好证书
    2、必须打开下图的开关

    远程通知必须先把这个开关打开.png

    3、代理方法必须在AppDelegate下执行否则不会调用
    4、iOS10需要导入框架 并且import UserNotifications,遵守通知相关协议

    -------------------2017-2-13更新----------------------

    后台服务器打算自己做远程推送,这就就需要我们iOS开发人员帮p12文件和远程推送的证书处理好发送给后台。因为我们的服务链接苹果服务器也是需要证书的,但是我们直接生成的证书windows系统(我们一般的服务器都是win系统的)是不识别的,所以我们需要生成一个后缀为pem的带证书带秘钥的文件。

    下面就交给大家如何实现pem文件的生成:
    开发环境远程通知证书处理:
    1、先cd 到你 的证书目录下面,打开终端。
    2、把私钥Push.p12文件转化为.pem文件:(在终端上操作命令)
    $ openssl pkcs12 -nocerts -out PushKey.pem -in 远程推送_developer.p12

    证书生成Pem.png

    这里需要我们输入密码,这个密码也就是我们导出p12文件时的密码,也就是我们上面设置的123。然后,需要我们对生成的pem文件设置一个密语,这里我使用123456,注意:长度必须大于4 需要输入两次确认密码,这里的密码是要告诉我们服务器的。此时又会生成一个PushKey.pem文件

    3、把.cer的SSL证书转换为.pem文件,执行命令:
    $openssl x509 -in aps_development.cer -inform der -out Push.pem

    p12文件处理为Pem.png

    4、对生成的这两个pem文件再生成一个pem文件,来把证书和私钥整合到一个文件里:
    $ cat Push.pem PushKey.pem > unite.pem

    下图是完整的文件目录:

    完整的文件目录.png

    5、到了这里吧 unite.pem文件和Pushkey.pem对应的文件的密码告诉给服务器就可以进行远程通知了。前提是后台以及写好代码 你给好证书就可以了。
    后记:纯属技术交流,大神勿喷。希望能够给有需要的的人一点帮助,喜欢就点赞,谢谢支持!

    相关文章

      网友评论

        本文标题: iOS10.0 Swift 远程推送通知教程

        本文链接:https://www.haomeiwen.com/subject/jjoquttx.html