UnityでNiftyのmBaaS（NCMB）とAdMobの競合を解決して利用する


NiftyのmBaas(以降NCMB)プラグインをUnityで導入することにより、手軽にプッシュ通知などの機能が利用可能です。
既にAdMob等を導入している環境等で導入した場合、競合などによりビルドエラーや実行時エラーを起こす問題を乗り越えて利用するまでの道のりです。

## Description

UnityでNCMBのPluginを導入することによりでiOS/Android向けに様々な機能が利用できます。Push通知もその一つです。
[UnityでNCMBを利用する](http://mb.cloud.nifty.com/doc/current/introduction/quickstart_unity.html)
[NCMB Unity Package](https://github.com/ncmbadmin/unity_push_quickstart)

ところが上記のマニュアル等を参考に導入しようとしても、AdMob等の広告を既に導入している場合には高確率で競合によるエラーでビルドができません。
この解決方法が意外とやっかいなので以下に手順を残します。
　おおまかには以下の流れです。
-admobで使用するaar等を削除
-Niftyで使用aar等導入
-PlayServiceResolverでよしなに解決

***
<動作環境>

- Unity5.6.3p4
- Google Mobile Ads Unity Plugin v3.9.0
- NCMB v3.1.1 (Nifty mBaas Unity plugin)
- Android7.x/iOS11.x

## 設定方法

1．AdMob関連のjar/aarを削除する
　Assets/Plugins/Android/以下にあるAdMob導入時のjar/aarを一旦削除します
　play-service-xxxやsupport-yyyが該当します。
　私は該当フォルダのファイルを一旦全て削除しました。

2．NCMBのプラグインを導入します
　NCMBのプラグインを導入します。今回はv3.1.1でした。
　導入後は、Asset/Plugins/Androidフォルダに下記のファイルが展開されています。
<a href="http://www.alice3.net/wp-content/uploads/2017/12/ncmb1.jpg"><img src="http://www.alice3.net/wp-content/uploads/2017/12/ncmb1-275x300.jpg" alt="" width="275" height="300" class="alignnone size-medium wp-image-3960" /></a>

　※　play-service-base-xxxを削除すると競合が解決してビルドできますが、NCMBを呼び出すと実行時に落ちます。

3.Asset/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xmlを編集する

 NCMBで導入されたplay-service-xxx系のバージョンに合わせます。ここでは11.6.0を11.0.0にします。
変更前

    <androidPackage spec="com.google.android.gms:play-services-ads:11.6.0">

***

変更後

    <androidPackage spec="com.google.android.gms:play-services-ads:11.0.0">
***

4. PlayServiceResolverでAdMob関連のaarを再導入する
 Assets/Plugins/Androidを右クリックして表示されるメニューより
 PlayServiceResolver->Android Resolver->Resolveを実行します
　<a href="http://www.alice3.net/wp-content/uploads/2017/12/ncmb1.jpg"><img src="http://www.alice3.net/wp-content/uploads/2017/12/ncmb1-275x300.jpg" alt="" width="275" height="300" class="alignnone size-medium wp-image-3960" /></a>

　実行後は、以下のようにファイルが配置されます。
　<a href="http://www.alice3.net/wp-content/uploads/2017/12/plugins.jpg"><img src="http://www.alice3.net/wp-content/uploads/2017/12/plugins-198x300.jpg" alt="" width="198" height="300" class="alignnone size-medium wp-image-3961" /></a>

5．各AndroidManifest.xmlのtargetSdkVersionを統一する
 -Assets/Plugins/Android/AndroidManifest.xml
 -Assets/Plugins/Android/NcmbGcmPlugin.aar内のAndroidManifest.xml
 -Assets/Plugins/Android/GoogleMobileAdsPlugin/AndroidManifest.xml
 -その他導入済みのものがあれば

　AdMob導入時に既に実施しているかもしれませんが、メインとなるPlugins/Android直下のAndroidManifest.xmlと他のAndroidManifest.xmlで
 targetSdkVersionが異なるとビルドエラーになります。
 具体的には下記のような記述です。今回はNCMBのものが26になっていましたが25で統一しました。
<pre>
 <uses-sdk android:targetSdkVersion="25" />
</pre>

　ここで問題になるのが、NcmbGcmPlugin.aarの中にあるAndroidManifest.xmlの変更です。
　実はaarファイルは単なるzip圧縮ファイルです。拡張子をzipに変更してさくっと解凍しちゃいましょう。
 　解凍すると以下のようなファイルが確認できます。
<a href="http://www.alice3.net/wp-content/uploads/2017/12/ncmbplugin.jpg"><img src="http://www.alice3.net/wp-content/uploads/2017/12/ncmbplugin-264x300.jpg" alt="" width="264" height="300" class="alignnone size-medium wp-image-3965" /></a>
　このAndroidManifest.xmlはv3.1.1ではtargetSdkが26なので25に変更します。
　変更後は、再度zipで圧縮してaarに拡張子を変えればOKです。私は7-zipを利用しました。
　
　注意点として、zip圧縮時は上記のフォルダ群を選択して直接圧縮してください。展開時にNcmbGcmPliuginといった名前などでルートフォルダを生成した場合
　そのルートフォルダを圧縮してしまうとフォルダ構成がおかしくなり、ビルド時に見慣れないエラーがでます。
　<a href="http://www.alice3.net/wp-content/uploads/2017/12/pluginzip.jpg"><img src="http://www.alice3.net/wp-content/uploads/2017/12/pluginzip-300x143.jpg" alt="" width="300" height="143" class="alignnone size-medium wp-image-3966" /></a>
　windowsであればこんな感じでZIPを作成します。


以上で無事ビルドができ、アプリの実行およびプッシュ通知の確認、AdMobの表示も問題なく実行できました。

### 最後に
　最近まで、たまたまNCMBとAdMobを同時に使うことがありませんでしたが、よく使われるのではと思います。
　Googleのplay-service-xxx系は色々と競合をおこしやすいのでやっかいなのですが、今回のは特に面倒で1日半ほど時間がかかりました。
　大概は、競合していそうなplay-service-xxx系を削除すればいけるのですがはまることが多くてやっかいです。