지난 번에 Facebook
심사를 위한 앱검수 얘기를 했었는데요. 페이스북 권한을 사용하는 컨텐츠를 동영상으로 촬영해야 된다고 말씀드렸습니다. 그리고 iOS의 경우는 시뮬레이터 빌드를 준비해야 되구요. 현재 하고있는 프로젝트는 cocos2d-x
엔진을 사용하고 있는 오래된 게임입니다. 그런데 프로젝트에 문제가 생겼습니다.
최초 Facebook SDK
를 홈페이지에서 다운로드 하였는데요. carthage(카르타고)
로 Facebook SDK Framework가 빌드되어있었습니다. carthage로 동적 라이브러리로 관리가 되고있었는데요. 기존에 프로젝트에는 모두 static 정적 라이브러리가 적용되어있었습니다. carthage로 빌드된 라이브러리는 사용된 적이 없었죠. 그래서 최신 Facebook sdk를 적용할 때에는 구글에 찾아보면서 적용을 했었습니다.
cocoapods
로 하려고도 했는데요. 비중이 작은 페이스북 하나 때문에 workspace
환경으로 변경하는게 좋지 않다고 생각했습니다. 기존에 셋팅들도 변경을 해야하고 ...
무튼 여기서 최초 문제가 발생했습니다. 아카이브 빌드에 Facebook SDK에 포함된 시뮬레이터용 아키텍쳐가 앱 배포 빌드에 포함이 되었습니다. 처음 겪는 일이라 많이 당황했는데요. 처음에는 시뮬레이터 아키텍쳐를 삭제를 하여서 우선 급하게 해결을 했습니다. 하지만 이렇게 되면 시뮬레이터에서는 페이스북 SDK가 있을 경우 빌드가 되지 않습니다.
lipo -remove i386 ./ios/Frameworks/FBSDKShareKit.framework/FBSDKShareKit -o ./ios/Frameworks/FBSDKShareKit.framework/FBSDKShareKit
lipo -remove x86_64 ./ios/Frameworks/FBSDKShareKit.framework/FBSDKShareKit -o ./ios/Frameworks/FBSDKShareKit.framework/FBSDKShareKit
라이브러리에 포함된 아키텍쳐를 보려면 lipo -info
를 사용하면 볼 수 있습니다.
가장 큰 문제점은 최신 Facebook SDK가 빌드에 포함되면 사내 크래시 로그용 sdk가 정상 동작하지 않았습니다. 여기서 많이 멘붕이 왔는데요. 도무지 이유를 알기가 쉽지 않았습니다. 이번에 SDK 업데이트 하기 전에는 페이스북 4.대 버전을 사용하고 있었고, 해당버전으로는 동작을 잘 하고 있었습니다.
iOS Facebook SDK Build Error
페이스북 깃허브에 들어가 보면 iOS SDK release 항목이 따로 있습니다. 처음 여기서 Facebook SDK static Framework를 받았습니다. Frameworks, Libraries, and Embedded Content에 포함시키고, Link Binary With Libraries에 추가 후 빌드를 돌렸습니다. 여기서 엄청난 양의 symbol 에러가 발생했습니다.
내용을 보면 swift관련된 것을 볼 수 있습니다. iOS Facebook SDK에 swift 내용이 포함되어서 발생한 에러라고 생각이 되었습니다.
Undefined symbol : _swift..., Undefined symbol : protocol descriptor for swift...
링크 제대로 안되었나 하면서 설정을 계속 바꿔보며 삽집을 했는데요, 결국 구글링을 열심히 해본 결과 빈.swift 파일을 추가하는 걸로 해결이 되었습니다. 그런데 여기서 끝난게 아니었습니다.
추가적으로 발생한 빌드 에러입니다. 똑같이 undefined symbol 에러였습니다.
Undefined symbol: _vDSP_vclip, _vDSP_vsadd, _vvexpf, _vDSP_sve, _vdsp_mmul, _vDSP_maxv, _vDSP__dotpr, vDSP_vsdiv
해당 에러는 Accelerate.framework
를 추가하면 해결이 되었습니다.
Bitcode
이렇게 빌드는 해결이 되었는데요. 크래시로그가 남지 않는 문제는 해결 되지 않았습니다. 사실 이게 해결 되었으면 기존에 Facebook SDK를 Static으로 변경 해보지도 않았을텐데요. 크래시 문제는 바로 정확히 어떤 기능을 하는지 완전한 이해가 된건 아닌데요. Zedd0202님 블로그 내용을 참고했습니다. Bitcode
때문이었습니다.
Facebook SDK에 Bitcode 플래그가 켜져있었고, 저희 프로젝트는 Bitcode 설정이 되어있지 않았는데요. 이게 포함이 되면서 크래시 발생시 문제가 되었던거 같습니다. 왜 이렇게 동작을 하는지에 대해서는 좀 더 자세히 찾아봐야할 거 같네요. Bitcode가 켜져있을 때에 BCSymbolMaps가 없으면 크래시 덤프가 hidden으로 표시된다는 글을 봤었는데요. 이러한 영향이지 않을까 추측은 하고 있습니다.
드디어 원인을 제대로 알았는데요.. 정말 허무하게도 페이스북 SDK의 자동 로깅 기능때문이었습니다. FacebookCoreKit를
보면 FBSDKCrashHandler
가 있습니다. 로그를 수집하면서 크래시 오류 정보까지 먼저 낚아채가는 거 같네요.. 이 부분을 그냥 넘어갔었는데 이게 화근이 되었습니다. Facdbook SDK 코드를 찾아보지 않았으면 더 오래 걸렸을 거 같네요.
자동 로깅을 비활성화 하려면 .plist</code<에 해당 내용 추가하면 됩니다.
<key>FacebookAutoLogAppEventsEnabled</key>
<false/>
게임 개발(컨텐츠, 게임 내부 기능)을 주로 하다보니, 이런 네이티브 관련 지식이 부족함을 느끼게 되네요... 역시 공부를 해야합니다!!!!