LoginSignup
10
11

More than 5 years have passed since last update.

iOSの64bitビルドではまったこと

Last updated at Posted at 2014-12-05

そもそも始まり。

突然、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

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11