この記事はSpeee Advent Calendar 17日目の記事です。
#App Transferについて
appleのDeveloperアカウント間でアプリのひも付けを切り替える機能です
個人開発でもアプリ売却をする際に必要になります
App Transferの作業自体は他の記事に譲るとして今回は「App Transfer後」に起きる問題の話。
#push通知が届かない?
iOSのpush通知はアプリのbundle idで識別されています。
App Transferをした際には一見bundle idは変わっていないように見えますが、
実はappleは内部的に
Prefix(Developerアカウントを元にしたHash値) + bundle id
という形式で識別しています。
##解決方法
App Transfer後に、新しいDeveloperアカウントの方でサーバ側のpush通知証明書を作り直しサーバに上げ直せば解決します。
#App Transfer後起動すると新規ユーザーになる???
実はApp Transferをしたとき(そしてその時にのみ)過去のKeychainから値を取れなくなるという仕様があります
こちらも上述のbundle idの仕様同様に
Keychainの情報がアプリのDeveloperアカウントに紐付いているために起こる問題です。
そしてREST APIを使ったiosアプリにおいて
「loginIDをKeyChainに保存する」実装をしていると、このパターンにハマります。
##解決方法
あらかじめKeyChainが消える可能性がある前提で設計します
- KeyChainとNSUserDefaultsの両方に保存する
- どちらか空でない方を優先してloginIdとして使う
- 片方空なら上書きしておく
- 両方ともに空なら新規ユーザーとして登録処理
これで以下のような動きになります。
- アプリ削除後再インストールした場合にはKeyChainに値が入っているのでログイン可能
- App Transfer時にはNSUserDefaultsから値が取れるのでそちらを使ってログイン可能
- アプリ削除しているあいだにApp Transferが発生し、その後再度インストールした場合は新規ユーザーになる(引き継ぎできないパターン)
こちらの問題については
問題のある実装ですでにアプリリリースしていると
アップデート以外に解決する方法がほぼ無いように思います。
申請前にしっかり確認して後々困らないようにしたいところですね。。。
#参考
http://www.toyship.org/archives/1680
bundle idとPrefixの経緯について詳しいです