モバイルアプリStage UがGoolge Playストアから削除されてから、復活するまでの記録。
個人的にそこそこ頑張って作ったモバイルアプリStage U。リリースから1年以上が経過して、ユーザも減っていき、そろそろ本腰を入れて機能追加していかないとなぁ、なんて思っていたある日。ふとGooglePlayストアのアプリページを開いてみると、アプリが消滅している。
何事かと思いGoogle Play Consoleを確認すると、ポリシー違反で削除したとのこと。
メールを確認すると、アプリがストアから削除された旨を伝えるメールがGoogleから届いている。
審査の結果、 Stage Uは、Google Play ポリシーに違反していると判断されたため、Google Play ストアから削除されました。
このアプリは、ポリシーに準拠するアップデートをご送信いただくまで、ユーザーに配布、販売されなくなりますのでご了承ください。
削除の理由: Android 広告 ID の使用ポリシー及び Google Play デベロッパー販売 / 配布契約 4.8 への違反
(略)
要約すると、プライバシーポリシーに関する説明が無いので、アプリをストアから削除する、ということらしい。調べてみると同様の理由でアプリが削除されたケースがちらほら見つかる。対策としては、メールにも記載されている「プライバシーポリシーへのリンクをストアの掲載情報及びアプリ内に掲載」を実施すれば良い模様。作業としては、プライバシーポリシーページを作成して、アプリから該当ページへの遷移を追加して、動作確認してapkファイルをアップロードとなる。
しかし、ストアから削除する前に警告ぐらいあっても良さそうなものなんだが。メールをさかのぼって確認しても、本問題に対する警告のメールは見当たらず、いきなりストアから削除&削除完了のメールが送付された。1年近くストアに掲載され続けていたんだから、警告ぐらいしてほしい。。。
なんて愚痴っていいる暇があったら、さっさと作業にてアプリを更新してしまえばよかったのだが、タイミングが悪く本業(エンジニア)の仕事がかなり忙しい状況で、落ち着いたら着手しようしようと思いつつ、ユーザ数が少ないことを言い訳に、ついつい先延ばしにしてしまい、気がつけばアプリ削除から1年が経過する。
プレイヤーが少ないとはいえ、本アプリを楽しんでいてくれた一部のユーザが新規インストールができない状態が1年以上も続いてしまったのは、本当に申し訳ない。
そんな後ろめたい気持ちを抱えながら、本業がある程度落ち着いてきた状態で、なんとかせねばと重い腰を上げてやっと対応に着手した夏の終り。作業を進めていくに従い、さっさと対策しておけばよかったと激しく後悔することになるのであった。。。
プライバシーポリシーというと個人情報保護法やらGDPRやらで、なんだか小難しく感じてしまう。しかし、同様の事例を調べてみると、Googleが要求しているAndroid用アプリのプライバシーポリシーはそんなに難しく考える必要はなく、以下の情報を記載すれば良いらしい。
なお、UnityAdsを利用している場合は、UnityAdsの収集する情報についても記載が必要なので注意。
ネットで見つけた雛形や、他アプリなどをを参考にしながら、慣れない手付きでプライバシーポリシーを書き上げる。
アプリは日本語と英語の2ヶ国語に対応しているが、プライバシーポリシーは日本語のみを作成。英語版のプライバシーポリシーについては、Googleに問題として指摘されたら追加していくスタンスで。
プライバシーポリシー作成後の作業は以下の2つ。
まずはストアの掲載情報を更新。Google Play Consoleにログインして、アプリを選択後に「ストアでの表示 > ストア掲載情報 > 画面最下部のプライバシーポリシー欄」へ移動して、URLを入力。あとは、「アプリを再送信」ボタン押下で掲載情報を保存して完了。
ここまでは順調に進む。ここまでは。。。
次は、アプリにプライバシーポリシーページへの参照を追加。アプリ内にWebViewを表示する方法と、外部ブラウザを起動してページを表示する方法の2通りの対応方法がある。今回は実装が簡単な外部ブラウザ起動を選択。UI的にはアプリ切り替えが発生しないほうが好ましいのでWebView方法が良いのだが、Unityでアプリ内WebViewは色々と面倒だった記憶があるので、最小限の労力でアプリ再登録を目指す今回は、簡単な外部ブラウザ方式を採用。
どちらにしても、Unityでアプリを修正する必要があるので、随分久しぶりにUnity 5.6を起動。すると、Unityアカウントがサインアウト状態で、アクティベーションを求められる。確かに久しぶりにUnity 5.6を起動したしセッションが切れたんだろうと納得し、ログイン画面でUnityアカウントでログインして、次に表示されるアクティベーション画面でプロダクトコードを入力するとSerial has reached the maximum number of activationsでエラーが発生。
どうも、時間経過などで勝手にUnity開発環境からサインアウトされるものの、アクティベーションは解除されずに残るため、再びUnity開発環境にサインインしようとすると、残っているアクティベーションのせいで最大アクティベーション数の上限に引っかかってしまうと推測。WebブラウザでUnity IDにログインしてMyAccount > MySeats > Activation一覧で古いアクティベーションを選択して、Remove selected activationsを実行して解決。というか、勝手にサインアウトしたらアクティベーションも解除してほしい。
ともあれ、Unity 5.6の起動には成功したので、今度はC#プログラムを修正するためにVisualStudioを起動すると、、、コンポーネントの更新とかが発生してVisualStudioがクラッシュする。もう、勘弁してくれよと思いながらVisualStudioを再起動すると、今度は何事もなかったかのように起動する。クラッシュは見なかったことにしよう。
プログラム修正といっても、メニュー項目の追加と選択時に指定URLを外部ブラウザで開くだけで、C#で30行程度の修正。あのときは随分頑張って作ったなぁ、と開発していた当時を思い起こしながらサクッと修正は終わる。
GooglePlayストアへのアップロード用apkファイルの作成もサクッと完了。Keystoreのパスワードだったり、接続サーバーの環境選択だったり、BundleVersionやアプリバージョンの更新だったりと、リリース用apkファイルのビルドはちょっとした手作業が必要になるが、具体的な操作内容をリリース手順書というなのメモ書きで残していたのですんなり作業できた。ちょっとした手順書や設定値などの資料は、作るのが面倒で個人開発だとついついサボってしまうところだけれど、念のために作っておいた資料が数年後に役に立つ、しかも作っていなかったら危なかったレベルで役に立つことを何度も経験しているので、エンジニアとして経験が長くなるにつれて、この手の資料はできる限り作る習慣が強くなる。今回も、ちょっとしたリリース手順書で随分と助かった。
そんな手順書を作成した昔の自分の少しだけ感謝しつつ、できたてほやほやのapkファイルを眺めて、この調子なら今日中にはストアに再公開できそうだなぁ、と安心したのもつかの間、直後にその考えがまったくもって甘かったことを痛感することになる。
Google Play Consoleにログインして、新規リリースを作成して、プライバシーポリシー画面に対応した最新のapkファイルをアップロード。で、エラーが発生。
アップロードできませんでした
現在、お客様のアプリは API レベル 25 を対象にしています。セキュリティとパフォーマンスが最適化された最新のAPI を利用するには、API レベル 26 以上を対象にする必要があります。アプリの対象 API レベルを 26 以上に変更してください。詳細
調べてみると、APIレベルの最小値が更新された模様。
Google Play の対象 API レベルの要件を満たす
近いうちにAPI レベル 28以上が要求されるようなので、これを機会に25から28に上げてしまおう。
UnityでTarget API LevelにAutomatic(highest installed)を選択していても、APIレベルは自動で最新にならない。どうやらAndroidSDKのインストールが必要。AndroidStudioを立ち上げて、SDK Managerを起動して、AndroidSDK 28(Android 9.0 Pie)をインストール。
Unityを再起動して、Edit > Project Settings > PlayerでPlayerSettingウインドウを開いて、Android > Other Settings > Identification > Target API Level で Automatic(highest installed)を選択。Target API Levelの選択肢には最新のAPIレベル自体は表示されないが、Automaticを選択しておけば、ビルド環境の最新SDKを自動で判定してくれるらしいので、そのまま。
確認のために、Gradleプロジェクトを出力して確認する。Gradleプロジェクトは、UnityでFile > Build&Settings... でダイアログを表示して、PlatformにAndroidを選択して、Build SystemでGradle(New)を選択して、ExportProjectチェックボックスをONにして、Exportボタン押下でプロジェクトが出力される。生成されたファイルからbuild.gradleを見つけて、中身のandroid > defaultConfig > targetSdkVersionの番号が28になっていることを確認。
Google Play Consoleに戻って、もう一度apkファイルをアップロードするが、、、やはり同じエラー。おかしいぞ?AndroidSDKのBuildToolsに含まれるappt(Android Asset Packaging Tool)コマンドを利用すると、apkファイルから直接Target API Levelを確認できるらしいので使ってみる。
で、確認してみると、古いバージョンが出力される。Target API Levelの設定がうまく反映されていない。
aapt d xmltree apkファイル AndroidManifest.xml
N: android=http://schemas.android.com/apk/res/android
(略)
E: uses-sdk (line=28)
A: android:minSdkVersion(0x0101020c)=(type 0x10)0x10
A: android:targetSdkVersion(0x01010270)=(type 0x10)0x19
// 0x19は25。本来は0x1c(28)になってほしい
試しにAndroid SDKを新規ダウンロードしてUnityに設定しても、問題は解決せず。うーん困ったなと思いながらWebで色々と調べると、「Player SettingsよりもAndroidManifest.xmlの設定が優先される」の記述を見かける。
なお、注意すべき点が一つ。
UnityのターゲットAPIレベルは、Player SettingsよりもPluginsフォルダ内にあるAndroidManifest.xmlの設定が優先されますので、ご注意ください。
APIレベル26(Android8)以降でのUnity5対応について
もしやと思いプロジェクトの Assets > Plugins > Android > AndroidManifest.xmlを見てみると、SDKを指定する記述が存在している。
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="25" />
targetSdkVersionの値を25から28に変更して、ビルドしてGooglePlayストアにアップロードすると、無事にapkファイルが受け付けられる。多分、AndroidManifest.xmlを最初に作成したときに、Unityが生成したテンポラリAndroidManifest.xmlをコピーして使ったため、明示的なSDK指定が入り込んだと思われる。AndroidManifest.xmlでuses-sdk要素を削除すればUnityEditorの設定が反映されるようになりそうだが、とりあえずこれ以上は変更するのはやめておこう。
apkファイルのアップロードさえ成功すればゴールは目の前だ!と次へ進むと、エラーが表示される。
恐る恐る「エラーメッセージを表示」をクリックすると、以下のメッセージが表示される。
エラー
このリリースは Google Play の 64 ビット要件に準拠していません
以下の APK または App Bundle は 64 ビットのデバイスで利用できますが、32 ビット向けネイティブ コードしか含まれていません。12
アプリには 64 ビットと 32 ビットのネイティブ コードを含めます。Android App Bundle 公開形式を使用して、各デバイスのアーキテクチャが自動的に必要なネイティブ コードだけを受け取るようにします。これにより、アプリ全体のサイズが増大することを回避できます。詳細
うーん、おかしいぞ。アプリの64bit対応が必須化されたことは認識していたが、既存アプリの更新の場合は2021年8月までの猶予期間があるはず。。。
2019 年 8 月 1 日以降:
・ネイティブ コードを含むすべての新規アプリとアプリのアップデートを Google Play で公開する際に、32 ビット版に加えて 64 ビット版の提供が必須になります。
・延長期間: Unity 5.6 以前を使っている既存のゲームの場合、Google Play は 2021 年 8 月まで 32 ビットのみのアップデートを受け入れます。
もしかして、ストアからアプリが削除された場合は、新規アプリ扱いになって、2021年8月までの猶予が適用されない。。。?
64bit必須が2019年8月1日から。で、アプリがストアから削除されたのが2018年9月。対応を始めたのが2019年9月。ということは、数ヶ月早く対応していれば、2021年8月までの猶予を受けられたってこと?
もっと早く対応に着手しておけばよかったということか。。。今後の機能追加を考えると、いつかはUnityのバージョンを最新版に更新しようとは思っていたけれど、でもそれはGooglePlayストアにアプリを復活させて、一息つけた状態に持っていってから、という算段だった。過去の経験から、開発環境をバージョンアップすると、かなり高い確率で落とし穴やら罠やらに巻き込まれることが予想される。しかも、Unityとなると、どれだけの落とし穴が待っていることか。ということで、Unityバージョンアップは余裕がある状態で実施したいのだが、そんな贅沢は言ってられない模様。
対応を先延ばしにしていたことを考えると、原因の多くは自分にあると言えそうだし、ここは覚悟を決めるしか。。。ついでに、サポート期限切れ寸前のWindows7からWindows10への移行も合わせて実施して、前向きにやっていくか。
UnityやらAndroidやらでごたごたしていると、ふとiOS版アプリの方も気になってしまう。有料のDeveloperアカウントを毎年しっかり更新していかないと、AppStoreでのアプリ公開が停止されてしまうので、開発が一旦停止していてもアカウント更新は必要。
まずは、有効期限の確認をするために、Developerポータルにログインすると、、、
そういえば、2ファクタ認証が必須化されるニュースを見たことがあるなぁ、面倒だけどサクッと設定するか、と思い画面をよく見てみると、、、具体的にどのように2ファクタ認証を設定すればよいのか画面に書かれていない。「詳しくは、サポートページ(英語)を参照してください。」の(英語)の部分に不安を感じながらもリンクをクリックする。
サポートページは表示されない。404より不穏な雰囲気を感じさせる「このページは動作していません」の文字列。画面の前でしばらく待機しても、表示される文字列に変化はない。Developerアカウント年間更新料という名のお布施を毎年支払っているにもかかわらず、この仕打ち。信仰心を試されている気もする。
で、結局Google先生の力を借りて、Appleのサポートサイトで以下の一文を発見。
2ファクタ認証を利用するためのシステム要件は何ですか?
2ファクタ認証は、iOS 9以降を搭載したiPhone、iPad、iPod touch、またはOS X El Capitan以降を搭載したMacで有効にすることができます。
2ファクタ認証 - サポート - Apple Developer
Windows環境のChromeを利用したのが問題だったということだろうか。。。せめて「MacかiOSを使ってね」ぐらい表示してくれればよいのに。単純にリンク切れの問題かとも思ったが、日本語サポートページが存在しているということは、「詳しくは、サポートページ(英語)を参照してください。 」の(英語)も間違ってるし。
結局、過去のメールを漁って、Developerアカウントの更新まであと2か月の猶予が確認できたので、アカウントの更新はとりあえず保留に。
せっかくなので、Appleにリンク切れを報告するため問い合わせを送ろうとしたら、Apple Developerへのサインインを求められる。
Developerアカウントを持っていないと問い合わせすらできないのは、いかがなものかと思いつつも、サインインしてリンク切れの旨を送付。なお、2ファクタ認証の問題は解決していなくても、問い合わせ自体はできた。
Windows10環境への移行して、Unityも最新版をインストール。いつの間にかUnityHubなんてものができていて、複数バージョンのUnity環境のインストールや管理が簡単になっているらしい。
Unity自体は現時点での最新版2019.2.8f1をインストール。一緒にVisualStudioやAndroid SDK/NDKもインストールしてくれるみたいなので、チェックをONに。個別に手動でインストールしたほうが良い気もするが、とりあえず一括インストールで試してみる。
インストール処理は20分ほどで完了。
しかし、Unityのアイコンをクリックしても何の反応もない。早くもちょっと不安になりつつ、WindowsのスタートメニューからUnityを起動。
Unityのスプラッシュ画面が表示されるが、しばらくすると消え去って、Unityエディターは立ち上がらない。ていうか、スプラッシュがちょっと気持ち悪いんですけど。スプラッシュ画面て、もっとこう見ていてワクワクするものじゃないのかな?
そんな起動しないUnityエディターの代わりに、UnityHubで空っぽのプロジェクト一覧画面が表示される。
Unityエディターからプロジェクトを読み込みたいのだが、いちいちUnityHubに登録しないといけないということなのだろうか?「リストに追加」ボタンから既存のプロジェクトフォルダを指定すると、一覧にプロジェクトが表示されるようになる。追加された項目を選択すると、Unityのアップグレード確認画面が表示されるので「確認」でアップグレードを実行。
なんだか色々と頑張っているみたいなので、ドキドキしながら見守る。
しばらくすると、Unityエディターが立ち上がる!5.6から2019.2へのアップグレードだが、ぱっと見はあまり変化はなさそう。だがしかし、ずいぶん画面右下のConsoleウインドウが騒がしいなと見てみると、小さく表示される「警告999+/エラー145」と、行数の多さを物語るスクロールバーの小さいハンドル。情報密度がすごい。
多少は覚悟していたものの、警告の数がオーバーフローするとちょっと滅入る。とはいえ、軽く警告/エラー内容を確認すると、軽微な問題が多そう。改行コードの混在とか。千里の道も一歩から、何とかなるさと思いながら、まずは簡単そうな警告から対処するため、Unityエディタから Assets > Open C# ProjectでVisualStudioを起動すると、、、起動しない。何の反応もなく、何かが起動しそうな気配もない。
スタートメニューや設定からインストールアプリの一覧を確認すると、Microsoft Visual Studio Community 2019が見つからない。Unityインストール時の設定では、確かに、VisualStudio2019のチェックをONにしていた。こうやって記事にするために、キャプチャだって保存してある。ちなみに、同じくチェックをONにしたAndroidSDKやNDKは、Unityエディターのインストール先の配下のフォルダにインストールされていた。具体的にはC:\Program Files\Unity\Hub\Editor\2019.2.8f1\Editor\Data\PlaybackEngines\AndroidPlayer配下にSDKやNDKやOpenJDKフォルダが作成されている。
他でも同様の現象が発生していないか色々と調べてみようかとも思ったけれど、ここで深く考えても仕方がないと思い、深く大きいため息をつきながら、MicrosoftサイトからVisualStudio2019のインストーラをダウンロードして実行する。「Unityによるゲーム開発」にチェックを入れてインストール開始。
VisualStudio2019のインストールは小さなトラブルさえなく無事に完了し、当たり前でしょと言わんばかりにサクッと起動する。あとはUnityエディタでEdit > Preferences > External Tools > External Script Editorと進むが、Unityを再起動したら自動検知したらしく、Visual Studio 2019 (Community)が設定済みだった。
最後にもう一度Unityエディタから Assets > Open C# Projectを実行すると、、、VisualStudioが起動する!起動時のスプラッシュがちょっとかっこいい。ワクワクするほどではないけれど。
これでやっとスタート地点に立てた。長い闘いになりそう。。。(つづく)