もう夏なんですかねー。
夏大好きです。
こんにちは!
STORES 決済 モバイルチームの Engineering Manager、
iOS アプリ・SDKの開発を担当しております。
いわいです。
なぜアプリ譲渡したのか
STORES 株式会社は、 複数の事業会社が集まった会社です。
STORES 決済 iOS アプリは 元々は前身である コイニー株式会社が 運営していたので、
App Storeでも、 Coiney, inc.
の Apple Developer Account からリリースされていましたが
2025年4月、ようやく アプリ譲渡をおこない STORES, inc.
からリリースされている状態になりました。
譲渡前 | 譲渡後 |
---|---|
![]() |
![]() |
アプリ譲渡の準備
アプリ譲渡のやり方自体は、Appleの公式ドキュメント に書かれています。
プッシュ通知など、譲渡の際に注意する点はいろいろとあるのですが、 アプリの配信アカウントが変わることで 譲渡後のアプリが、譲渡前にKeychainへ保存していたデータに アクセスできなくなるため
- Keychainに保存してあるデータをUserDefaultsに保存し直す処理を 1度だけ実行
- Keychainに保存する際に UserDefaultsにも保存する
- Keychainからデータを読む際に、データが無い時はUserDefaultsからデータを読む
などの対応を、譲渡の1年以上前から STORES 決済 アプリに仕込んでいました。
また、譲渡後のトラブルを最小限にするため、上記の対応を入れたアプリを できるだけ多くの加盟店さんに利用してもらうように 譲渡開始の半年以上前からサポートチームの皆さんに協力してもらい、まだアップデートをしていない加盟店さんにメールや電話で アップデートの依頼をしました。
いざアプリ譲渡!
さぁ、準備万端で いざ譲渡!!
というタイミングで問題が見つかりました!!!
STORES 決済 アプリは 特別に許可が必要な APIを使っていた のです!!
特別に許可が必要な API?
STORES 決済 では、 カードリーダーを使って クレジットカードや電子マネーの決済をするのですが、
STORES 決済 アプリが起動している iPhoneがカードリーダーに近づくと、そのiPhone の Wallet が自動で起動してしまうことを防ぐための対応が入っています。
この実装自体は、PKPassLibraryの requestAutomaticPassPresentationSuppression(responseHandler:) を使うだけのシンプルなものです
◉実装例
import PassKit var token: PKSuppressionRequestToken? func disableAutomaticPassPresentation() { guard PKPassLibrary.isPassLibraryAvailable() else { return } token = PKPassLibrary .requestAutomaticPassPresentationSuppression { result in print("\(result)") } }
ですが、なんと! こちらの APIを利用するには Appleから許可を得ないといけなかったのです!
↓ このAPI の Discussion 抜粋 ↓
譲渡前の STORES 決済 アプリは、もちろん Appleから許可をもらっており この APIを利用できる状態だったのですが、譲渡後には、改めて 申請を出して 許可をもらう必要があったことが判明しました! うへー。
うへー、と思ったが、落ち着いて対応する
幸いにも、譲渡したアプリ自体は問題なく動作しており、次のバージョンアップまでに 許可をもらい、Provisioning Profile等を更新すれば良いことがわかりました。
そこからは、Appleの指定するメールアドレスにメールを送り、数回のメールのやり取りののち、10日間ぐらいで無事に許可が下り、上記APIが動作する状態になりました。
めでたしめでたし。
※この辺の細かいAppleとのやりとり等は、公開してはいけないらしいので非公開なのです...
最後に
1年以上前から念入りに準備してきたつもりでしたが、思わず落とし穴があった。
というお話でした。
ただ、落とし穴に落ちても 慌てず騒がず 冷静に対応することで 無事に穴から出られるので、このブログをご覧の皆様も 穴に落ちた際は 落ち着いて対応しましょう!
それでは!