iOSのアプリを作っている。
iOSは全体的に好感触で、Objective-Cさえ気にしなければ、あとはたいていなんとかなる。例外はプッシュ通知まわりで、これを作ったのは日本のITゼネコンかさもなければジョブズの愛人にちがいない。
どうひどいか。
・「一日待つか、端末の日付を進めて再起動しろ」。しかし実際はさらに悪く、端末をiTunesで「復元」するしかない
プッシュ通知を使うアプリの初回起動時(正確には、最初にデバイストークンを要求したとき)のみ出るダイアログ(プッシュ通知をアプリに許可するかどうかをユーザに尋ねる)を出すには、端末をiTunesで「復元」するか、アプリを削除して一日待つか、待てなければ端末の日付を進めて再起動(電源をオフ→オン)するしかない。
……とAppleのドキュメントには書いてあるのだが、実際には後者のとおりにしても、問題のダイアログは出てこない(iOS 5.0.1)。一日待つのは問題外なので、つまるところ「復元」しかない。
・設定で3種類の通知(バッジ・アラーム・メッセージ)を全部オフにすると、アプリに渡すカスタムペイロードだけの通知が黙って握りつぶされる
画面上では、バッジとアラームとメッセージをそれぞれオフにする、という形になっているのに、バッジともアラームともメッセージとも関係のない通知までが黙って握りつぶされる。
・プッシュ通知を一度も許可したことがない場合と、あとで設定でいったん許可してから全部オフにした場合とでは、挙動が異なる
つまり、iOSは各アプリについて外から見えないフラグを持っていて、それはプッシュ通知を一度も許可したことがない場合にだけ立っている。
どう違うかというと、そのフラグが立っているときはregisterForRemoteNotificationTypesを呼んでもコールバック(didRegisterForRemoteNotificationsWithDeviceToken)が起こらない。
「頭のいいやつほどうたぐりぶかい…」とは『ワイルド7』の名言だが、iOSのプッシュ通知を使うときには猛烈に頭がよくなる必要がある。私はそこまで頭がよくないのですでに2回リジェクトされた。