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

前言:
最近在做远程推送的开发,学习了友盟的远程推送,和网上查阅到的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、必须打开下图的开关

iOS10.0 Swift 远程推送通知教程_第1张图片
远程通知必须先把这个开关打开.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

下图是完整的文件目录:

iOS10.0 Swift 远程推送通知教程_第2张图片
完整的文件目录.png

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

你可能感兴趣的:(iOS10.0 Swift 远程推送通知教程)