Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
iTunes 使用許諾更新のとき一旦キャンセルしてほしい話

iTunes 使用許諾更新のとき一旦キャンセルしてほしい話

( ◜◡◝ )

これは、ドリコム Advent Calendar 2015 の6日目です。

5日目は kakaricho さんによる、 2年目エンジニアがエンジニアリーダーをやってみた話 です。

【その2】ドリコム Advent Calendar 2015 - Adventar その2もあります。

自己紹介

  • ( ◜◡◝ )
  • スマホゲーム大好きおじさんです。
  • もう4年くらいコンソールのゲームを触っていません。

キャンセル??

iTunes 使用許諾契約書が更新されました (C) GungHo Online Entertainment, Inc.

iPhone/iPad を長くお使いの方は、このような「iTunes 使用許諾更新」のダイアログをご覧になったことがおありと思います。最近では2015年10月22日頃に、全iOSユーザに一斉に表示されました。

このダイアログは、新しい使用許諾が公布(?)されて以降初回のアプリダウンロード、あるいはアプリ内課金を使用する時に表示されるのですが、特にアプリ内課金について、許諾同意後に「一旦キャンセルしろ」という、一見不思議な案内をしているアプリがあります。

【パズル&ドラゴンズ】【iOS】魔法石購入時に「使用許諾契約書」の更新画面が表示された場合

魔法石の購入確認ダイヤログが表示されたら、「キャンセル」を選択 (C) GungHo Online Entertainment, Inc.

魔法石の購入確認ダイヤログが表示されたら、「キャンセル」を選択

写真入りで分かりやすかったのでパズドラの案内を引用しましたがパズドラに限った話ではありません。

一体どうしてキャンセルを押さなければいけないのでしょうか?

理由

理由は「ユーザにそうしてもらうと、一番不利益がないから」です。不利益とは具体的には以下の現象が起き得ます。

  • 表示がおかしい。課金したのに、アプリに戻ってみると、購入キャンセルと表示され、混乱を招くことがある。(※例に挙げたパズドラがこの通りの挙動をするかどうかは分かりません。)
  • 購入したアイテムがすぐにアプリに反映されない。長時間待たされることがある。

表示がおかしい?

使用許諾更新のダイアログでOKを押すと、新しい許諾を表示するために一旦iTunesが起動してそこに遷移されるのですが、その時アプリ側には、ユーザ操作で購入確認でキャンセルが押された時と同じ通知が送られます。具体的には SKPaymentTransactionObserver プロトコル の updatedTransactions で、 transactionState が SKPaymentTransactionStateFailed 、errorが SKErrorPaymentCancelledSKPaymentTransaction が飛んできます。

これはユーザ操作のキャンセルボタンと見分けがつかないので、アプリ側では、キャンセルが押された時と同じ処理をせざるを得ません。キャンセル時にその旨を表示しているアプリの場合、アプリに戻ってみると「キャンセルされました」と表示してしまいます。この紛らわしい表記が、不利益の1点目です。

アイテムがアプリに反映されない?

許諾同意の後で表示される購入確認ダイアログでそのままOKを押した際に、アプリには transactionState が SKPaymentTransactionStatePurchased な SKPaymentTransaction が通知されます。これは、通常シーケンスで課金完了した際と同じです。ですので通常と同様、アプリからサーバにレシートを送信して、検証ののちアイテム付与すればOKです。

ですが、この通知がいつ届くかアプリからは分かりません。そのためひとつはアプリ側の事情、もうひとつはiTunes側の事情、2つの苦難から、課金結果をすぐにはアプリに反映できないことがあります。この遅延が不利益の2点目です。どちらの場合もアプリ再起動してもらうのが解決になる場合が数多くあるので、多くのアプリはアプリ再起動や端末再起動※の操作を案内しています。(※アプリ終了の操作(ホームボタンを2回押してアプリを上にシュッとやるやつ)はユーザさんに伝わりにくいので、端末電源入れ直しのほうが案内しやすいという事情もあります。)

アプリ側の事情

アプリにはいろんな画面や状態があり、いつでも課金処理ができるとは限りません。例えばゲームアプリでは、ゲームのメイン部分(パズドラで言うとパズルをしている部分)は、たくさんの演出をなめらかに表示したり効果音を鳴らしたり、ユーザの操作をきびきびと反映させたり、やりたいことが多くあり、端末のCPUやメモリを限界まで使い切りたいところです。課金処理(サーバとの通信がどうしても必要)をバックグラウンドでやっている余裕はありません。

そのため、課金完了の通知を受け取る(finishTransactionする)タイミングは限定せざるをえません。そのタイミングは、もちろん実装にもよるのですが、他にやることがあまりない、かつ、後述のiTunes側の事情とも一括にできる、アプリ起動時が最も都合が良いです。ですので多くのゲームアプリは、課金反映に再起動を案内しています。

iTunes側の事情

通常、課金完了は、登録している observer にすぐに通知されるのですが、それがなかなか届かないことがあります。経験的に、許諾更新があった時は特に多く、理由はよくわかりませんが未処理の課金が増えiTunesが不調になるんじゃないかと推測しています。

そういう時、observer を登録し直したときに、まだ来ていなかった通知が届くことがあります。observer を登録するのはアプリ起動時なので、再起動で反映されることがあるわけです。

とはいえ

まともな実装されているアプリなら課金未反映はそうめったには起こりません。許諾更新以外でも、非同期に(購入画面からモーダルで購入完了まで行かないで) observer に課金完了が来るケースは普通にあるので(購入途中で回線断など)、そのケースを適切にカバーできているアプリなら、お待ちいただければそのうちアイテムを反映できます。

それでもiTunesから通知がなかなか来ないことがあります。数時間どころか数日間来ない事例すら確認しています。そういう場合はどうしようもないです。購入履歴を添えて、窓口よりお問い合わせください。

上記は使用許諾更新の時に限らず、

  • 「秘密の質問」を聞かれたとき (これまで課金を一度もしたことのなかったApple IDを使って課金をしようとすると表示される)
  • 最近ではiOSを9に更新して初回の課金の際にもあった

といった、アプリ内課金の途中でiTunesに誘導される時は毎回発生します。そういった際にも最終確認ダイアログではキャンセルを押してもらって、もう一度最初から課金をやり直してもらうと、不自然な挙動がなくて、アイテムがすぐに反映されて、楽しい課金ライフが送れるんじゃないですかね。

おわり

7日目は ka_nipan さんの ドリコムを支えるデータ分析基盤がTD+AWSに移行した話 - かにぱんのなく頃に です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment