デバイストークン
デバイスの識別や保証に使用されるトークンです。
トークンは、デバイスから iOS への登録要求を通じて取得します。
プロバイダーが APNs に接続する際にこの値を APNs 側に渡す必要があります。したがって、デバイスはトークン取得後はそれをプロバイダーと共有しなければなりません。
具体的な実装の流れは以下のようになります。
1. リモート通知のための登録要求
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert)]; ...
APNs を通じて、指定したタイプの通知を受け取るために登録します。登録に成功した場合は後述の application:didRegisterForRemoteNotificationsWithDeviceToken: が呼ばれます。
(逆に失敗した場合は application:didFailToRegisterForRemoteNotificationsWithError: が呼ばれるので、こちらで原因について調べられます。)
2. application:didRegisterForRemoteNotificationsWithDeviceToken: の実装
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"token:%@", deviceToken); }
この段階でデバイストークンが取得されます。(NSData の deviceToken)
この値をプロバイダー側に送ることになります。ただ、今回のように動作を確かめるだけなら、プロバイダーのソースコード(ここでは node アプリの以下の token の部分ですね)にコピペしてしまってももちろん動きます。
var myDevice = new apns.Device(token);
3. application:didReceiveRemoteNotification: の実装
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; NSLog(@"alert:%@", [apsInfo objectForKey:@"alert"]); }
リモート通知を受け取った際に呼ばれるデリゲートメソッドを実装します。通知の内容は NSDictionary に格納されていますので、キーで取得します。
以上が、通知を受け取るための最低限の事前実装になります。後は、node 側から通知を送信すれば、デバイス側で受信されるはずです。
node 側の通知 の実装
通知の実施は以下のような簡単なコードで実行できます。var myDevice = new apns.Device(token); var note = new apns.Notification(); note.badge = 1; note.alert = "From APNs!"; note.device = myDevice; apnsConnection.sendNotification(note);
トラブルシューティング
プッシュ通知の実装がうまくいかない場合についての情報をまとめた、トラブルシューティングのためのページが公開されています。
いくつかのケースについてまとめられていますので、うまくつながらない場合は参照してみてください。結構役に立つと思います。
Troubleshooting Push Notifications
http://developer.apple.com/library/ios/#technotes/tn2265/_index.html
なお、iOS 上でプッシュ通知関連のログをオンにするPersistentConnectionLogging.mobileconfig はページ右上の Companion File からダウンロードできます。(ただ残念ながら iOS6 では動かないっぽいです)
0 件のコメント:
コメントを投稿