推播服务是App的一种与使用者互动的特色服务,使用者可以透过推播随时随地与App进行互动。App推播功能有许多的种类,有本地推播、远程推播、 App内推播等等......,接收推播的处理方式有单纯的开启App、跳转到指定页面、接收使者输入并处理等各式各样的应用。本文聚焦在远程推播的实作以及点击推播讯息后,在指定的页面程式中取得推播内容,以利工程师对推播内容做后续的处理。
本文需求的场景是:业主有一套以多人填製表单为主要功能的网站系统,网站有发送讯息到Firebase的能力,在前一人完成表单添置后,需传送到下一个使用者做处理。
网站系统送出表单后,系统同步发送推播讯息到下一个使用者的App,此推播讯息内容有该表单的网址,当被通知者接收到推播讯息,点击推播后,能够直接开启App,依推播讯息内容中的网址跳转至该表单。手机的App是web base的形式,为了完成这项功能,我们把需要在App上循序执行下列步骤:
建立接收Firebase推播的接口

Firebase提供iOS相对应的函式库,让iOS程式设计师使用他们提供的云端功能,设计师只要在App中引入就可以了,网址是:https://github.com/firebase/firebase-ios-sdk
当sdk安装完成后,回到专案的AppDelegate.swift档案中,引入FirebaseCore以及FirebaseMessaging 这两个函式库,并且在 didFinishLaunchingWithOptions (App启动初始化)初始化的程式码为:
FirebaseApp.configure()
UNUserNotificationCenter.current().delegate = self
Messaging.massaging().delegate = self
然后,在使用者第一次登入App时,要请求接收推播权限,程式码如下:
设定接收推播讯息的方式,此处是可接收弹跳视窗、文字内容及声音
let authOptons: UNAuthorizationOptions = [.alert, .badge, .sound]
利用UNUserNotificitionCenter方法请求允许开启通知通道
UNUserNotificitionCenter.current().requestAuthorization(options: authOptions, completionHandler:{_, _, in})
将App注册可接收推播讯息
Application.registerForRemoteNotifications()
开启App的Push Notification及背景服务功能
接下来要开启App的推播功能,这个动作要在App层级做设定,首先在左边的专案管理页面点击专案根目录,此时右边汇出先专案的设定画面,选择Sign&Capabilities页籤,按下左上角的Capability,会弹出此专案的功能扩展选择器,键入 Push 可找到 Push Notifications图案,点击后,XCode就会把此扩充功能加入到此专案中。
同样的方式,我们在功能扩展选择器中,键入 Back 可找到 Background Modes图案,也把他加入专案后,将 Background fetch、Remote Notifications、Background processing打勾。表示App有某些工作必须在背景执行。
最后一步是处理App与Firebase之间验证机制,将页籤切换到Info,下方有个URL Type(0)的选项,将它展开后会看到 URL Schemes,在此处要输入Firebase专案的验证代号,开启GoogleService-Info档案,找到第3行 REVERSED_CLIENT_ID,将其value複製贴上到 URL Schemes 的文字匡内,这样App的设定就完成了
扩展AppDelegate的方法
在iOS上执行Firebase推播,须在AppDelegate类别中继承UNUserNotificationCenterDelegate并实作3个方法以及MessagingDelegate中实作2个方法。
首先我们看到UNUserNotificationCenterDelegate要实作的方法,推播讯息送达App时,会有3种情况:
第一种是App尚未开启(关闭)
第二种是App开启正在使用时(前景)
第三种是App并未关闭在背景运行的时候(背景)
这三种情况收到推播讯息后,要如何对讯息做处理,就在这个类别中设计一些方法来告诉App。
首先我们处理App未开启的情况:
App未开启的情况,建立application方法,并以 didReceiveRemteNotification来处理 userInfo物件,并指定本方法为非同步处理,方法要回传UIBackgroundResult物件(如图6)。userInfo是APN发送过来App的讯息物件,结构如下:
userInfo : [
AnyHashable("google.c.a.ts"): 1671757895, AnyHashable("google.c.a.c_id"): 4556509826510363819, AnyHashable("gcm.n.e"): 1,
AnyHashable("google.c.a.e"): 1, AnyHashable("gcm.message_id"): 1671757895087640,
AnyHashable("google.c.a.c_l"): 测试, AnyHashable("google.c.sender.id"): 568638775392,
AnyHashable("aps"): {
alert = {
body = "这是测试讯息";
title = "20221223测试讯息";
};
"mutable-content" = 1;
},
AnyHashable("google.c.a.udt"): 0, AnyHashable("google.c.fid"): ftDzBG4L6UGKhlh9GZRouz
]
在这个结构中,常用的资讯有:通知编号(gcm.message_id)、通知名称(google.c.a.c_l)、讯息本体(aps)、讯息通知视窗(alert),其中通知视窗内的讯息包含讯息内容(body)、讯息标题(title),因为本案例需要讯息中的body内包含的网址资讯,我们要透过三层来撷取。(如图6)
撷取到body字串后,要把个字串从Delegate传到指定的viewController中,可利用
NotificationCenter.default.post(name: Notification.Name("viewController对应的参数名称"), object: 要传过去的字串, userInfo: 讯息结构名称)
完成讯息内文传递到相对应的viewController的变数。
App在背景的情况,建立application方法,并以 didReceive来处理 userInfo物件,并指定本方法为非同步处理。因本方法中已经有宣告UNNotificationResponse物件(respons变数)来接收userInfo,因此,可以使用response.
notification.request.content.userInfo取得userInfo物件,或是response.notification.request.content.title
取得title字串,response.notification.request.content.body取得body字串(如图7)。
撷取到body字串后,要把个字串从Delegate传到指定的viewController中。
与未开启的情况相同,可利用
NotificationCenter.default.post(name: Notification.Name("viewController对应的参数名称"), object: 要传过去的字串, userInfo: 讯息结构名称)
完成讯息内文传递到相对应的viewController的变数。
App在开启的情况,建立application方法,并以 willPresent来处理 userInfo物件,并指定本方法为非同步处理。因本方法中已经有宣告UNNotification物件(notification变数)来接收userInfo,因此,可以使用notification.
notification.request.content.userInfo取得userInfo物件,或是notification.request.content.title
取得title字串,notification.request.content.body取得body字串(如图7)。
撷取到body字串后,要把个字串从Delegate传到指定的viewController中。
与未开启的情况相同,可利用
NotificationCenter.default.post(name: Notification.Name("viewController对应的参数名称"), object: 要传过去的字串, userInfo: 讯息结构名称)
完成讯息内文传递到相对应的viewController的变数。
在viewController中接收通播讯息内容
推播通知是即时产生的内容,这些内容并不是长期存在变数中的,因此,接收推播内容的变数不会在主要执行序中操作,也不是在App的生命週期中,所以必须在App的生命週期外部建立一个监听机制,并将接收推播讯息后要执行的工作另外写在该函式中。(如图9)
宣告@objc func notificationArrived(notification: Notification)方法,用以处理推播讯息抵达的操作,本案例的需求是:推播内容是一串网址,当取得推播内容后,将webview物件能跳转到该网址的页面。所以把跳转页面的操作写成function并在接收到讯息后呼叫它。
在指定的viewController中宣告一个全域变数用来接收推播讯息的字串,这个全域变数的型别要跟前一节在AppDelegate中的三个方法中 “NotificationCenter.default.post(name:
Notification.Name("viewController对应的参数名称"), object: 要传过去的字串, userInfo: 讯息结构名称)”的描述的object引数相同(如图10),如此一来,viewController就能在@objc func notificationArrived(notification: Notification)的notification.object取得推播的内容。
以上就是本次iOS推播与web view跳转的实作笔记,希望对大家有帮助。