CryptoKit взламывает приложение на телефонах с версией iOS ниже 13
Я только начал использовать CryptoKit для замены старой библиотеки. Я планировал заменить его на телефонах под управлением iOS 13 и выше и по-прежнему использовать старую библиотеку в версиях iOS ниже 13. Однако я не могу заставить приложение даже запускаться в 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, *)
к классу.
Может ли кто-нибудь подсказать мне, как правильно "исключить" код, или как бы то ни было, для более ранних версий iOS. Я полагаю, должна быть возможность использовать специфические для iOS 13 функции, сохраняя при этом обратную совместимость с помощью "старых" методов?
Кроме того, я использую Xcode 11, но, думаю, это очевидно.
И ошибка, которую я получаю:
dyld: Library not loaded: /System/Library/Frameworks/CryptoKit.framework/CryptoKit
РЕДАКТИРОВАТЬ: Теперь я также попытался разместить это вокруг всего класса (включая импорт)
#if canImport(CryptoKit)
#endif
Кроме того, я заметил, что эта строка может существовать без сбоя приложения:
let key = SymmetricKey(data: Data())
И симметричный ключ также является частью CryptoKit.
РЕДАКТИРОВАТЬ 2: Я понял, что слабое связывание решит проблему. Я попытался использовать один из других новых (iOS 13) фреймворков, CryptoTokenKit, и столкнулся с той же проблемой. Но здесь я мог добавить фреймворк и установить ссылку на необязательную, что решило проблему. Однако при добавлении фреймворков в приложение CryptoKit по каким-то причинам недоступен.
1 ответ
Как указано здесь, Xcode неправильно добавляетCryptKit
в список связанных фреймворков. Чтобы решить эту проблему, необходимо вручную добавить-weak_framework
флаг в цели вашего приложения.