Firebase 推播服務(Firebase Cloud Messaging FCM)

文章推薦指數: 80 %
投票人數:10人

... 併購Firebase 後所發表的服務之一,而早期Google 的自有的推播服務則叫做Google Cloud Messaging(GCM),相對於GCM 而FCM 最大的進步是能在網頁上的主控台推送通知 ... GetunlimitedaccessOpeninappHomeNotificationsListsStoriesWriteFirebase推播服務(FirebaseCloudMessagingFCM)FirebaseCloudMessaging(FCM)是Goolge在2016併購Firebase後所發表的服務之一,而早期Google的自有的推播服務則叫做GoogleCloudMessaging(GCM),相對於GCM而FCM最大的進步是能在網頁上的主控台推送通知至各種平台中,而這邊我們所要注意的FCM是無法針對單一平台做推送的。

在之前法蘭克也曾經實作過AppleNotification,它的設定流程相對於FCM來得複雜許多且無法跨平台,而這就是我們為什麼要使用FCM來實作推播的理由了。

而為什麼我會說FCM相對於AppleNotification設定較容易,因為FCM在Apple的APNs中間夾了一層介面(interface)來簡化在實作AppleNotification時所必須在後台設定的一大堆繁鎖的動作,but…這並不代表完全不需在Apple後台做設定,還是得在Apple後台產出憑證並上傳至Firebase,這在教學中會提到!另外FCM可直接從後台推送訊息至雙平台的裝置,而AppleNotification不用說相信大家也知道,只能推送到iPhone裝置,也就是說貴司的App如果有雙平台的話,就要請Android的工程師再另外設置,站在公司的角度這是很耗費成本的,如果透過FCM是不需要這麼做的。

以下就讓我們就來看看FCM的推播流程圖。

透過Firebase後台或Firebase的SDK推送訊息,並藉由FirebaseColudMessageing的服務推送到各種平台上前置作業:必須擁有Apple開發者帳號。

必須擁有可以測試的實體裝置,例如iPhone、iPad等等。

建立一個空的專案,並把BundleID記下來因後續會使用的到。

實作流程使用cocoaPods載入FirebaseCloudMessageSDK至Xcode中。

使用Google帳號登入Firebase後台並建立專案。

從Mac的keychain匯出.certSigningRequest(CSR)檔案。

登入Apple開發者後台建立含有遠程通知服務的AppIDs。

配置AppIDs遠程通知的設定。

在Apple開發者後台註冊接收遠程通知的設備(僅測試環境需要設定)。

在Apple開發者後台配置ProvisioningProfiles(僅測試環境需要設定)。

在Firebase後台專案底下匯入步驟7所產生的憑證(.p12檔)。

撰寫接收遠程通知的程式碼,並修改接收到通知訊息時的動作別(分成Swift3和Swift4版本)。

至Firebase後台的Notification測試推播。

1.使用cocoaPods載入GoogleCloudMessageSDK至Xcode中2.使用Google帳號登入Firebase後台並建立專案2.1新增專案2.2建立專案專案名稱:自行命名即可2.3將Firebase加入iOS的應用程式iOS繫結ID=>前置作業第3項的BundleID2.4下載GoogleService-Info.plist後點選「繼續」直到完成所有步驟2.5將GoogleService-Info.plist拖曳至Xcode專案裡3.從keychain匯出.certSigningRequest(CSR)檔案CSR在後面配置AppIDs遠程通知時會須用到。

3.1打開Launchpad搜尋keychain3.2選擇左上鑰匙圈存取→憑證輔助程式→從憑證授權要求憑證3.3填入相關資訊後匯出CSR使用者電子郵件位址:AppleID的email一般名稱:英文名字已將要求:儲存到磁碟備註:該CSR檔案後續會用到,請妥善保存。

4.登入開發者後台創建含有遠程通知服務的AppIDs4.1登入後台的Certificates,Identifiers&Profiles4.2在左列的選單選擇AppIDs並點選「+」4.3註冊AppIDName:任意填入即可BundleID:填入前置作業第3項所產生的BundleIDEnableService:勾選PushNotification4.4點擊下一步至完成設定這邊會看到PushNotification=Configurable代表還沒設定完,暫且先點選Done,等等再繼續設定。

5.配置AppIDs遠程通知的設定5.1點擊剛剛產生的GoogleCloudMessageAppID展開後,點選Edit5.2往下滾找到產生測試時期通知的SSL證書(DevelopmentSSLCertificate),點擊CreateCertificate5.3滾到最下面點擊Continue開始上傳步驟3所產生的CertificateSigningRequest.certSigningRequest(CSR)檔案5.4下載.cer檔案5.5點擊兩下.cer檔案執行安裝到本機5.6確認有無安裝至keychain點擊兩下.cer會自動安裝,待安裝完後會自動打開keychain,這時請檢查.cer是否已安裝。

若沒有自動打開keychain,則可依步驟1的方式查看。

6.在Apple開發者後台註冊接收遠程通知的設備(僅測試環境需要設定)先至後台確認測試的設備有無註冊過,若沒有才要執行註冊的動作,下圖表示已註冊過即可略過該第6大步驟。

備註:通常如果被測試機之前如果有連接Xcode安裝測試App的話,這個步驟要做的事情就都會貼心的幫我們做好了。

6.1開啟Xcode選擇Window→Devices6.2複製XXX的iPhond的Identifier6.3至開發者後台的Devices選單註冊該設備7.在Apple開發者後台配置ProvisioningProfiles(僅測試環境需要設定)7.1在Apple開發者後台選取左側選單點擊ProvisioningProfiles下的Development(開發時期測試用),並點選「+」號7.2選取iOSAppDevelopment後點選Continue7.3選擇剛剛創建的AppID後點選Continue7.4選擇iOS開發者證書,若不確認是哪一個的話,全部勾選亦可7.5選擇測試的設備7.6替Profile命名(任意即可,因只是測試用的)7.7下載GoogleCloudMessageDemo.mobileprovision檔並點擊兩下執行安裝8.在Firebase後台專案底下匯入步驟7所產生的憑證(.p12檔)8.1打開launchpad搜尋keychain8.2點選左側選單憑證→步驟7.7所安裝的憑證檔→右鍵→輸出balala…8.3確認檔案格式為.p12即可儲存8.4點選儲存後系統會詢問是否輸入密碼來保護該檔案,可以直接選擇好來跳過該提示,也可自行輸入密碼來保護,但請牢記該密碼,因在上傳到Firebase時會用到。

8.5登入Firebase後台將匯出的.p12檔上傳,請使用Safari10(含)以上的版本或Chrome開啟,否則會看不到該功能。

Overview旁的齒輪→專案設定→CloudMessage→上傳憑證→選擇步驟8.4產出的.p12檔以上已完成所有的設定了,再來要在Xcode裡加入Firebase所提供的Quickstart專案裡的程式碼了。

9.撰寫接收遠程通知的程式碼,並修改接收到通知訊息時的動作別(分成Swift3和Swift4版本)Swift3Xcode版本(8.0)Firebase/Messaging(4.0.1)用以下程式碼覆蓋掉整個AppDelegate.swift第43~46行=>設定觀察者去監聽Token的變化。

第82~89行=>當取到Token時所會觸發的事件。

第142~157行=>在前景收到推播時會觸發的delegate。

而第156行則是定義在收到通知時要如何呈現的動作,務必將其改成.alert,否則在iOS10的Device上是不會有任何動作的。

第159~173行=>App在關掉的狀態下或App在背景或前景的狀態下,點擊推播訊息時所會觸發的delegate。

在ViewController.swift加入取得token的程式碼,這邊不影響接收通知的動作,只是單純要取得Device的token而己。

第5~9行=>主動的去跟Firebase要DeviceToken。

Swift4Xcode版本(9.3)Firebase/Messaging(5.0.1)用以下程式碼覆蓋掉整個AppDelegate.swift第18~45行=>與Swift3的寫法大同小異。

第69~92行=>iOS10以下的版本接收推播訊息的delegate,又分為從後台推送出觸發的delegate和點擊推播訊息所觸發的delegate,如果要將後台推播的訊息另存起來,該delegate就會派上用場了。

第103~117行=>取得DeviceToken,通常是給後台人員利用各種語言來推播時用的Token,在實務上通常在收到該Token會將它送到後台並且和帳號綁定在一起,以利後續針對單一帳號推播使用。

以上是被動的接收Token。

而有些時侯我們得必須主動的去跟Firebase要DevieToken的,語法如下:InstanceID.instanceID().token()//主動去跟Firebase要DeviceToken第119~152行=>iOS10以上的版本接收推播訊息的delegate,又分為從後台推送出觸發的delegate和點擊推播訊息所觸發的delegate,如果要將後台推播的訊息另存起來,該delegate就會派上用場了。

第156~165行=>iOS10以上用來接收firebasetoken的delegate,該token可用來從firebase後台推送單一裝置時使用。

以上不管用Swift3或Swift4最後都得打開XcodePushNotification的選項選擇專案→TARGETS→Capabilities→ON10.至Firebase後台的Notification測試推播10.1將App安裝至手機上並執行,查看console是否有成功連線至FCM(for使用Swift3語法撰寫推播才有得情境,若是使用Swift4則直接跳到步驟10.2)10.2登入Firebase後台選擇左測選單Notification訊息文字=>通知的內容應用程式=>選擇專案補充說明有時侯推播的內容除了顯示在App端的畫面上讓使用者可以看的到的Title和Body外,如果我們還要額外增加其它的客製化資料,這可以辦得到嗎?答案是可以的,法蘭克就用Postman來演示這個案例。

利用postman推播的格式以上這張圖就是用Postman推播的格式,這個動作跟從Firebase後台推播的動作其實是一樣的,以下就分別說明上圖的各欄位所代表的意義為何。

posturl=>固定的url,也就是Firebase推播的Server。

registration_ids=>FirebaseToken。

data=>該key值下的物件可以放客製化的欄位,這邊法蘭克放了一個planId,主要是要用來識別,如果該欄位不為空的話,使用者點擊推播訊息的時侯要進到特定的頁面。

notification=>顯示在使用者手機上的推播Title和Body。

接下來要演示如何在App端取得Data的資料,而我會在使用者點擊推播訊息所會觸發的userNotificationCenter(_:didReceive:withCompletionHandler:)delegate裡來取得由postman送出的資料。

在userNotificationCenter(_:didReceive:withCompletionHandler:)裡加入此段邏輯第2行=>印出由postman送出的整包資料。

第3行=>取出data裡的資料,這裡比較特別的是資料型態為AnyHashable。

第4行=>console如下圖所示,如果是AnyHashable型態的資料,要用第3行演示的方法取出。

console呈現由postman送出的資料結論該範例的環境是在Development所演示的,若是App是透過TestFlight或者是上架到正式區,請務必記得將Firebase上的.p12置換成ProductionSSLCertificate,如果不想用置換的方式,Firebase上也可並存Development和Production的憑證,從下圖中上傳並下載,最後從keychain匯出(可參考第5點和第8點)。

FirebaseToken是用來從Firebase後台推送單一裝置用;而DeviceToken通常是給後台人員利用各種語言來推播時用的Token,在實務上通常在收到該Token會將它送到後台並且和帳號綁定在一起,以利後續針對單一帳號推播使用。

DeviceToken除了可以被動的接收外,我們也可以主動的去取得。

因為在特定的情境下就得必須這麼做,例如:App有登入+推播的機制下,我們就常常需要將帳號和DeviceToken綁定在一起。

此時如果application(_:didRegisterForRemoteNotificationsWithDeviceToken:)沒有取得Token,我們就得主動的去取得DeviceToken。

如果您喜歡我的文章,請多按幾下「拍手」給我鼓勵,或是按「follow」讓我持續提供好文章給您。

參考資料FirebaseNotifications|FirebaseNotificationsintegratescloselywithFirebaseAnalytics,allowingyoutotargetnotificationsbycustomaudience.Also…firebase.google.comfirebase/quickstart-iosquickstart-ios-FirebaseQuickstartSamplesforiOSgithub.comMorefrom法蘭克的iOS世界FollowLovepodcastsoraudiobooks?Learnonthegowithournewapp.TryKnowableAboutHelpTermsPrivacyGettheMediumappGetstarted法蘭克的iOS世界960FollowersFollowHelpStatusWritersBlogCareersPrivacyTermsAboutKnowable



請為這篇文章評分?