iOS動的リンク設定アプリへの導入方法 - glossom-dev/AdfurikunSDK-Unity GitHub Wiki

アドフリくんUnity SDKでは、導入時のDependency Managerの設定(Unityのメニューバーより、Assets -> External Dependency Manager -> iOS Resolver -> Settings)で「Link frameworks statically」のチェックを付けて静的リンクで導入する必要がありますが、アプリの他依存ライブラリでチェックを外す動的リンクにする必要がある場合は設定が衝突してしまいます。
この場合は、アドフリくんで依存している静的リンクで導入が必要なアドネットワーク(AppLovin、Maio、Pangle)のみDependency Manager/CocoaPodsを利用せず手動で導入し、他のADNW/ADF SDKは従来通りDependency Manager/CocoaPodsで導入する事で解決出来ます。
※ AppLovin / Maio / Pangleを利用しない場合は、以下の対応を行わずに「Link frameworks statically」のチェックを外して導入する方法で問題ありません。

CocoaPodsで動的リンク設定が必要なアプリへの導入方法

  1. SDKの導入ページの手順 4までを行います。(AdfurikunDependencies.xmlの入れ替えまで)
  2. Assets/Editor内の「AdfurikunDependencies.xml」内のiOSのAppLovin / Maio / Pangle部分を削除します。
Assets/Editor/AdfurikunDependencies.xml内の以下行を削除
    <iosPod name="AdfurikunSDK-iOS/AppLovin" minTargetSdk="12.0" version="x.y.z"/>
    <iosPod name="AdfurikunSDK-iOS/Maio" minTargetSdk="12.0" version="x.y.z"/> 
    <iosPod name="AdfurikunSDK-iOS/Pangle" minTargetSdk="12.0" version="x.y.z"/>
  1. Assets/Editor内の「AdfurikunMovieRewardPostProcess.cs」を↓以下内容に上書きします。
AdfurikunMovieRewardPostProcess.cs
#if UNITY_4_0 || UNITY_4_0_1 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9
#elif UNITY_IPHONE || (UNITY_2018_1_OR_NEWER && UNITY_ANDROID)

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.iOS.Xcode;
using UnityEditor.iOS.Xcode.Extensions;
using System.IO;

public class AdfurikunMovieRewardPostProcess {
    
    private static bool useAdMob = true;
    
    // ビルド時に実行される
    [PostProcessBuild]
    public static void OnPostprocessBuild(BuildTarget buildTarget, string path) {
        
        if (buildTarget == BuildTarget.iOS) {
            
            string projectPath = PBXProject.GetPBXProjectPath(path);
            PBXProject project = new PBXProject();
            project.ReadFromFile(projectPath);
            string mainTargetGuid = project.GetUnityMainTargetGuid();
            
            // AdMobを導入する場合、plistにGADApplicationIdentifierを設定するようにする
            if(useAdMob){
                string plistPath = Path.Combine (path, "Info.plist");
                var plist = new PlistDocument ();
                plist.ReadFromFile (plistPath);
                // AdMob管理画面で発行されているGADApplicationIdentifierを設定する
                string applicationIdentifier = "ca-app-pub-3940256099942544~1458002511";
                plist.root.SetString("GADApplicationIdentifier", applicationIdentifier);
                plist.WriteToFile (plistPath);
            }
            
            string target;
            var unityFrameworkTargetGuidMethod = project.GetType().GetMethod("GetUnityFrameworkTargetGuid");
            if (unityFrameworkTargetGuidMethod != null) {
                target = (string)unityFrameworkTargetGuidMethod.Invoke(project, null);
            } else {
                target = project.TargetGuidByName("Unity-iPhone");
            }
            
            string frameworkSuffix = "tbd";
            
            // AppLovin
            project.AddFrameworkToProject(target, "AdSupport.framework", false);
            project.AddFrameworkToProject(target, "AVFoundation.framework", false);
            project.AddFrameworkToProject(target, "CoreTelephony.framework", false);
            project.AddFrameworkToProject(target, "CoreGraphics.framework", false);
            project.AddFrameworkToProject(target, "CoreMedia.framework", false);
            project.AddFrameworkToProject(target, "Audiotoolbox.framework", false);
            project.AddFrameworkToProject(target, "SystemConfiguration.framework", false);
            project.AddFrameworkToProject(target, "SafariServices.framework", false);
            project.AddFrameworkToProject(target, "StoreKit.framework", false);
            project.AddFrameworkToProject(target, "UIKit.framework", false);
            project.AddFrameworkToProject(target, "WebKit.framework", false);
            project.AddFileToBuild(target, project.AddFile("usr/lib/libz."+frameworkSuffix, "libz."+frameworkSuffix, PBXSourceTree.Sdk));
            
            // Maio
            project.AddFrameworkToProject(target, "AdSupport.framework", false);
            project.AddFrameworkToProject(target, "AVFoundation.framework", false);
            project.AddFrameworkToProject(target, "MobileCoreServices.framework", false);
            project.AddFrameworkToProject(target, "CoreMedia.framework", false);
            project.AddFrameworkToProject(target, "StoreKit.framework", false);
            project.AddFrameworkToProject(target, "SystemConfiguration.framework", false);
            project.AddFrameworkToProject(target, "UIKit.framework", false);
            project.AddFrameworkToProject(target, "WebKit.framework", false);
            project.AddFileToBuild(target, project.AddFile("usr/lib/libz."+frameworkSuffix, "libz."+frameworkSuffix, PBXSourceTree.Sdk));
            
            // Pangle
            project.AddFrameworkToProject(target, "AdSupport.framework", false);
            project.AddFrameworkToProject(target, "AVFoundation.framework", false);
            project.AddFrameworkToProject(target, "WebKit.framework", false);
            project.AddFrameworkToProject(target, "StoreKit.framework", false);
            project.AddFrameworkToProject(target, "MobileCoreServices.framework", false);
            project.AddFrameworkToProject(target, "MediaPlayer.framework", false);
            project.AddFrameworkToProject(target, "CoreTelephony.framework", false);
            project.AddFrameworkToProject(target, "DeviceCheck.framework", false);
            project.AddFrameworkToProject(target, "SystemConfiguration.framework", false);
            project.AddFrameworkToProject(target, "CoreMotion.framework", false);
            project.AddFrameworkToProject(target, "CoreLocation.framework", false);
            project.AddFrameworkToProject(target, "CoreMedia.framework", false);
            project.AddFrameworkToProject(target, "Accelerate.framework", false);
            project.AddFrameworkToProject(target, "Security.framework", false);
            project.AddFileToBuild(target, project.AddFile("usr/lib/libresolv.9."+frameworkSuffix, "libresolv.9."+frameworkSuffix, PBXSourceTree.Sdk));
            project.AddFileToBuild(target, project.AddFile("usr/lib/libc++."+frameworkSuffix, "libc++."+frameworkSuffix, PBXSourceTree.Sdk));
            project.AddFileToBuild(target, project.AddFile("usr/lib/libz.1.2.5."+frameworkSuffix, "libz.1.2.5."+frameworkSuffix, PBXSourceTree.Sdk));
            project.AddFileToBuild(target, project.AddFile("usr/lib/libsqlite3.0."+frameworkSuffix, "libsqlite3.0."+frameworkSuffix, PBXSourceTree.Sdk));
            project.AddFileToBuild(target, project.AddFile("usr/lib/libxml2."+frameworkSuffix, "libxml2."+frameworkSuffix, PBXSourceTree.Sdk));
            project.AddFileToBuild(target, project.AddFile("usr/lib/libbz2."+frameworkSuffix, "libbz2."+frameworkSuffix, PBXSourceTree.Sdk));
            project.AddFileToBuild(target, project.AddFile("usr/lib/libiconv."+frameworkSuffix, "libiconv."+frameworkSuffix, PBXSourceTree.Sdk));
            project.AddFileToBuild(target, project.AddFile("usr/lib/libc++abi."+frameworkSuffix, "libc++abi."+frameworkSuffix, PBXSourceTree.Sdk));
            
            //@try利用のため
            project.SetBuildProperty(target, "GCC_ENABLE_OBJC_EXCEPTIONS", "YES");
            project.SetBuildProperty(target, "CLANG_ENABLE_OBJC_EXCEPTIONS", "YES");
            
            // フレームワーク検索パスの設定
            project.SetBuildProperty(target, "FRAMEWORK_SEARCH_PATHS", "$(inherited)");
            // Frameworks/Plugins/iOS/**/*.framework
            // Use ** to make search setting in Xcode recursive
            project.AddBuildProperty(target, "FRAMEWORK_SEARCH_PATHS", "$(PROJECT_DIR)/Frameworks/Plugins/iOS/**");
            
            //エクスポート時に文字列のパスが加えられること(Unity由来の事象)への対応
            project.UpdateBuildProperty (target, "HEADER_SEARCH_PATHS",
                                         new string[]{"$(SRCROOT)/Classes", "$(SRCROOT)"}, new string[]{"\"$(SRCROOT)/Classes\"", "\"$(SRCROOT)\""});
            project.UpdateBuildProperty (target, "LIBRARY_SEARCH_PATHS",
                                         new string[]{"$(SRCROOT)/Classes", "$(SRCROOT)"}, new string[]{"\"$(SRCROOT)/Classes\"", "\"$(SRCROOT)\""});
            // Set a custom link flag
            project.AddBuildProperty(target, "OTHER_LDFLAGS", "-ObjC");
            project.AddBuildProperty(target, "OTHER_LDFLAGS", "-fobjc-arc");
            // GNU11に設定
            project.AddBuildProperty(target, "GCC_C_LANGUAGE_STANDARD", "gnu11");
            
            // Write.
            project.WriteToFile(projectPath);
        }
    }
}
#endif
  1. アドフリくんiOS SDKを管理画面からダウンロードします。

  2. ダウンロードしたアドフリくんiOS SDK内の「adnetworks」フォルダからAppLovin / Maio / Pangle以外のフォルダを削除します。
    Sdk Setting

    Pangle/Pangle.embeddedframework/Frameworks/SDKフォルダ内の全xcframework内部の「ios-arm64_x86_64-simulator」フォルダを削除します。
    Sdk Setting

以下のコマンドでも削除出来ます。

# アドフリくんiOS SDK内のadnetworksディレクトリに移動
cd adnetworks

# AppLovin、Maio、Pangle以外を全て削除
rm -rf AdMob
rm -rf AdMob_below8.0.0
rm -rf AdMobMediationAdapter
rm -rf AdMobMediationAdapter_below9.0.0
rm -rf Afio
rm -rf FAN
rm -rf Five
rm -rf FiveCustomNativeAd
rm -rf Fyber
rm -rf IronSource
rm -rf MaxMediationAdapter
rm -rf Mintegral
rm -rf UnityAds
rm -rf Vungle

# Pangle/Pangle.embeddedframework/Frameworks/SDKフォルダ内のios-arm64_x86_64-simulatorを全て削除
rm -rf Pangle/Pangle.embeddedframework/Frameworks/SDK/*/*/ios-arm64_x86_64-simulator
  1. 「adnetworks」フォルダをUnityプロジェクトのAssets/Plugins/iOS内に追加します。

Sdk Setting

以上で完了です。Dependency Managerの設定で「Link frameworks statically」のチェックを外してもビルドが通るようになります。

⚠️ **GitHub.com Fallback** ⚠️