内容简介:在接入极光推送过程中,发现iOS推送,最终只有一条官方渠道,那就是一般开发者都是自己部署服务器,向APNs Server推送。极光推送,是在这中间增加了一步,即开发者自己部署的服务器向极光服务器推送,然后由极光服务器向APNs推送。
在接入极光推送过程中,发现 官网文档 比较老旧了,而且使用的是OC版本,在上架 Match 2.0 的过程中,需要增加推送功能。于是就花了一些精力去研究,并最终改写得到了Swift版本的代码,这里写一个总结,希望能对想使用Swift接入极光推送的朋友们提供一些启发。
iOS推送机制和JPush的意义
APNs
iOS推送,最终只有一条官方渠道,那就是 APNs 。APNs通知是指通过向Apple APNs服务器发送通知,到达iOS设备,由iOS系统提供展现的推送。
极光推送的意义
一般开发者都是自己部署服务器,向APNs Server推送。极光推送,是在这中间增加了一步,即开发者自己部署的服务器向极光服务器推送,然后由极光服务器向APNs推送。
iOS和JPush的关系图(来源极光推送官网)
这样做有什么意义呢?极光认为带来了下列好处:
- 减少开发及维护成本:应用开发者不需要去开发维护自己的推送服务器与 APNs 对接。集成了 JPush iOS SDK 后不必自己维护更新 device token。通过 JPush 的 Web Portal 直接推送,也可以调用 JPush 的 HTTP 协议 API 来完成,开发工作量大大减少。
- 减少运营成本:极光推送支持一次推送,同时向 Android, iOS, WinPhone 三个平台。支持统一的 API 与推送界面。极光推送提供标签、别名绑定机制,以及提供了非常细分的用户分群方式,运营起来非常简单、直观。
- 提供应用内推送:除了使得 APNs 推送更简单,也另外提供应用内消息推送。这在类似于聊天的场景里很有必要。
接入前期准备
设置iOS消息推送证书
接入通知前,需要严格按照此文档配置相关证书。否则将会影响消息推送组件的正常使用。苹果开发最烦人的部分恐怕证书绝对算的上是一个了,关于推送证书的生成,这里推荐 一个博客 ,可以参考。
iOS相比于安卓比较特殊,分为生产环境(上架版)和测试环境(开发版),最后导出极光所需要的.p12文件。导出.p12文件的坑也不少,推荐 这篇博文 ,供参考。
最终在极光控制台上,分别将生产环境和开发环境的两个.p12文件上传,通过验证后,会出现下面截图的样子。
极光平台注册
在极光平台注册你的app,主要需要Bundle ID和开发者认证(企业营业执照)。注册完成后,获得两个重要信息, AppKey ,这两个码是后面一直需要使用的。
极光SDK的导入
导入极光SDK,既可以选择手动,也可以选择使用cocoapods。我使用的是cocoapods,原因很简单,因为如果不想要推送功能了,只需要在podfile里删掉pod ‘JPush’那行就行了。
导入后,一定记得要在XCode里勾上Application Target 的 Capabilities->Push Notifications 选项,否则将无法接受推送。
代码
添加bridge文件
因为极光推送是由OC写成,因此swift的项目里不能直接使用,需要借助桥接文件。只要在项目里新建一个OC文件,XCode就会创建一个xxx-Bridging-Header.h文件,在该文件中加入d代码,就可以使用极光推送SDK了,啊真香!
#import "JPUSHService.h" #ifdef NSFoundationVersionNumber_iOS_9_x_Max #import <UserNotifications/UserNotifications.h> #endif // 如果需要使用idfa功能所需要引入的头文件(可选) #import <AdSupport/AdSupport.h>
添加Delegate
在AppDelegate.swift文件中,让AppDelegate遵从JPUSHRegisterDelegate,后面就可以使用相关代理方法了。
初始化相关代码
初始化APNs和JPush
初始化代码如下
func application(_application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { let entity = JPUSHRegisterEntity() entity.types = 1 << 0 | 1 << 1 | 1 << 2 JPUSHService.register(forRemoteNotificationConfig: entity, delegate: self) let advertisingId = ASIdentifierManager.shared().advertisingIdentifier.uuidString JPUSHService.setup(withOption: launchOptions, appKey: "极光平台给分配的", channel: "App Store", apsForProduction: true, advertisingIdentifier: advertisingId) }
上报device_token
实现JPUSHRegisterDelegate的代理方法,上报device_token。device_token主要是用来帮助推送定位到特定的设备使用的。
func application(_application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { //注册 DeviceToken JPUSHService.registerDeviceToken(deviceToken) }
接收到消息的处理
这个部分为可选,主要是用来实现用户点开通知后的特定动作,比如跳转到特定页面。这就要跟后端开发人员商量好,将特定的消息通过通知的extra选项传递过来,然后手机端在做相应的跳转。
func jpushNotificationCenter(_center: UNUserNotificationCenter!, didReceive response: UNNotificationResponse!, withCompletionHandler completionHandler:(() -> Void)!) { let userInfo = response.notification.request.content.userInfo let page : String = userInfo[AnyHashable("page")] as! String if(page == "home") { //跳转到home页面 }else if(page == "display"){ //跳转到特定页面 } }
根据通知类型跳转到不同页面的效果:
清楚应用ICON角标
当用户点进应用之后,应用角标的通知数目应该清0,否则强迫症患者会被逼疯。
func applicationWillEnterForeground(_application: UIApplication) { application.applicationIconBadgeNumber = 0 application.cancelAllLocalNotifications() }
设置Tags和alias
Tags是区分通知类型的,可以给不同的推送类型打Tag,比如我想接受新题目通知,不想接收点赞通知。而alias一般是有唯一性的,需要根据用户名或手机号这种好区分的东西来分辨。
var outAlias:NSString? var outTags:NSSet? (outAlias, outTags) = self.analyseInput(alias as NSString!, tags: tags) JPUSHService.setTags(outTags as! Set<String>, completion: { (a, b, c) in }, seq: 1) func analyseInput(_alias:NSString!, tags:NSSet!)->(NSString?,NSSet?) { var outAlias:NSString? var outTags:NSSet? if alias.length == 0 { outAlias = nil } else { outAlias = alias } if tags.count == 0 { outTags = nil } else { outTags = tags var emptyStringCount = 0 tags.enumerateObjects({ (tag:Any, stop:UnsafeMutablePointer<ObjCBool>) -> Void in if (tag as AnyObject).isEqual(to: "") { emptyStringCount += 1 } else { emptyStringCount = 0 stop.pointee = true } } as! (Any, UnsafeMutablePointer<ObjCBool>) -> Void) if emptyStringCount == tags.count { outAlias = nil } } return (outAlias,outTags) }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- iOS —— 极光推送和极光IM
- Thinkphp之极光推送
- iOS极光推送原理
- 给APP接入极光推送:后端(PHP)
- 极光推送之Android客户端使用指南--基础篇
- ApiCloud开发SuperWebView——极光推送不能监听通知内容以及不能跳转的问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。