美文网首页
WCDB生成Mac Catalyst Framework

WCDB生成Mac Catalyst Framework

作者: hxxxs | 来源:发表于2023-08-28 10:34 被阅读0次

背景介绍

由于公司近期要开发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

结尾

分享仅为记录解决问题的过程,方便后期查找,如有侵权请联系我。

相关文章

网友评论

      本文标题:WCDB生成Mac Catalyst Framework

      本文链接:https://www.haomeiwen.com/subject/zqdgmdtx.html