Open7

dylibを使用する方法

ちゃあちゃあ

dylibはxcframeworkに入れたとて、app store connectを通過することはできない。

'''
ITMS-90429: Invalid Swift Support - The files libswiftDarwin.dylib, libswiftMetal.dylib, libswiftCoreAudio.dylib, libswiftsimd.dylib, libswiftQuartzCore.dylib, libswift_Concurrency.dylib, libswiftos.dylib, libswiftObjectiveC.dylib, libswiftDispatch.dylib, libswiftCoreGraphics.dylib, libswiftCoreFoundation.dylib, libswiftUIKit.dylib, libswiftCoreMedia.dylib, libswiftAVFoundation.dylib, libswiftCore.dylib, libswiftFoundation.dylib, libswiftCoreImage.dylib aren’t at the expected location /Payload/Runner.app/Frameworks. Move the file to the expected location, rebuild your app using the current public (GM) version of Xcode, and resubmit it.
'''
https://stackoverflow.com/questions/48701584/how-to-properly-embed-3rd-party-dylib-files-in-ios-app-project-for-app-store-re

上記に対策法が書いてあったので、実際に試してみる。

ちゃあちゃあ
lipo -create  mylib.dylib -output mylib

上記コマンドで .dylib という拡張子を外せます。

> otool -L mylib
mylib (architecture x86_64):
        @rpath/mylib.dylib (compatibility version 0.0.0, current version 0.0.0)
        @rpath/mydependlib.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0)

otool -L で依存関係を確認できます。
上記のままではdylibを探してしまっているので変更する必要があります。ここでは、mylib.dylib は自分自身でmydependlib.dylibはmylib.dylibが依存している共有ライブラリです。

install_name_tool -id @rpath/mylib.framework/mylib mylib
install_name_tool -change @rpath/mydependlib.dylib  @rpath/mydependlib.framework/mydependlib mylib 

上記で参照先をdylibなしの方に変更できます。

ちゃあちゃあ
Could not build the precompiled application for the device.
Error (Xcode): Cycle inside Runner; building could produce unreliable results.
~~~
○ That command depends on command in Target 'Runner': script phase “[CP] Embed Pods Frameworks”
○ That command depends on command in Target 'Runner': script phase “Thin Binary”
~~~

そのままでは上記のエラーが出てしまうので、Build Phaseの順番を変更する必要があります。

ちゃあちゃあ

Info.plistの MininumOSVersionについて

 vtool -show mylib

上記コマンドでそのバイナリのminosが確認できます

ちゃあちゃあ

lipoでdylibを無くすことで DynamicLibrary.process() を使えるようになり、 App Store Connectが通るようになった

ちゃあちゃあ

下記リポジトリを見ればios向けのビルド方法が書いてあります。
https://github.com/leetal/ios-cmake

cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=OS64COMBINED
cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=SIMULATORARM64
cmake --build . --config Release
cmake --install  . --config Release
ちゃあちゃあ
❯ lipo -info mylib
Architectures in the fat file: mylib are: arm64 

上記で architectureの確認が可能です。