2012年10月17日 星期三

Adobe AIR 與Push Notifications

為大家介紹Adobe AIR 原生支援的Push Notifications 功能, 配合apns-php 伺服器發出訊息給iOS 裝置.

簡單測試需要的準備:
  • Adobe AIR 3.4 或以上SDK (安裝SDK 於Flash Builder 請參考)
  • 一個iOS 裝置 (不能以XCode Simulator 來取代)
  • 需要.p12, .mobileprovision 與.pem 檔 (製作包含Push Notifications 功能請參考)
  • 一個執行Push Notification Provider 的伺服器, 我們可以使用apns-php


Push Notifications 的運作原理:

  • 使用Adobe AIR 提供的介面(RemoteNotifier) 並執行訂閱(subscribe), 取得一個Device Token (這是每個iOS 裝置獨一無異的記號)
  • 把Device Token 提交給伺服器記下
  • 利用Push Notification Provider 發放訊息給這些Device Token
  • 這個iOS 裝置會收到Push Notification
Push Notifications 基本工作流程


Adobe AIR 提供以下三種Push Notification 提示:
  • NotificationStyle.ALERT - 在收到通知時顯示警告方塊的通知
  • NotificationStyle.BADGE - 收到通知時會以數字/影像更新應用程式圖示的通知
  • NotificationStyle.SOUND - 在收到通知時播放聲音的通知
Adobe AIR 在iOS 接收Push Notifications

在Adobe AIR 程式編寫, 提供一個按鈕給用戶按下(clickHandler), 取得iOS 裝置的Device Token:
private function clickHandler(event:MouseEvent):void{
  trace("clickHandler: " + RemoteNotifier.supportedNotificationStyles.length);
  myTxt.appendText("clickHandler: " + RemoteNotifier.supportedNotificationStyles.length+"\n");
  
  if ( RemoteNotifier.supportedNotificationStyles.length > 0)
  {
    var preferredNotificationStyles:Vector.<string> = new Vector.<string>;
    
    preferredNotificationStyles.push(NotificationStyle.ALERT);
    preferredNotificationStyles.push(NotificationStyle.SOUND);
    preferredNotificationStyles.push(NotificationStyle.BADGE);
    
    var subscribeOptions:RemoteNotifierSubscribeOptions = new RemoteNotifierSubscribeOptions();
    subscribeOptions.notificationStyles = preferredNotificationStyles;
    
    rn = new RemoteNotifier();
    
    rn.addEventListener(RemoteNotificationEvent.TOKEN, sendDeviceTokenToServer);
    rn.addEventListener(StatusEvent.STATUS, subscriptionFailureCallback);
    
    rn.subscribe(subscribeOptions);
  }
}
protected function subscriptionFailureCallback(event:StatusEvent):void
{
  trace("Received Status event for registrationFailure with code:" + event.code + " and level:" + event.level + "\n");
  myTxt.appendText("Received Status event for registrationFailure with code:" + event.code + " and level:" + event.level + "\n");
}
protected function sendDeviceTokenToServer(event:RemoteNotificationEvent):void
{
  trace("Received " + event.type + " with tokenString:" + event.tokenId + "\n");
  myTxt.appendText("Received " + event.type + " with tokenString:" + event.tokenId + "\n");
}

在Adobe AIR 程式發佈設定:
  • Certificate 和Provisioning file 需要使用包含Push Notifications 功能的.p12 和 .mobileprovision 檔
  • 在XML 設定檔加入Entitlements 設定:
    <iPhone>
      <Entitlements><![CDATA[
        <key>get-task-allow</key>
        <true/>
        <key>aps-environment</key>
        <string>development</string>
        <key>keychain-access-groups</key>
        <array>
          <string>KEYCHAIN_ACCESS_GROUP</string>
        </array>
      ]]></Entitlements>
    </iPhone>
  • 在Flex Compiler > Additional compilder arguments: 更改成:
    -locale en_US -swf-version=17

架設apns-php 伺服器後, 我們更改sample_push.php 的內容作為發訊測試:
  • 更改.pem 檔名稱, 並把.pem 檔案複製至與sample_push.php 同一資料夾內
  • 加入iOS 裝置的Device Token
更改sample_push.php 內容

當執行sample_push.php 後, 測試對像的iOS 裝置會接收到Push Notification. 大家可以 [下載] 範例試試看.

參考資料: http://blogs.adobe.com/airodynamics/2012/05/29/push-notifications-support-in-ios/

9 則留言:

匿名 提到...

鴨道比大大
想請教一下 sample_push.php 中第38行
$push->setRootCertificationAuthority('entrust_root_certification_authority.pem');
這行是不需要的嗎?
看了 apns-php 的說明不是很懂 "Verify peer using Entrust Root Certification Authority" 是做啥的...
我看您的截圖是remark掉了 這樣還是可以 works 嗎?

Turtler 提到...

這個我確實沒有深入研究,只知道把第38 行關掉,就可以正常運作 :P

匿名 提到...

請問大大!
執行的時候出現:
1046: Type was not found or was not a compile-time constant: RemoteNotificationEvent.

該怎麼解決><

Turtler 提到...

RemoteNotificationEvent 需要在Adobe AIR 3.4 或以上的SDK 運行.

試試更新最新的SDK, 參考:
http://flash-adobe.blogspot.hk/2011/07/adobe-air-27-flash-builder-45.html

匿名 提到...

大大!
請問你是否知道該怎麼顯示android
收到通知時顯示警告方塊的通知!

Turtler 提到...

Android 接收通知.
與iOS 原理相近, 但不是會是同一個伺服器(ApnsPHP) 發佈通知.
可以在google 找尋PhpMQTTClient 資料.

匿名 提到...

你好,我只要抓divice token,是不是只要你打的那一段clickHandler就行了,因為我怎麼發佈到手機抓就是抓不到divice token

Turtler 提到...

在myTxt 中, 會看到錯誤訊息嗎?
沒有看到event.tokenId?

匿名 提到...

沒有,抓出的長度是3就只會顯示clickHandler:3, 後是用air 3.6, 怎麼抓都沒值,所以想尋問一下,是按下clickHandler, 就會在mytxt內出現token是吧!