UnityアプリのiOS版にアドフリくんを導入する際にXCode上での操作をしたくないので頑張ってみた。

アドフリくんとは

アドフリくんとは、俗に言うSSPというものです。

SSPとはSupply Side Platform(サプライ サイド プラットフォーム)の略語で、簡単に言うといくつかあるアドネットワークから適したものを自動で選んでくれて収益を最大化してくれるツールです。

今回色々と事情があって自作のUnityアプリにアドフリくんを入れてみることにしました。

基本的には丁寧なマニュアルが用意されているので、それに従えば導入できます。

しかしiOS版の導入の仕方が、マニュアルそのままだとXCode上での操作がありちょっと手間なのでUnity上で全部やってしまえるように多少工夫しました。

それをここにメモしておきます。

ADFMovieReward.framework を追加

マニュアルでは、ADFMovieReward.framework をXcodeにドラッグ&ドロップします。

と書いていますが、ビルドのたびにいちいちXCode上で操作するのはめんどくさいです。Unity Cloud Buildもできなくなっちゃうし。

なので、ADFMovieReward.frameworkをAssets/Plugins/iOSの下にぶっこみます。

しかし、そのままだとエラーが出てしまいました。

'ADFMovieReward/ADFmyMovieReward.h' file not found

と言われてしまいます。

ファイルがどこにあるかわかんないのでエラーになってるようです。

ぶっこんだファイルがどこにいったかというと、$(PROJECT_DIR)/Frameworks/Plugins/iOS の下にあります。

なので、これをSearch Pathに入れてあげるため、以下のようなコードを書きます。

using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public static class XcodePostProcessBuild
{
    [PostProcessBuild]
    public static void OnPostProcessBuild(BuildTarget target, string path)
    {
        if (target != BuildTarget.iOS)
        {
            return;
        }

        var project = new PBXProject();
        project.ReadFromFile(PBXProject.GetPBXProjectPath(path));

        //Search Framework pathを追加
        string target_name = project.TargetGuidByName("Unity-iPhone");
        project.AddBuildProperty(target_name, "FRAMEWORK_SEARCH_PATHS", "$(PROJECT_DIR)/Frameworks/Plugins/iOS");
        project.WriteToFile(PBXProject.GetPBXProjectPath(path));
    }
}

これをXcodePostProcessBuild.csなどと名前をつけて、Assets/Editor以下に置いておきます。

-ObjC -fobjc-arc フラグを追加

Other Linker Flagsに-ObjCと-fobjc-arcを指定とあるので、これをframeworkを選択してinspectorから設定します。
Compile flagsと書いているけれどもOther Linker Flagsにちゃんと追加されるみたい。

f:id:wkpn:20170621212513p:plain


他のAdNetworkのframeworkも容赦なくぶっこむ

ADFMovieReward.frameworkを入れただけでは、各社の広告は表示されません。各社のAdNetworkプラグインもインストールする必要があります。

これもマニュアルによると、XCode上でドラッグ・アンド・ドロップというふうに書かれていますがめんどくさいのでAssets/Plugins/iOSに予めぶっこんどきます。

フォルダ階層が深いものもありますが、中から引き出してぶっこみます。

こんな感じ。

f:id:wkpn:20170621212439p:plain


Privacy Descriptionの追加

このままで来たバイナリをAppleに提出すると、Privacy Descriptionがないよっと怒られます。
Cameraに関するDescriptionは最近のUnityではPlayer Settingsで記述できますので、そちらで書いておきます。

こんな感じ。

f:id:wkpn:20170621212549p:plain

Calendarsにもアクセスが入るようです。そちらに関してはスクリプトで追加します。先のOnPostProcessBuildに以下を追加します。

// Add Privacy Description For Adfurikun
var plistPath = Path.Combine(path, "Info.plist");
var plist = new PlistDocument();
plist.ReadFromFile(plistPath);
plist.root.SetString("Privacy - Calendars Usage Description", "Advertisement would like to use Calendars.");
plist.WriteToFile(plistPath);

まとめ

以上で完了。なんとかXCode上で何もしなくて良くなりました!

その他

この作業をしている途中で、

ld: library not found for -lPods-Unity-iPhone

というエラーに悩まされたのですが、Unityを最新版にしたら解決しました。
Unityを最新にせずに、XCodeのバージョンを上げたのが問題だったのかも...