アプリのアカウント移行について

# アプリのアカウント移行
例えば法人化による個人アカウント→法人アカウント への移行や、アプリの売却などがあった場合に必ず実行する必要がある内容となります。
ただしあまり頻度も高くないことから、情報があまり得られません。つらいです。
そのためせっかくなので今回アプリのアカウント移行を実際に行ってハマったポイントをまとめておきたいと思います。

## 前提
アカウントA:移行元アカウント
アカウントB:移行先アカウント
とします。
アカウントAでリリースされているアプリをアカウントBに移したい、っていう状況ですね。

またこちらは2015年7月現在の情報のため、一部情報が古くて内容が変わっている可能性がありますが、ご了承ください。


# iOS
アカウント移行はプラットフォームの機能として用意されています。
公式の[リファレンス](https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/TransferringAndDeletingApps.html)はこちら

### 移行処理の流れ
1. アカウントA) アカウントBのTeamIdを確認しておく
2. アカウントA) アプリごとに過去の情報・カタログ情報をとっておく
2. アカウントA) マイアプリからアプリを選択して`TransferApp`(一部のステータス(WaitingForReview等)では移行できないので注意)
3. アカウントA) 必要事項記入して移行ボタン
4. アカウントB) iTunesConnectで移行承認依頼がくる。(TeamAgentでログインしないと見れないので注意)
5. 承認をポチ
6. だいたい1時間〜数時間でAppStoreでのアプリの情報が書き換わる

## 困ったところ
### Passbook, iCloudエンタイトルメント
過去に1回でも上記を含んだアプリは(実際使用しているかどうかは別として)アカウント移行をできません。

そのため、「あ…ありのまま 今　起こった事を話すぜ!エンタイトルメント全く使用してないと思っていたら、なぜか使用したことになっていたんだッ・・・!」(ONになってた)って場合に

* DevCenterのAppIDの使っているエンタイトルメントをOFF
* ビルド時のXCode上のCapabilityをOFF

などをあとからして全く痕跡をなくしても移行できないです。

対応としては

1. アカウントB側でbundleIDを変更して内容は同等のアプリをリリース
1. アカウントA側のアプリからアカウントB側のアプリへデータ引き継ぎを促す

が現実解と思われます。(データ引き継ぎ機能がなかったら終了・・)
ただしアカウントBでリリース == 同アプリがしばらく2つストアに並ぶ
ので、移行のためにリリースするんだよってのをAppleの申請時に伝えないとRejectされるリスクがありそうです。申請メモにその内容を追記すれば問題なさそうです。
また同一のアプリ名(ストア表示名)も使えないので、サブタイトルをつけるなりなんなりしないとBアカウントでアプリを登録できません。


また実際にBアカウントでアプリをリリースした場合、bundleIDが異なるため同じ端末に同時にインストール可能です。そのためアイコンやアプリ名(ホーム表示名)も工夫しないとユーザーに余計な混乱を招く可能性がありますね。

### KeychainAccess
KeychainAccessはセキュアにしたい情報を入れるときによく使われますが、これはアプリのAppId(`<prefix>.<bundleId>`)をkeyにして読み書きをします。
そしてこの`prefix`は現状は`TeamId`になります。

AアカウントからBアカウントへ無事にアプリ移行したあと、Bアカウント初回のアップデート申請でTeamIdが変わります。
そうするとKeychainAccessのkeyが変わりアカウントA時のアプリのkeychainAccessが取れなくなります。

仮にKeychainAccessにID判別用のためのデータ入れてたりすると、

```
そのまま申請
↓
ユーザーがアップデート
↓
Keychainが空の状態 == ユーザー判定できず全員初期ユーザー扱い
↓
ユーザーからお問い合わせ爆発＼(^o^)／
↓
ヘタしたらサービス死亡／(^o^)＼ﾅﾝﾃｺｯﾀｲ
```

におちいります。

尚、申請時にLoss of keychain access～ といったWarningメールが飛んでくることになります。
リファレンスにもImportantって書いてありますね。読み飛ばしてちゃってたけどね・・・

回避策としては

* 一旦移行前後のアプリだけ`KeychainAccess`の情報を`UserDefaults`とかに逃すようにして、`KeychainAccess`と`UserDefaults`を両方使用するようにする(セキュリティ上あまりよろしくない)
* そもそも初めから`KeychainAccess`を使用しない設計にする(あまり現実的でない)
* もう1回アカウントAに戻して、アカウントBから新規で同じアプリを出して、ユーザーにデータ引き継ぎを促す(現実としてユーザー減)
* Appleに問い合わせてBアカウント側のAppIdのprefixにAアカウント側のTeamIdを使えるようにしてもらう(ユーザー影響ゼロ)

があると思います。
最後のケースは結構無理そうに見えますが、問い合わせて対応してもらえる可能性があります。(ここから憶測ですが、ある程度古いDeveloperアカウントではひとつのアカウントでもAppIdごとに複数prefixを選択できたという経緯があり、システム的に可能なためかもしれません)

# Android
アカウント移行はプラットフォームの機能として用意されています。

公式の[リファレンス](https://support.google.com/googleplay/android-developer/answer/6230247?hl=ja)はこちら。

### 移行処理の流れ
1. アカウントAとアカウントBの取引IDを確認しておく(それぞれ販売アカウントから確認)
2. (ここで有料アプリだったりAnalyticsを移行だとかいろいろやることあります。が無料アプリだったので省略)
3. 移行するアプリのパッケージ名などを確認して、移行リクエストをgoogleに送信
4. だいたい数時間くらいで移行されます

## 困ったこと
とくにありませんでした!さくさくすぎて逆にこわいくらいするっと移行します。

# Kindle
## 移行処理
ないです。

そのため以下の手段がとれうると思います。

* アカウントBで同じアプリをパッケージ名を変えてリリースしてデータ引き継ぎ
* アカウントAの名義をアカウントBへ変更する
 * Kindleは規約上複数アカウントの問題もありません。
 * 見た目上は両方ともアカウントBに見えるので、アカウントBは1つのようにみえますが、データ上はアカウントBが2個ある状態になります。

プラットフォームとしては、将来的にはアカウント移行も対応中とのことです。
(が、[フォーラム](https://forums.developer.amazon.com/forums/message.jspa?messageID=11999#11999)をみるかぎり2013年から全然対応進んでなさそうですが)

## 困ったこと
KindleはPlatform側のリアクションが遅くなりがちなので、注意です。
あとは移行処理の本筋ではないですが、アカウント書き換えで対応する場合、アカウントA側の口座情報などを書き換える必要があると思われますが、それにともなう法令チェックの内容が微妙に変わっていたりするので、そこも要注意です。

# まとめ
情報が少なかったり、Platformとそれぞれやりとりが必要だったりで、総じて~~つらみがすごい~~予想以上に時間がかかりました。
移行スケジュールは長めに見積もるのをおすすめします。