前言:
最近在做远程推送的开发,学习了友盟的远程推送,和网上查阅到的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、必须打开下图的开关
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
这里需要我们输入密码,这个密码也就是我们导出p12文件时的密码,也就是我们上面设置的123。然后,需要我们对生成的pem文件设置一个密语,这里我使用123456,注意:长度必须大于4 需要输入两次确认密码,这里的密码是要告诉我们服务器的。此时又会生成一个PushKey.pem文件
3、把.cer的SSL证书转换为.pem文件,执行命令:
$openssl x509 -in aps_development.cer -inform der -out Push.pem
4、对生成的这两个pem文件再生成一个pem文件,来把证书和私钥整合到一个文件里:
$ cat Push.pem PushKey.pem > unite.pem
下图是完整的文件目录:
5、到了这里吧 unite.pem文件和Pushkey.pem对应的文件的密码告诉给服务器就可以进行远程通知了。前提是后台以及写好代码 你给好证书就可以了。
后记:纯属技术交流,大神勿喷。希望能够给有需要的的人一点帮助,喜欢就点赞,谢谢支持!