【Unity】UIWebViewが原因でビルドが提出できない時の対処法【iOS/Xcode】
アプリの実機テストも終わって「よーしApp Store Connectにアップロードしよう!」とXcodeから無事にアップロードが完了したものの、待てど暮らせどApp Store Connectにビルドが表示されませんでした。
一抹の不安を覚えながらメールの受信箱を開いてみたら、「UIWebViewのAPIを使っているアプリは受け付けないよ」とのメールが。
自分で実装した範囲で使っていた記憶はありませんでしたが、よくよく調べてみるとUnityでアプリをリリースしている人ならほとんどの人が使っているアレが原因でした。
……。
そう、Unity Adsです。
Unityのバージョンによっては、「Service」から有効化した時にインストールされるUnity Adsのパッケージのバージョンが2.xなので、UIWebViewを使っているのです。
この問題に対してはUnity Adsのバージョン3.3から対策が行われているため、Unity AdsのパッケージをアップデートすることでUIWebViewを使用しない形になります。
この点について記事内で詳しく触れていきます。
環境
macOS 10.15 Catalina
Unity2018.4.23f1
Xcode11.5
現象
Unity2018.4.23f1でビルドしたアプリをXcodeからApp Store Connectにアップロードしました。しかし、ビルドは受け付けられず、メールでUIWebViewが使用されていることを通知されました。
審査に提出する前の段階で、そもそもアップロードを受け付けていないようです。
原因
バージョン3.2までのUnity Adsでは、UIWebViewが使用されていたようです。Unity2018.4.23f1ではデフォルトでバージョン2.0.8のUnity Adsがインストールされているため、これに引っかかったものと思われます。
手元のUnityで確認したところ、Unity2019.2では同じく2.0.8のUnity Adsがデフォルトになっていて、Unity2019.4では3.4.5のUnity Adsがデフォルトになっていました。なのでUnity2019.4だとこの問題は起きなそうですね。
対策
Unity Adsのバージョンを3.3以降にアップデートします。Unity2018.4以降であればPackage Managerからアップデートするのが簡単です。
ただし、その際ソースコードが変更になる可能性もあるため、修正が必要です。
参考情報
Unityのヘルプデスクでこの問題について情報が公開されています。この情報があったので、アプリ提出時も焦らずに済みました。
想定される影響範囲
新規アプリを提出する際はもちろんのこと、既存のアプリをアップデートする場合も提出時に引っかかると思うので、既存のプロジェクトでもUnity Adsをアップデートすることを検討した方が良さそうです。
Unity Adsをアップデートしよう!
なんだかインシデント管理のレポートみたいな感じになっちゃったので、いつものゆるーい感じでアップデートについて確認したことを共有させてくださいな。
Unity AdsのアップデートはPackage Managerが簡単なので、[Window] -> [Package Manager] を開きます。
パッケージの読み込みが終わったら、左のリストから「Ads」を選択します。右側のエリアでバージョンが書かれているプルダウンがあるので、3.3以降のバージョンを選択します。画像の例では3.4.7を選択します。
バージョンを選択したら [Update to] ボタンをクリックします。
パッケージのインストールが終わったらバージョンを確認します。
これでアップデートはOK。
2.xのソースコードを使っている場合、ちょっと書き方が変わるので注意が必要です。
変わった箇所
触った範囲で気付いた部分についていくつか。
公式のドキュメントも確認すると安心です。
自動的に初期化されない
ServiceからUnity Adsを使っていた時にはゲーム開始時に自動的に初期化してくれましたが、アップデート後に実行したら自動的には初期化されませんでした。なので、明示的に初期化する必要がありそうです。
初期化はUnity Adsを使うシーン内のスクリプトでStart()やAwake()に記載しておくとグッド。この時ゲームIDが必要になるので、ブラウザからUnityのサイトにログインして、ダッシュボードで確認しましょう。
インタフェースを実装する必要がある
広告が準備されたタイミング、広告の再生が開始したタイミング、広告の再生が終了したタイミングなど、広告のアクションに応じたコールバックメソッドを実装する必要があります。
この部分は2.xから変わった部分ですね。コードも書き換える必要があります。
2.xの時のコードの実装例
2.xの時のコードは以下のイメージです。Unity Adsを有効にした時から使えるリワード動画広告を再生する想定です。
uGUIのボタンから「OnClickAdButton()」を呼び出す想定でいます。このメソッドでは広告の準備状態を確認して、準備されていれば広告を再生するようにしています。
広告再生のオプションとしてShowOptionsを使ってコールバックメソッドをセットしています。そのコールバックメソッドである「HandleShowResult()」では、広告再生の結果に応じて処理を分岐させています。
先にネタバレしてしまいますが、このスクリプトで使っているShowOptionsのあたりを修正する必要があります。
3.4のコードの実装例
3.4のコードは以下のイメージです。上と同様にリワード動画広告を再生する想定です。
2.xではShowOptionsを使ってリスナーを登録していましたが、3.4では「Advertisement.AddListener(this)」を使ってリスナーを登録しています。この時登録できるのは「IUnityAdsListener」のインタフェースを実装したクラスなので、このスクリプトのように自分自身がリスナーになる場合はインタフェースを実装します。
この時、以下のメソッドを実装する必要があります。(publicは忘れずに)
メソッド名(引数略) | 概要 |
OnUnityAdsReady() | 広告の準備ができたタイミングで呼び出されるメソッド |
OnUnityAdsDidFinish() | 広告の再生が完了したタイミングで呼び出されるメソッド |
OnUnityAdsDidError() | 広告に関してエラーがあったタイミングで呼び出されるメソッド |
OnUnityAdsDidStart() | 広告の再生が開始したタイミングで呼び出されるメソッド |
※メソッドの説明については公式のAPIリファレンスも確認するようにしてください。
プロジェクトデフォルトで使っている2.xのUnity AdsではServiceウィンドウからテストモードなどを制御して、ゲーム開始時に自動的に初期化してくれていましたが、3.4ではどうやら自動で初期化していないようなので、Start()の中で自分で初期化するようにしましょう。
この時、プラットフォームごとのゲームIDも定義するようにします。このIDはUnityのサイトにログインした時に表示されるダッシュボードの中から確認できるので、この値を使います。
このスクリプトはiOSまたはAndroidのみで使う想定なので公式のサンプルコードにならって「#if UNITY_IOS」のようにプラットフォームで分岐させています。ですが、Switch Platformで他のプラットフォームに切り替える場合は「gameId」を保持するフィールドは分岐の外で定義しておきましょう。「gameIdがないよー」とエラーが出ますからね。
このスクリプトの中ではUnity Adsのサンプルコードにならって、広告の準備が完了した時に呼ばれるOnUnityAdsReady()の中でボタンを有効化するようにしています。実際に使う場合は、2.xの時と同じように「Advertisement.IsReady()」を使って準備されているか確認してハンドリングすると丁寧だと思います。
ShowOptionsについてはObsoletedになっているので、再生時は単純に「Advertisement.Show()」を使って広告を再生しています。
結果は「OnUnityAdsDidFinish()」のメソッドで受け取ります。内部のハンドリングについては2.xの時と同じように結果で分岐させるのが良いでしょう。
インタフェースで定義されているメソッドについては、内部で処理を行わないとしてもメソッドを実装しておく必要があるので、コメント文だけの「OnUnityAdsDidStart()」もコードに含めています。
ビルドを受け付けてもらえた
UnityAdsを3.4.7にアップデートしてソースコードを修正し、再度ビルドを提出したところApp Store Connectにビルドが表示されるようになりました。良かった良かった。
まとめ
使っているUnity AdsのバージョンによってはiOSでビルドを提出した時にUIWebViewの使用が原因で受け付けてもらえません。なので、Unity Adsのバージョンを3.3以降にアップデートしましょう。
2.xからアップデートした場合はソースコードを修正する必要があるので、公式のサンプルコードを確認しつつ修正すると良いでしょう。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【iOS/Xcode】アプリ名をローカライズする時の設定【Unity】 2020.06.25
-
次の記事
【Unity】リリース前レポートでAndoridの互換性の警告が出る 2020.06.27
コメントを書く