CryptoKit 在 iOS 版本低于 13 的手机上破解应用程序

Seb*_*ian 10 xcode ios swift apple-cryptokit

我刚刚开始使用 CryptoKit 来替换旧的库。我的计划是在运行 iOS 13 及更高版本的手机上替换它,并在低于 13 的 iOS 版本上仍然使用旧库。但是我无法让应用程序在 iOS 12.4 中启动而不崩溃。我已经删除了其他所有内容,只添加了这些简单的线条

if #available(iOS 13.0, *) {
    let nonce = try? AES.GCM.Nonce(data: iv)
}
Run Code Online (Sandbox Code Playgroud)

#available我认为是用于确保如果条件不符合也就是被跳过。

奇怪的是应用程序崩溃了,我从来没有调用包含这些线的网格,只是将它们放在应用程序的某个地方会导致它崩溃。

我还在顶部(有和没有if canImport(CryptoKit))导入了 CryptoKit并且我已经添加@available(iOS 13.0, *)到类中。

谁能告诉我“排除”代码的正确方法,或者对于较低的 iOS 版本,正确的方法是什么。我想一定可以使用 iOS 13 特定的功能,同时仍然通过“旧”方法保持向后兼容性?

另外,我使用的是 Xcode 11,但我想这可能很明显。

我得到的错误是:

dyld: Library not loaded: /System/Library/Frameworks/CryptoKit.framework/CryptoKit
Run Code Online (Sandbox Code Playgroud)

编辑:现在我也试过把它放在整个班级(包括导入)

#if canImport(CryptoKit)
#endif
Run Code Online (Sandbox Code Playgroud)

而且,我注意到这条线可以存在而不会使应用程序崩溃:

let key = SymmetricKey(data: Data())
Run Code Online (Sandbox Code Playgroud)

对称密钥也是 CryptoKit 的一部分

编辑 2:我发现弱链接可以解决问题。我尝试使用其他新(iOS 13)框架之一 CryptoTokenKit,但遇到了同样的问题。但是在这里我可以添加框架并将链接设置为可选,从而解决了问题。但是,当向应用程序添加框架时,CryptoKit 由于某种原因不可用。

kik*_*tas 26

正如这里所指出的,Xcode 没有正确添加CryptKit到链接框架列表中。要解决此问题,您必须-weak_framework在应用程序的目标中手动添加标志。

在此处输入图片说明