Mac Catalyst 初步体验+排坑

19 篇文章 0 订阅
6 篇文章 0 订阅

Mac Catalyst 是苹果在今年WWDC上发布的一个帮助开发者将iPad 应用移植到macOS上的服务。苹果在发布会上说这将会是一个“一键式的操作”,“只需要稍加优化就可以完美在mac上运行”。于是,我在macOS正式发布之后的第一天,便迫不及待地尝试了一番。

部署过程非常轻松愉快。只要在新版Xcode中的Target选单中勾选Mac,就可以创造出一个在Mac上完美运行的App。

如果真有这么简单就好了Orz。

事实情况是,在我勾选这一选项之后,Xcode就立马报了几十个错误(...)。经过2周的不断尝试,我才总算把Bug给解决完了。下面是我遇到的几个错误以及(临时)解决方法,希望对其他遇到同样问题的人能有帮助。

1 Pods 相关

1.1 关于Bundle 签名

与iOS不同,所有在mac上运行的bundle都需要签名(sign)。

Bundle 的图标长这样

所以你如果在cocoapods里面有任何bundle,都需要在Sign & Capabilities下勾选Sign相关的选项。

但是这还没完。如果你就这样直接上传App Store的话,App Store 会亲切地给你发一封邮件,告诉你你的App 有如下问题。

ITMS-90284: Invalid Code Signing- The executable 'XXX.app/Contents/Frameworks/XXX.framework/Versions/A/Resources/XX.bundle' must be signed with the certificate that is contained in the provisioning profile.

这是因为Xcode默认创建的签名是开发用的,如果要创建生产用签名,需要在Bundle的Sign界面下的Signing Certificate中选取Sign to Run Locally。

1.2 Firebase 全系不兼容

这个目前没有简单的解决办法。如果你是使用Cocoapods 安装的Firebase,那么会提示如下问题

Building for Mac Catalyst, but the linked framework 'FirebaseCore.framework' was built for iOS + iOS Simulator. You may need to restrict the platforms for which this framework should be linked in the target editor, or replace it with an XCFramework that supports both platforms.

鉴于Firebase 目前并没有XCFramework的版本,目前Mac 端是完全无法使用Firebase的。所以有这一需要的开发者请暂缓使用此项目。

至于我只是用Firebase 做用户分析,所以有没有mac版本无所谓。对于像我这样的项目来说,(暂时)解决方法如下:

  1. 在Cocoapods中删除有关Firebase的插件并从官网手动安装
  2. 在Target设置中的Framework选项下,将Firebase 相关插件改为iOS only。

3. 在所有使用到Firebase的地方加入targetEnvironment(macCatalyst)的检查

// 这个
import FirebaseCore

// 变成这样
#if !targetEnvironment(macCatalyst)
    import FirebaseCore
#endif

这只是暂时的解决办法,希望Firebase能够早日加入Mac Catalyst的支持。

PS: 目前的适配进度可以在此处查到。

1.3 p2.OAuth2 不兼容

解决方法同上

2 App 自身

2.1 kAudioSessionOverrideAudioRoute_Speaker 在Mac上无法使用

这个似乎也没什么好的解决办法。不过这也不是个很重要的功能,于是我就在mac上把这行删掉了(方法同上)。

2.2 Script 不兼容mac

与Firebase类似,在编译时运行的一些Scipt也可能不支持Mac。用以下代码块把这些Script包住就可以了。

if SDKROOT != "macosx"; then
  // 你的Script
fi

2.3 Main Bundle 路径不同

当Mac App调用Main Bundle的资源文件时,有的时候会莫名指向App的根目录(那里除了一个Contents文件夹什么都没有)。我目前的解决方案如下:

var path = Bundle.main.bundlePath + "/Contents/Resources/" + fileName
#if !targetEnvironment(macCatalyst)
    path = Bundle.main.bundlePath + "/" + fileName
#endif

或者,根据 

@破音特委屈

 提供的建议,也可以把所有的BundlePath改为resourcePath,即:

let path = Bundle.main.bundlePath + "/" + fileName
// 改为
let path = Bundle.main.resourcePath! + "/" + fileName // 或者resourceURL

2.4 各种莫名其妙的错误

很多时候这些错误就是Xcode的Bug,只要Clean Build Folder/重新勾选Mac就可以了。

如果还不行的话,那就重启试试(雾

2.5 Missing Maps Entitlement

为什么把这个放最后呢?是因为这个其实算不上问题。你如果调用了MapsKit,上传至App Store之后你就会收到如下Warning:

ITMS-90192: Missing Entitlement- App contains references to [Maps] in 'Contents/MacOS/XXX', but is missing the required entitlement 'com.apple.developer.maps'.

(当然程序员是永远不会看warning的.jpg)

但是实际上,在OS X 10.13之后,使用MapsKit就不需要Entitlement了。而我们Mac Catalyst 的程序显然是面向10.15+的,所以这个提示其实毫无意义。

至于为什么会有,我也不知道(估计又是个bug

 

说完了一大堆坑,现在来说说体验。

总体来讲,排完坑之后的Mac Catalyst的运行体验还是很舒适的。运行速度差不多相当于原生应用,各种UI操作也有针对macOS的自动适配,没有模拟机的感觉。对于有闲心排bug的程序员来说,这是一个绝佳的将用户群拓展到Mac用户的机会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值