Xcode Framework


  Framework 是 IOS 项目里面的一个第三方库,有点类似 C# 引用的第三方 DLL,这个 Framework(DLL)开发人员是可以自行打包,步骤稍微有些麻烦,过程有点类似手动配置Unity导出项目,不过由于是 Framework 类型的项目,所以有些配置有些不一样,不过大部分还是一样的。

封包


  由于最近有个需求,需要把 Unity IOS项目 包装成 Framework(第三方库),这个过程我姑且称为 “封包”,这样可以加速上下文的阅读和理解。

人的一生都在浪。


注意:这篇文章只是告诉你如何编译成功,具体是否能运行到实际项目,还得从头文件和项目文件入手。

0x0 创建 Framework


  首先我们准备一个 Default(默认)的 Framework 工程。File => New => Projeect… 创建一个 Cocoa Touch Framework

ios封包插件 ios游戏封包_ios封包插件


图1   接下来我们调整下目录结构,让它更为的清晰的为我们工作。它看起来是这样的:

ios封包插件 ios游戏封包_第三方库_02


图2

  我这里采用的引用的方式,并不Copy到工程目录下面,因为后面如果有很多包,每个都Copy一份,那么磁盘会变的很大,但同时这样也有一个好处就是一个包所包含的Unity引擎是绝对的。

  最后引入工程需要的默认第三方库,每个人的项目都大不相同,我的看起来是这样的:

ios封包插件 ios游戏封包_第三方库_03


图3

0x1 配置 Framework 项目


  上面我们创建了一个默认的 Empty项目,并且把Unity相关的东西都引入了进来,接下来我们就开始配置工程了,这很重要!!请仔细再仔细的看!!

  General Configure

ios封包插件 ios游戏封包_ios封包插件_04


图4

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

  最后右上角增加:

ios封包插件 ios游戏封包_第三方库_05


图5

//: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:


ios封包插件 ios游戏封包_iOS_06


0x1



ios封包插件 ios游戏封包_Apple_07



0x2


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



0x3


ios封包插件 ios游戏封包_ios封包插件_08


0x4


  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)。