Just My Life & My Work

會使用手機的人都一定會接觸到推播通知!身為iOS App開發者三年的我,也只大概瞭解其如何實作,現在我要來揭開它詳細的運作原理與架構。這裡也不想花大篇幅描述太多細節,不是很聰明的我就用圖解蘋果推播通知服務 (Apple Push Notification Service)的方式來理解它!

Apple Push Notification Service00003

官方開發者文件已經說得非常清楚,然而會主動去翻來看的人並不多,大概是因為全部都是英文描述,加上十分詳細的說明,讓想要快速上手的人另尋其它網頁。上週幫朋友小A測試iOS後台推播,更進一步知道如何申請推播憑證,在此之前要先申請開發憑證!才知道iOS的推播還真的很「耐人尋味」。想起八月份的百貨公司案子,所使用的後台推播服務是被臉書收購的Parse,它讓我不必自製一個後台就能輕易地把訊息推播到裝置上!

APNS主要有三個角色:

  • Device – 就是你的行動上網裝置 (MID)
  • APNS – Apple 提供連線服務的伺服器 (Gateway)
  • Provider – 需要自行實作的訊息發送者

Apple Push Notification Service00002

發送推播訊息的過程是從Provider到APNS,再從APNS到Device。

實作上需要取得Push Token (Device Toke)來作為辨識的依據,而Push Token是要由Device向APNS索取,接著把索取到的Push Token送到Provider。

Apple Push Notification Service00001

若有實作過iOS推播功能的人,就知道要下指令讓使用者同意接收到推播通知,接著就能從APNS取得Push Token,APNS回應後將讓Device收到Push Token,接著下指令讓Push Token傳到我們的後台Provider。

Apple Push Notification Service00006

從開發者後台申請到的推播憑證有分兩種:

  • Development
  • Production

開發階段就是使用Development憑證,而釋出(Ad Hoc或App Store)階段則使用Production憑證。當時測試時是卡在Production憑證,小A說是因為底層處理方式與Development憑證不同⋯⋯

Apple Push Notification Service00004

Service-to-Device Connection Trust

此圖是Device與APNS相互驗證的過程,開發者不需要實作,但要知道其跟憑證 (Certificate)有關係!

Apple Push Notification Service00005

這圖是Provider與APNS相互驗證的過程(類似Device與APNS),開發者也不需要實作,但要知道其跟憑證 (Certificate)有關係!

推播真是個好玩意兒:P~

參考:

Comments on: "[圖解][iOS] 蘋果推播通知服務 (Apple Push Notification Service)" (8)

  1. […] [圖解][iOS] 蘋果推播通知服務 (Apple Push Notification Service) […]

  2. […] 過去研究過iOS蘋果推播通知服務 (Apple Push Notification Service),照理說取得Push Token應得心應手,然而理論跟實際有時是有些落差。 […]

  3. 請問一下,您的ios 9.1版,可以透過APNS,順利收到推播訊息嗎?

    • 可以收到推播訊息,雖然不是我推的XD~我自己是還沒寫程式跑iOS9.1,既然其他人開發的App,能推到我iOS9.1裝置,自己寫的App推播理應可以!

  4. 請問版大,推播觸發都是由provider發出嗎?例子:當app有分權限的情況下,有一般使用者人按下btn後,管理者會通知到,請問這部分觸發是由provider發出的嗎?因此不需要在token給予provider裡寫code麻,麻煩版大,謝謝.

    Liked by 1 person

    • 據我所知的推播的設計,還是要透過Provider來進行,你說的案例是由User觸發,此時會多一個步驟,就是User點擊按鈕後,App呼叫Provider的API,Provider收到後知道User有推播的請求,於是Provider就把從API取得的資訊變成推播內容送出給特定的Device。那麼分權限就看User所觸發的API是帶怎樣的參數給Provider。

      所以還是要提供token給Provider喔!

      • 謝謝,大大的回覆,想請教 我在測試本地推播後 之後按home鍵到背景程式下,到10秒時上方會出現通知,點通知後會到指定的VC,這段我使用這段寫法,不知道是哪環節出錯,因為那隻vc純code寫的沒有zib或storyboard,先謝謝板大.

        -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
        NSLog(@"通知二");
        NSLog(@"UserInfo:%@",userInfo);
        NSDictionary *apsPayLoad = userInfo[@"aps"];
        NSString *alertString = apsPayLoad[@"alert"];

        //轉頁到hLVC
        HelpListViewController *hLVC =[[HelpListViewController alloc]init];
        UINavigationController *myNavigationController = [[UINavigationController alloc] initWithRootViewController:hLVC];
        [self.window.rootViewController presentViewController:myNavigationController animated:YES completion:nil];
        

        }

        • 可以先試試看一般呈現你那view controller的樣子,說不定是VC沒有畫面。

          確定VC有畫面後,再用推播來觸發條件,這樣較能正確呈現你要的樣子。

隨意留個言吧:)~

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲