2014年9月9日 星期二

無聲推播(Silent Push Notification)

  • 先在你的.plist中加入Required background modes,再把item設定為App downloads content in response to push notifications

  • 在appDelegate.m中實作下面的function(只有iOS7.0以上才有),這個function會在顯示之前被呼叫。
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler{    //Success    handler(UIBackgroundFetchResultNewData);
    • 在appDelegate的didFinishLaunchingWithOptions中註冊通知。

    // register for types of remote notifications
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeNewsstandContentAvailability|
     UIRemoteNotificationTypeBadge |
     UIRemoteNotificationTypeSound |
     UIRemoteNotificationTypeAlert)];


    Server推送的資料格式
    有聲推播的資料格式:{"aps":{"alert":"Testing.. (9)","badge":1,"sound":"default"}}
    無聲推播的資料格式:{"aps":{"content-available":1,"sound":"","say":"hello"}}
        其中,"content-avilable":1就是無聲推播的關鍵key。

    收到無聲推播之後,你可以把無聲推播的userInfo放在Local推播中再發出去,降子你可以在didReceiveLocalNotification中收到資訊。

    13 則留言:

    1. 您好,想請教,推播只有APP在背景(background mode)才會跳Alert view,如果使用無聲推播,再發出去... 可以讓APP在前景跳出AlertView嗎? 謝謝。

      回覆刪除
    2. 可以,其實在概念上只要想說這裡是一個callback trigger,接到推播之後的處理都由你自己來寫,你可以判斷目前是在foreground或是background來決定推出來或是只要秀AlertView。

      比較符合Design Pattern的作法會是將訊息處理成message物件,然後另外寫一個class專門處理這個物件,降子是比較好的寫法,方便後續的修改與維護。

      回覆刪除
      回覆
      1. 我後來有找一些資料,幾乎所有的資料都是說APP只有在背景(background)的情況下才能收推播(remote push notification),如果是在foreground,好像推播訊息會到ios 底層,但不會再傳到APP,不知道我理解是否有誤?

        所以在前景的情況下,是不可能做到收推播並且跳出Alert ?

        刪除
    3. 你說的應該是iOS7以前的有聲推播的方式,那是直接由server來控制app在背景時要推出什麼訊息或是聲音。

      這裡說的無聲推播沒有這個限制,即使在foreground仍然可以收到server推出來的訊息。

      回覆刪除
      回覆
      1. 測試OK,不管有聲推播或是無聲推播,都可以在前景收到。
        在ios 7之後。

        刪除
      2. 是啊,敞公司的App就是走這樣的機制,謝謝你的回覆~

        刪除
      3. ios 7 之前前景確定是不行的,所以敝公司... 在前景才逼不得已用SIP Message... @@"~

        刪除
      4. 哈哈哈,貴公司是做VoIP的App嗎?

        刪除
      5. 原本的主力是VoIP, audio / video call, and sip server, DB, web .... etc.
        目前朝game發展...
        VoIP是條不歸路.....

        刪除
      6. 這麼沉重的嘆息~
        因為擋在前面的大魔王太強大了嗎........skype

        刪除
      7. 可以詳細分享這段心路歷程嗎XDD

        刪除
    4. Thanks, 我再試試看。
      Apple寫的文件沒有很清楚指出前景可不可以收到無聲推播。

      https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW22

      回覆刪除
    5. 請問無聲推撥是一定要 app 在背景或前景才能處理嗎?如果 app 沒有被執行是不是就石沈大海了?

      回覆刪除