ios - CryptoKit 在 iOS 版本低于 13 的手机上抓取应用程序

标签 ios swift xcode apple-cryptokit

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

if #available(iOS 13.0, *) {
    let nonce = try? AES.GCM.Nonce(data: iv)
}
#available我认为用于确保如果条件未满足,则跳过它。

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

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

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

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

我得到的错误是:
dyld: Library not loaded: /System/Library/Frameworks/CryptoKit.framework/CryptoKit

编辑:现在我也尝试将它放在整个类(class)(包括导入)
#if canImport(CryptoKit)
#endif

而且,我注意到这条线可以存在而不会使应用程序崩溃:
let key = SymmetricKey(data: Data())

对称 key 也是 CryptoKit 的一部分

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

最佳答案

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

enter image description here

关于ios - CryptoKit 在 iOS 版本低于 13 的手机上抓取应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58287922/

相关文章:

ios - 在函数外部传递变量以在 Swift 3 中使用

ios - swift 自动布局 : constraints in sub-view not working

xcode - 建立存档无效

xcode - 我可以阻止 Xcode 在遇到异常时显示 main.m 吗?

ios - Itunes Connect - "Submit for Review"似乎没有做任何事情

objective-c - Objective-C initWithNibName

ios - 数字协议(protocol)的通用扩展

iOS 参数标签 '(named:)' 不匹配任何可用的重载

'function' 的类型冲突和函数 'function' 的隐式声明在 C99 中无效

iphone - SQLite 的 NSArray 绘制 CGRects