UnityからXcodeにしてビルドする関連(2021年5月)

# やったこと
・Unityで2Dゲームを制作
・Admobで広告を表示(iOS)
Unityでアプリを作るまでは良かったが、その後が大変だった。

# 自分の環境
・MacOS catalina
・Xcode 12.4
・Unity 2019.2.12f1 Personal
・Google Mobile Ads Unity Plugin v5.4.0
・CocoaPods 1.10.1

# Admob広告を表示させる
GoogleMobileAds-v5.4.0.unitypackageをダブルクリックしてすべてチェックが入っていることを確認してimport
その他メディエーションしている場合は各種Adaptorをimportした後、iOSリゾルバを設定する。
Unity > Assets > External Dependency Manager > iOS resolver > settings
にて、CocoaPodsIntegration　のプルダウンから
Xcode Project Add CocoaPods to the Xcode Project　を選ぶ。

#アプリを実装する
Unityで作る。Admobのテスト広告が表示されることを確認。

#証明書を作る
端末で確認＆ストアで公開するために必要
・AppleDeveloperProgramを購入する。
・Macのキーチェーンアクセス > 証明書アシスタント > 認証局に証明書を要求 CertificateSigningRequest.certSigningRequestを作る
・Apple Developer > Certificates, Identifiers & Profiles > Certificates　からCertificateSigningRequest.certSigningRequestのアップロードし、DeveloperとDistributionの証明書を作る(ios_develop.cer, ios_distribution.cer)
・AppIDを作成する
・provisioning profilesを作成する
このとき開発用(developer)と公開用(distribution)を作成する。
開発用provisioning fileは開発用のAppIdとBundleIdを割当て、公開用には公開用のAppIdとBundleIdを割り当てておく。また開発用では実行したい端末を登録する。

# Unityから「開発用」にビルド
UnityでビルドするとXcodeのプロジェクトが作られ、Xcodeからビルドして端末で実行＆公開用のipaファイルを作るという流れ。
なおXcodeのシミュレーターでの実行はしない（というよりUnity自体がシミュレーターである...というよりXcodeシミュレータでの確認はできなかったので諦めた）。
まずは端末でアプリを確認するためにUnityからビルドする。
・Unity > Fils > BuidSettings　にてPlatformをiOSを選択してswitch platformする。
・GraphicAPIsが足りない状況だとBuildボタンがグレーアウトするので
PlayerSettings > Other Settings > GraphicAPI　にて　OpenGLES2, 3を追加する
・Unity > Preferences > PlayerSettings > iOS > Other Settings にて以下の設定をする
　・iOS provisioning profilesの開発用を設定する
　・profile typeをDevelopmentにする
　・Bundle Identiferを開発用にする
　・TargetSDKをDeviceSDKにする
・Buildボタンを押すと開発用のXcodeのプロジェクトファイルができる

#Xcodeからビルドして端末で確認
・Xcodeのプロジェクトファイル(Unity-iPhone.xcodeproj)ができているので、ターミナルで同階層のディレクトリに行ってCocoaPodsを実行する
<code>pod install --repo-update</code>
ここでエラーになる場合はCocoaPodsを再インストールする(別記事を参考にすべし)
・Xcodeをxcworkspace(Unity-iPhone.xcworkspace)で起動する
・build settingsにて以下の設定をする
　・provisioningfile  開発用のprovisioning fileを選択
　・Deployment teamで開発用を選択
・端末をつないで実行する

#公開用のipaファイルを作成する
開発用と公開用とではprojectファイルから異なってくるのでUnityからビルドをしてXcodeプロジェクト自体を作り直すことになる。
2つディレクトリを作っておき、そこに開発用と公開用で別途Xcodeのprojectを作成するのがスマートかと思う。
先程の開発用として設定した部分をすべて公開用のものを使って　Unity〜Xcode〜CocoaPods〜BuildSettingsの設定作業を経て　XCode > Product > Archive　する。

#起こりうるエラーと解決方法
#### 証明書関連のエラー
・Signing for "Unity-iPhone" requires a development team. Select a development team in the Signing & Capabilities editor.(「Unity-iPhone」にサインするには開発チームが必要です。 Signing＆Capabilitiesエディターで開発チームを選択します)
・Unity-iPhone has conflicting provisioning settings.(Unity-iPhoneのプロビジョニング設定が競合しています)
・A valid provisioning profile for this executable was not found.(この実行可能ファイルの有効なプロビジョニングプロファイルが見つかりませんでした)

証明書には開発用と公開用があり、UnityからXcodeを生成した場合、Xcode上のbuildsettingで開発用と公開用を切り替える必要はない（というよりできないと思う）。
従って開発用と公開用で別々にXcodeのprojectを吐き出させることになる。
Xcode上で設定するのは BuildSettings > Provisioning File　と　DeveloperTeamの2点のみ。
開発用と公開用でそれぞれ適したProvisioningFileとDeveloperTeamを設定する。

#### Admob関連のエラー
・GoogleMobileAds/GoogleMobileAds.h' file not found
・No visible ＠interface for 'GADRewardedAd' declares the selector 'initWithAdUnitID:'
・No visible ＠interface for 'GADRewardedAd' declares the selector 'loadRequest:completionHandler:'
・No visible ＠interface for 'GADRewardedAd' declares the selector 'isReady'
各種frameworkは手動ではなくcocoapodsで入れる。またiOSリゾルバ設定を行って解決する。

・&lt;Google&gt; Cannot find an ad network adapter with the name(s)
メディエーションすると起こりうるエラー。
cocoapodsでのimportとiOSリゾルバを設定して解決する。

#余談
今回は以下のことも行っているのでこれらも記事にしたい。
・CocoaPodsのインストール
・スクロールテキスト
・WebView導入
・iOS14対応(AppTrackingTransparency導入＋SKAdNetwork記述)
・サーバとの通信
・メディエーション