Xcode Framework
Framework 是 IOS 项目里面的一个第三方库,有点类似 C# 引用的第三方 DLL,这个 Framework(DLL)开发人员是可以自行打包,步骤稍微有些麻烦,过程有点类似手动配置Unity导出项目,不过由于是 Framework 类型的项目,所以有些配置有些不一样,不过大部分还是一样的。
封包
由于最近有个需求,需要把 Unity IOS项目 包装成 Framework(第三方库),这个过程我姑且称为 “封包”,这样可以加速上下文的阅读和理解。
人的一生都在浪。
注意:这篇文章只是告诉你如何编译成功,具体是否能运行到实际项目,还得从头文件和项目文件入手。
0x0 创建 Framework
首先我们准备一个 Default(默认)的 Framework 工程。File => New => Projeect… 创建一个 Cocoa Touch Framework
我这里采用的引用的方式,并不Copy到工程目录下面,因为后面如果有很多包,每个都Copy一份,那么磁盘会变的很大,但同时这样也有一个好处就是一个包所包含的Unity引擎是绝对的。
最后引入工程需要的默认第三方库,每个人的项目都大不相同,我的看起来是这样的:
0x1 配置 Framework 项目
上面我们创建了一个默认的 Empty项目,并且把Unity相关的东西都引入了进来,接下来我们就开始配置工程了,这很重要!!请仔细再仔细的看!!
General Configure:
Deployment Target 我们选择一个较低的版本来兼容支持,其他就默认。
Build Setting Configure:
Architectures Configure:
Architectures => Standard architectures
Build Active Architecture Only => No
Supported Platforms => iphoneos (删掉模拟器)
Build Options Configure:
Enbale Bitcode => No
Apple Clang - Language Configure:
C Language DIalect => C99[-std=c99]
Apple Clang - Language - C++ Configure:
C++ language Dialect => C++11[-std=c++11]
Apple Clang - Warnings - All languages
Mismatched Return Type => Yes
下面配置代码可以Copy直接粘贴
Other Linker Flags Configure:
//:configuration = Debug
OTHER_LDFLAGS = $(inherited) -weak_framework CoreMotion -ObjC
//:configuration = Release
OTHER_LDFLAGS = $(inherited) -weak_framework CoreMotion -ObjC
//:completeSettings = some
OTHER_LDFLAGS
Framework Search Patchs and Header Search Patchs and Library Search Patchs Configure:
//:configuration = Debug
FRAMEWORK_SEARCH_PATHS = $(inherited) $(PROJECT_DIR)/XXXXXXXX_framework $(SRCROOT)/XXXXXXXX_framework/Unity
HEADER_SEARCH_PATHS = $(inherited) $(SRCROOT)/ $(SRCROOT)/Unity/Libraries $(SRCROOT)/Unity/Libraries/libil2cpp/include $(SRCROOT)/Unity/Classes $(SRCROOT)/Unity/Classes/Native
LIBRARY_SEARCH_PATHS = $(inherited) $(PROJECT_DIR)/XXXXXXXX_framework $(SRCROOT)/Unity/Libraries $(SRCROOT)/Unity/Libraries/Plugins/iOS $(SRCROOT)/XXXXXXXX_framework/Unity $(SRCROOT)/Unity/Libraries/libil2cpp/include
//:configuration = Release
FRAMEWORK_SEARCH_PATHS = $(inherited) $(PROJECT_DIR)/XXXXXXXX_framework $(SRCROOT)/XXXXXXXX_framework/Unity
HEADER_SEARCH_PATHS = $(inherited) $(SRCROOT)/ $(SRCROOT)/Unity/Libraries $(SRCROOT)/Unity/Libraries/libil2cpp/include $(SRCROOT)/Unity/Classes $(SRCROOT)/Unity/Classes/Native
LIBRARY_SEARCH_PATHS = $(inherited) $(PROJECT_DIR)/XXXXXXXX_framework $(SRCROOT)/Unity/Libraries $(SRCROOT)/Unity/Libraries/Plugins/iOS $(SRCROOT)/XXXXXXXX_framework/Unity $(SRCROOT)/Unity/Libraries/libil2cpp/include
//:completeSettings = some
FRAMEWORK_SEARCH_PATHS
HEADER_SEARCH_PATHS
LIBRARY_SEARCH_PATHS
Other C Flags and Other C++ Flags Configure:
//:configuration = Debug
OTHER_CFLAGS = $(inherited) -DINIT_SCRIPTING_BACKEND=1 -fno-strict-overflow -DNET_4_0 -DRUNTIME_IL2CPP=1
OTHER_CPLUSPLUSFLAGS = $(inherited) $(OTHER_CFLAGS) -ObjC
//:configuration = Release
OTHER_CFLAGS = $(inherited) -DINIT_SCRIPTING_BACKEND=1 -fno-strict-overflow -DNET_4_0 -DRUNTIME_IL2CPP=1
OTHER_CPLUSPLUSFLAGS = $(inherited) $(OTHER_CFLAGS) -ObjC
//:completeSettings = some
OTHER_CFLAGS
OTHER_CPLUSPLUSFLAGS
最后右上角增加:
//:configuration = Debug
GCC_THUMB_SUPPORT = NO
GCC_USE_INDIRECT_FUNCTION_CALLS = NO
PROVISIONING_PROFILE =
UNITY_CLOUD_PROJECT_ID =
UNITY_RUNTIME_VERSION = 2017.4.29f1
UNITY_SCRIPTING_BACKEND = il2cpp
USYM_UPLOAD_AUTH_TOKEN =
USYM_UPLOAD_URL_SOURCE = https://perf-events.cloud.unity3d.com/url
//:configuration = Release
GCC_THUMB_SUPPORT = NO
GCC_USE_INDIRECT_FUNCTION_CALLS = NO
PROVISIONING_PROFILE =
UNITY_CLOUD_PROJECT_ID =
UNITY_RUNTIME_VERSION = 2017.4.29f1
UNITY_SCRIPTING_BACKEND = il2cpp
USYM_UPLOAD_AUTH_TOKEN =
USYM_UPLOAD_URL_SOURCE = https://perf-events.cloud.unity3d.com/url
//:completeSettings = some
GCC_THUMB_SUPPORT
GCC_USE_INDIRECT_FUNCTION_CALLS
PROVISIONING_PROFILE
UNITY_CLOUD_PROJECT_ID
UNITY_RUNTIME_VERSION
UNITY_SCRIPTING_BACKEND
USYM_UPLOAD_AUTH_TOKEN
USYM_UPLOAD_URL_SOURCE
Prefix Header配置成Class文件夹下的Prefix文件,删掉Libraries目录下IL2CPP的引用。
开始编译ing…
成功!!这篇文章只是告诉你如何编译成功,具体是否能运行到实际项目,还得从头文件和项目文件入手。
Error:
dyld: Symbol not found: _OBJC_CLASS_$_QdazzleOpenUDID
Referenced from: /private/var/containers/Bundle/Application/274FF7C5-965F-4A5A-BF8F-4C1556B99727/framework_test.app/Frameworks/xx_framework.framework/xx_framework
Expected in: flat namespace
in /private/var/containers/Bundle/Application/274FF7C5-965F-4A5A-BF8F-4C1556B99727/framework_test.app/Frameworks/xx_framework.framework/xx_framework
0x1:工程默认是开启ARC编译,找到对应文件,关闭ARC编译。(-fno-objc-arc)
0x2.1:可选错误,可以尝试把Mach-O Type 从 Dynamic Library 换成 Static Library。
0x2.2:可选错误("__mh_execute_header"),更新 Other Linker Flags => -undefined dynamic_lookup
0x3:找到对应的 *.mm | *.m | *.cpp文件,放在 Compile Souces 选项下。
0x4:( il2cpp::os::Image::initializeManagedSection() )Unity 的问题,一般发生在版本低于2018.2.1(至于是否修复,尚且不知。Unity Issue Tracker)。