Match开发笔记 肆 极光推送接入指南(Swift版)

栏目: Swift · 发布时间: 6年前

内容简介:在接入极光推送过程中,发现iOS推送,最终只有一条官方渠道,那就是一般开发者都是自己部署服务器,向APNs Server推送。极光推送,是在这中间增加了一步,即开发者自己部署的服务器向极光服务器推送,然后由极光服务器向APNs推送。

在接入极光推送过程中,发现 官网文档 比较老旧了,而且使用的是OC版本,在上架 Match 2.0 的过程中,需要增加推送功能。于是就花了一些精力去研究,并最终改写得到了Swift版本的代码,这里写一个总结,希望能对想使用Swift接入极光推送的朋友们提供一些启发。

iOS推送机制和JPush的意义

APNs

iOS推送,最终只有一条官方渠道,那就是 APNs 。APNs通知是指通过向Apple APNs服务器发送通知,到达iOS设备,由iOS系统提供展现的推送。

极光推送的意义

一般开发者都是自己部署服务器,向APNs Server推送。极光推送,是在这中间增加了一步,即开发者自己部署的服务器向极光服务器推送,然后由极光服务器向APNs推送。

Match开发笔记 肆 极光推送接入指南(Swift版)

iOS和JPush的关系图(来源极光推送官网)

这样做有什么意义呢?极光认为带来了下列好处:

  1. 减少开发及维护成本:应用开发者不需要去开发维护自己的推送服务器与 APNs 对接。集成了 JPush iOS SDK 后不必自己维护更新 device token。通过 JPush 的 Web Portal 直接推送,也可以调用 JPush 的 HTTP 协议 API 来完成,开发工作量大大减少。
  2. 减少运营成本:极光推送支持一次推送,同时向 Android, iOS, WinPhone 三个平台。支持统一的 API 与推送界面。极光推送提供标签、别名绑定机制,以及提供了非常细分的用户分群方式,运营起来非常简单、直观。
  3. 提供应用内推送:除了使得 APNs 推送更简单,也另外提供应用内消息推送。这在类似于聊天的场景里很有必要。

接入前期准备

设置iOS消息推送证书

接入通知前,需要严格按照此文档配置相关证书。否则将会影响消息推送组件的正常使用。苹果开发最烦人的部分恐怕证书绝对算的上是一个了,关于推送证书的生成,这里推荐 一个博客 ,可以参考。

iOS相比于安卓比较特殊,分为生产环境(上架版)和测试环境(开发版),最后导出极光所需要的.p12文件。导出.p12文件的坑也不少,推荐 这篇博文 ,供参考。

最终在极光控制台上,分别将生产环境和开发环境的两个.p12文件上传,通过验证后,会出现下面截图的样子。

Match开发笔记 肆 极光推送接入指南(Swift版)

极光平台注册

在极光平台注册你的app,主要需要Bundle ID和开发者认证(企业营业执照)。注册完成后,获得两个重要信息, AppKey ,这两个码是后面一直需要使用的。

极光SDK的导入

导入极光SDK,既可以选择手动,也可以选择使用cocoapods。我使用的是cocoapods,原因很简单,因为如果不想要推送功能了,只需要在podfile里删掉pod ‘JPush’那行就行了。

导入后,一定记得要在XCode里勾上Application Target 的 Capabilities->Push Notifications 选项,否则将无法接受推送。

Match开发笔记 肆 极光推送接入指南(Swift版)

代码

添加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"){
           //跳转到特定页面
           }
           
       }

根据通知类型跳转到不同页面的效果:

Match开发笔记 肆 极光推送接入指南(Swift版)

清楚应用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)
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法与数据结构

算法与数据结构

张乃孝 / 高等教育出版社 / 2006-1 / 31.00元

《算法与数据结构:C语言描述(第2版)》以数据结构为主线,算法为辅线组织教学内容。全书共分10章:绪论、线性表、字符串、栈与队列、二叉树与树、集合与字典、高级字典结构、排序、图和算法分析与设计。《算法与数据结构:C语言描述(第2版)》体系完整,概念清楚,内容充实,取材适当。第一版被列入“面向21世纪课程教材”,2004年被评为“北京市高等教育精品教材”,第二版被列入普通高等教育“十一五”国家级规划......一起来看看 《算法与数据结构》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换