CryptoKit ломает приложение на телефонах с версией iOS ниже 13 - PullRequest
2 голосов
/ 08 октября 2019

Я только начал использовать CryptoKit для замены старой библиотеки. Мой план состоял в том, чтобы заменить его на телефонах с iOS 13 и выше, и все еще использовать старую библиотеку на iOS версий ниже 13. Однако я не могу заставить приложение даже запускаться в iOS 12.4 без сбоев. Я удалил все остальное и только по этим простым строкам

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

Я думал, что #available использовался, чтобы убедиться, что он пропущен, если условие не выполнено.

Самое странное, что приложение аварийно завершает работу, и я никогда не вызываю сетку, содержащую эти строки, просто наличие их где-то в приложении приводит к сбою.

Я также импортировал CryptoKit сверху (с * 1009 и без * 1009). *) и я добавил @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 Ответ

0 голосов
/ 16 ноября 2019

Как указано здесь , Xcode неправильно добавляет CryptKit в список связанных структур. Чтобы решить эту проблему, вы должны вручную добавить флаг -weak_framework в цель вашего приложения.

enter image description here

...