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、必须打开下图的开关

远程通知必须先把这个开关打开.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对应的文件的密码告诉给服务器就可以进行远程通知了。前提是后台以及写好代码 你给好证书就可以了。
后记:纯属技术交流,大神勿喷。希望能够给有需要的的人一点帮助,喜欢就点赞,谢谢支持!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 版权声明 本文翻译自:raywenderlich.com 原文作者: Jack Wu 译者: JMStack 转载...
    jmstack阅读 6,953评论 6 30
  • 前言 本文是一篇转载文章,在这一篇实用的文章里,你可以按照上面的步骤实现不借助第三方和服务器端,自己给自己的设备发...
    進无尽阅读 1,657评论 6 6
  • 极光推送: 1.JPush当前版本是1.8.2,其SDK的开发除了正常的功能完善和扩展外也紧随苹果官方的步伐,SD...
    Isspace阅读 6,694评论 10 16
  • “推送通知?喔,不!”。是的,这就是我被叫去实现一个 iOS 应用中的推送通知功能时,脑海中闪过的第一念头,而且我...
    王小宾阅读 2,733评论 0 2
  • Dance like nobody's watching; love like you've never been...
    零12阅读 195评论 0 0