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

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も始めたばっかりで苦労しましたがいろいろ勉強になりました。

コメント

このブログの人気の投稿

kickstartで最小限の構成でインストール

最小限の手間でサーバーを配備できるようにしたいのでkickstartインストールをやってみました。 とりあえずの目標としては以下の2点。 最小構成でインストール。必要なdaemonはsshdだけ DAGリポジトリからPuppetをインストール。これは次回以降の自動設定の布石 設定ファイルを作った手順は以下のような感じ 実際に手動で最小限の構成でインストールしてみる インストール後に/root/anaconda-ks.cfgを参考に編集。オプションの詳しい説明は RedHatのマニュアル や ウノウラボさんのblog を参考にした。 編集した設定ファイル(ks.cfg)をhttpでアクセスできる場所にアップロード。自分はDropboxのPublic領域にコピー。これで自前のWebサーバーを準備する手間が省ける VMWare Playerで実際にkickstartインストールできるか確認。思ったとおりにいってない箇所があれば2に戻る。 で、できた設定ファイルが以下のようになります。一部()で囲っている部分は適宜置き換えてください。 install url --url http://ftp.iij.ad.jp/pub/linux/centos/5.5/os/i386 lang ja_JP.UTF-8 keyboard jp106 timezone Asia/Tokyo network --device eth0 --bootproto dhcp --hostname (ホスト名) --noipv6 firewall --enabled --port=22:tcp rootpw --iscrypted (暗号化パスワード) authconfig --enableshadow --enablemd5 selinux --permissive bootloader --location=mbr --driveorder=sda clearpart --all --initlabel --drives=sda part /boot --fstype ext3 --size=100 --ondisk=sda part pv.2 --size=0 --grow --ondisk=sda volgroup VolGroup00 pv....

2017年を雑に振り返ってみた

TwitterのTLを見てて振り返りの記録を残そうと思い立ったので雑に書きました。来年はちゃんと記録を残そう... お仕事面での1年間 某デバイス向けAndroidアプリ開発 年頭から8月までやってました。 モデルチェンジに伴う新機能の実装がメインでした。 もう2015年からやってるアプリなのでそこまで炎上はしませんでしたがなんだかんだで500コミット位コードを書いてました。 去年の開発では難航したためにDroidKaigi 2016の参加を諦めた辛い記憶があったので1,2月は猛烈に開発を進めて何とか参加できたのはいい思い出?かもしれません。 この頃からAndroidアプリのアーキテクチャをちゃんと考えないとなぁということでMVPとかMVVMとかDDDとかについて調べだしました。 ソーシャルメディアの分析サービスっぽいの開発 6月〜11月ぐらいまで TwitterとかInstagramとかソーシャルメディアのツールですがお客さんの要望やイベント対応に合わせて新機能開発をやってました。サービス自体は去年位に始まってたんですが久々にLaravelを触りました。 某アプリのリニューアル開発 9月〜現在進行中 2つの類似するサービス向け(flavorで分けてます)のアプリとそのタブレット対応の開発をしています。フルKotlin & MVVM & Android Clean Architectureの考え方を取り入れて少し今風になりました。(FluxとかAACとかはまだ 現在スマホ版アプリ開発の佳境です。年内リリース目標だったんですが残念ながら年を越しそうです。DroidKaigi 2018までには終わってるといいけどなぁ...(´・ω・`) 発表 potatotips #41で"Android Font Updates"という題目で発表させていただきました。 https://speakerdeck.com/tsuyosh/android-font-updates 映画 34本くらい観てました。印象に残ったのは ザ・コンサルタント ラ・ラ・ランド 3月のライオン 前編&後編 夜は短し歩けよ乙女 メアリと魔女の花 ジョン・ウィック:チャプター2 ...