背景介绍
由于公司近期要开发Mac版本应用,经过调研决定通过使用Mac Catalyst进行开发工作(学习成本相对较小),现有项目使用的是WCDB-1.0.8.2版本,由于对项目中对该版本进行很多二次封装且不是通过pod等方式导入(framework),现在在Mac项目中为了方便使用二次封装的Framework库只能对WCDB库重新进行framework导出工作,过程遇到过很多问题。如编译过程中仅能导出x86_64的framework,后续打包需要用到arm64等,特此记录。
WCDB-1.0.8.2版本相关库下载
由于公司网链接github非常慢,很多时候无法正常打开链接,所以在gitee上创建了WCDB的镜像库,下载到本地后打开项目发现WCDB还引用了另一个库sqlcipher,通过gitee上对应的tag号跳转过去下载即可。
image.png
打开应用解决编译问题
由于我们之前项目中使用的是OC库,这里我们打开wcdb-v1.0.8.2/objc/WCDB.xcodeproj
image.png
打开后发现缺少sqlcipher.preprocessed,解压刚下载的sqlcipher库(需要对tag版本),修改文件名称为sqlcipher,放置到wcdb-v1.0.8.2文件夹中替换原来的sqlcipher文件夹(原文件夹为空),文件夹整体替换或者将内容拷贝到对应文件夹都可。
image.png
OK,准备工作完成,打开工程,发现可以编译。
image.png
生成Mac Catalyst对应的framework
TARGETS -> WCDB -> General -> Supported Destinations 添加支持Mac Catalyst配置
image.png
添加完成后可以选择Mac
image.png
command + B进行编译发现报错,可一看到提示sqlcipher有文件未找到,可能是sqlcipher项目也需要添加Mac Catalyst配置
image.png
修改sqlcipher.preprocessed工程配置,同WCDB工程
image.png
修改后继续编译,发现仍然报错,提示gethostuuid,在Mac Catalyst上不可用
image.png
既然不可用那我们就将它过滤掉,通过搜索发现gethostuuid的定义位置代码如下
#if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \
(__IPHONE_OS_VERSION_MIN_REQUIRED > 2000))
# if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \
&& (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0))
# define HAVE_GETHOSTUUID 1
# else
//# warning "gethostuuid() is disabled."
# endif
#endif
我们添加一个过滤条件TARGET_OS_UIKITFORMAC ,修改后代码如下
#if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \
(__IPHONE_OS_VERSION_MIN_REQUIRED > 2000))
# if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \
&& (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0)) \
&& !defined(TARGET_OS_UIKITFORMAC)
# define HAVE_GETHOSTUUID 1
# else
//# warning "gethostuuid() is disabled."
# endif
#endif
修改后继续编译,发现报错信息又改了,变成了Undefined symbol: _UIApplicationDidReceiveMemoryWarningNotification
image.png
个人理解应该是Mac Catalyst发送内存告警通知的地方有问题,全局搜索下WCDB代码中对UIApplicationDidReceiveMemoryWarningNotification通知的处理发现在WCTDatabase.mm文件中对通知进行处理了,发现它代码中过滤掉了Apple Watch,那我们也试着将Mac Catalyst过滤掉,修改代码如下
//#if TARGET_OS_IPHONE && !TARGET_OS_WATCH
#if TARGET_OS_IPHONE && !TARGET_OS_WATCH && !TARGET_OS_UIKITFORMAC
编译下试试,发现可以编译通过了,OK我们搞定了第一步
framework导出
我们发现WCDB工程编译后没发现Products文件夹,我们可以通过修改project.pbxproj文件将Products展示出来
image.png
双击打开project.pbxproj文件搜索mainGroup,将mainGroup的值复制给productRefGroup
image.png
回到项目中发现Products文件夹出来了Show in Finder,我们就可以获取到framework了,但是通过打印发现这个framework仅支持x86_64,开发过程中正常运行是没有问题的,但是无法Archive
image.png
解决导出的framework不支持arm64
分别修改WCDB和sqlcipher工程Build Settings -> Base SDK 和 Supported Platforms 改为iOS
image.png
分别修改WCDB和sqlcipher工程Build Settings -> Build Active Architecture Only 改为No
image.png
分别修改WCDB和sqlcipher工程Build Settings ->VALID_ARCHS 改为x86_64 arm64
image.png
最后在进行编译,编译完成后打印framework信息,OK完成了,支持x86_64,arm64
image.png
结尾
分享仅为记录解决问题的过程,方便后期查找,如有侵权请联系我。
网友评论