[iOS/RuntimeError] Library not loaded: @rpath/FBAEMKit.framework
----------------------------------------------------
Unity 2020.3.27f1
Xcode 13.2.1
FBAEMKit 12.2.1
FBSDKCoreKit 12.2.1
FBSDKCoreKit_Basics 12.2.1
FBSDKLoginKit 12.2.1
GoogleMobileAds 6.1.2
GoogleMobileAds-FacebookUnityAdapter-3.6.0
----------------------------------------------------
회사 플랫폼에서 Firebase Auth를 쓰면서 FBSDK(12.2.1) framework 가 들어가게 됐는데,
여기서 광고를 쓰기 위해 GoogleMoblieAds(6.1.2)를 추가하고,
페이스북 광고를쓰기위해 GoogleMobileAds의 미디에이션인 FacebookUnityAdapter(3.6.0)을 추가했는데..
Android는 잘되는데 iOS에서 에러 남.
플러그인 추가 진행 상황은 아래와 같다.
----------------------------------------------------
1) 플랫폼 SDK 추가하면서 FBSDK(12.2.1) 추가
1.1)Plugins/iOS에 프레임워크 추가 돼 있음(FBAEMKit.framework/FBSDKCoreKit.framework/FBSDKCoreKit_Basics.framework/FBSDKLoginKit.framework)
2) GoogleMobileAds(6.1.2) 추가 -> 빌드 잘 됨
3) GoogleMobileAds-FacebookUnityAdapter(3.6.0) 추가 -> 빌드 에러
3.1) [에러메시지] Undefined Symbols for architecture arm64: "_OBJC_CLASS_$_GAD...
3.2) [해결방법] Unity Editor-Menu-External Dependency Manager-iOS Resolver-Settings : Link frameworks statically <- 체크
3.3) [참조] https://blueasa.tistory.com/2587
4) 3) 해결 후, 빌드는 되는데 런타임에서 에러 남 -> 런타임 에러
4.1) [에러메시지] Library not loaded: @rpath/FBAEMKit.framework...
4.1.1) [추천] 4.2.4 방식 먼저 시도
4.2.) [해결방법] 구글링 하다보니 아래와 같은 내용이 있음.
4.2.1) General->Frameworks, Library, and Embedded Content. If it's "Do Not Embed", change to "Embed Without Signing"
(참조: https://stackoverflow.com/questions/58144104/xcode11-dyld-library-not-loaded-reason-image-not-found)
4.2.2) 빌드하고 수정하긴 그래서 XcodePostProcessor.cs에 아래 내용을 추가함.
(처음엔 weak 파라미터를 false로 추가해봤었는데 여전히 런타임 에러 남)
[추가소스]
/// Initialize PbxProject
var projectPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
PBXProject pbxProject = new PBXProject();
pbxProject.ReadFromFile(projectPath);
string targetGuid = pbxProject.GetUnityFrameworkTargetGuid();
// 플랫폼 SDK에서 아래 4개 프레임워크를 추가해놔서 여기서도 4개 추가시킴
pbxProject.AddFrameworkToProject(targetGuid, "FBAEMKit.framework", true); // weak 부분을 true로 넘김
pbxProject.AddFrameworkToProject(targetGuid, "FBSDKCoreKit.framework", true);
pbxProject.AddFrameworkToProject(targetGuid, "FBSDKCoreKit_Basics.framework", true);
pbxProject.AddFrameworkToProject(targetGuid, "FBSDKLoginKit.framework", true);
4.2.3) 위의 4.2.2) 방법이 안된다면 (스크립트로 프레임워크 추가를 안하고) 직접 넣어도 됨
직접 넣는 건 아래 링크에서 원하는 버전의 FacebookSDK-Static_XCFramework를 다운받아서 추가.
(iOS는 받아서 압축풀어보면 여러개의 폴더가 나오는데 ios-arm64(또는 ios-arm64_armv7) 폴더를 사용하면 된다)
[링크] https://github.com/facebook/facebook-ios-sdk/releases
4.2.3.1) static 프레임워크 추가하고 Undefined symbol: _vDSP 에러가 나면 Accelerate.framework도 추가하자.
[참조] https://minmong.tistory.com/242
4.2.4) 최근(2023-05-10)에 FacebookSDK 버전을 올리려고 확인 해보면서 FacebookSDK_Dynamic.xcframework를 적용해봤는데 이걸로 해도 잘되는 것 같다.
4.2.4.1) FacebookSDK_Dynamic.xcframework 추가
4.2.4.2) 기존 Dependencies.xml은 버전 맞춰 주기(난 15.0.0으로 맞춤)
[참조] <iosPod name="FBSDKLoginKit" version="15.0.0" minTargetSdk="12.0"> </iosPod>
5) 4)까지 하고 빌드하니 런타임에서도 에러 안나고 잘 됨. -> 빌드 잘 됨
6) 빌드 성공!
[첨언]
결론적으로 GoogleMobileAds가 Static Framework을 강제(Link frameworks statically)하면서 생기는 문제로 보인다.
결국 GoogleMobileAds를 사용해야 된다면 dynamic framework 추가 방식은 불가능하므로, Facebook 관련 SDK 소스를 직접 추가(4.2.3)하는게 맞는 것 같다.