スキップしてメイン コンテンツに移動

AIR for iOSでAPNsをサポートするためのTips

【追記】AIR 3.4から正式にAPNsによるPush Notificationがサポートされました。この記事で紹介しているやり方だと恐らく不具合が生じる可能性がありますので標準のAPIを使うようにしてください。詳しくはプッシュ通知の使用を見てください。

AIRのアプリでAPNsをサポートする必要があったのでANEで実装してみました。
既に実装した人はいるようなのですが(参考)ソースがなかったので自作しました。

iOSアプリでAPNsを使うには大雑把に以下の実装が必要です。
  • UIApplicationのregisterForRemoteNotificationTypes:メソッドを呼び出す。端末をAPNsに登録します
  • AppDelegateに以下のメソッドを実装
    • application:didRegisterForRemoteNotificationsWithDeviceToken: APNsの登録に成功した場合の処理
    • application:didFailToRegisterForRemoteNotificationsWithError: APNsの登録に失敗した場合の処理
    • application:didFinishLaunchingWithOptions: Remote通知に含まれる情報を読み取ります(アプリ起動時)
    • application:didReceiveRemoteNotification: Remote通知に含まれる情報を読み取ります(アプリ起動中)


これをANEで実装する場合、いろいろ試して下のような形で実装できました。

UIApplicationのregisterForRemoteNotificationTypes: メソッドを呼び出す


普通にANEの関数内で呼び出します。UIApplicationのインスタンスは[UIApplication sharedApplication]で取れます。UIApplicationはSingletonのようです。

UIApplicationDelegateにPush関連のメソッドを実装


こいつが結構くせ者でしてAIRのRuntimeが既にDelegateを実装してしまっているのでむやみに取り替えられません。また、ソースもありません。

いろいろ調べた結果以下のような方法を採りました。
  • 適当なクラスのload()メソッド内でNSNotificationCenterを利用して起動時のイベントを監視するObserverを登録します. このObserverの引数(NSNotification)からapplication:didFinishLaunchingWithOptions:で渡される起動時の引数を取得できます。(参考)
  • APNs関連のメソッド3つについてはAIR Runtimeでは実装してないはずなので上のObserverの中でメソッドを丸ごとオレオレ実装の物にオーバーライドします(参考)。将来AIRでAPNsがサポートされたらおかしな事になるかもしれませんので注意してください。
AIR(Flash)もiOSも始めたばっかりで苦労しましたがいろいろ勉強になりました。

コメント

このブログの人気の投稿

AndroidのBackup Data APIについて調べてみた

どうやってどこにバックアップデータを保存しているのかソースから探してみた。 自分用のメモなので適当です。 検索対象 BackupManager BackupManagerService   バックアップデータの転送路は IBackupTransport でインターフェース化されていてその実装は確認できた限りで2種類ある。 LocalTransport : 文字通り端末のローカルファイルにバックアップする実装。 /cache/backup/(パッケージ名) 以下にバックアップする。  com.google.android.backup/.BackupTransportService :  Android Backup Service 用の実装っぽい。ソースコードは当然ないのでこれ以上追えなかった..

WD20EARSで超簡単なベンチを取ってみる

2TBなのに9000円割れを起こしているWestern DigitalのWD20EARSだが物理セクターが4KiB(4096 byte)で論理セクターを512byteにエミュレートしている代物なのでパーティションの切り方に注意しないとパフォーマンスが低下する。 詳しい内容については Linux Kernel Watch を参照。 要はパーティションの開始位置が8の倍数(8は4096÷512の結果)であればいい。 通常、fdiskなどでパーティションを切っていると以下のように第一パーティションが第63セクターから始まるのでこのケースだとパフォーマンスが落ちます。(63は8で割り切れないため) [root@enterprise ~]# parted /dev/sda GNU Parted 1.8.1 Using /dev/sda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) unit s (parted) p Model: ATA WDC WD20EADS-22R (scsi) Disk /dev/sda: 3907029167s Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 63s 1953134504s 1953134442s primary raid 今回は書き込み性能だけパフォーマンスの増減を確認した。 time dd if=/dev/zero of=test1 bs=128k count=32768 32768+0 records in 32768+0 records out 4294967296 bytes (4.3 GB) copied, 78.149 seconds, 55.0 MB/s real 1m18.721s user 0m0.055s sys 0m8.456s time dd if=/dev