そもそも始まり。
突然、Push通知が受けられなくなった。。iOS7でもiOS8でも同じだしなあ。。5s,6でも同じだし。。
証明書の有効期限が切れたかなとおもって調べてみる。。が、期限はまだ切れてない。APNSのエラーコードを見てもらうと、8。
これは、invalid tokenエラーなので、端末の方にやってくるtokenを調べてみる。
didRegisterForRemoteNotificationsWithDeviceToken
長い。。。。
でbreak point張ってみてみると、なにやら0が並ぶ文字列になってる。あれあれ?provisioning profileが壊れたのかと思って作り直してみても変わらない。。
しかも、毎回違うtokenになってるし、、
ふとtokenの文字列を生成してるコードを見てみた。
const unsigned long *tokenData = deviceToken.bytes;
NSString *tokenString = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x", ntohl(tokenData[0]), ntohl(tokenData[1]), ntohl(tokenData[2]), ntohl(tokenData[3]), ntohl(tokenData[4]), ntohl(tokenData[5]), ntohl(tokenData[6]), ntohl(tokenData[7])];
もう、かれこれ何年使ってるコードだろうか、、全く疑いもなかったんだけども、、たしか昨日ライブラリ一式が準備できたので64bitビルドにしてみたのだった。。。
そう、ntohl()だよね。
どうやら最近はdescriptionをつかって↓こうやるのが正解らしい。(え、いまさら?)
NSString * tokenString = [deviceToken description];
tokenString = [tokenString stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
tokenString = [tokenString stringByReplacingOccurrencesOfString:@" " withString:@""];
すごい時間を無駄にしたけど、、いい勉強になった。無事にpushが来ることが確認できました。(もっと早く気付けよって感じだけども)
というわけで、似たようなコードを書いてる人が多いと思う。気をつけてください。
追記:
こんなドキュメントがAppleから配布されてました。
Cocoa Touch 64ビット移行ガイド
https://developer.apple.com/jp/documentation/CocoaTouch64BitGuide.pdf