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 флаг в цели вашего приложения.

введите описание изображения здесь

Другие вопросы по тегам