Импорт LocalAuthentification.framework аварийно завершает работу на iOS 7.1

Возникли проблемы с использованием LocalAuthentication и поддержкой iOS 7.0

когда я пытаюсь

import LocalAuthentication

У меня происходит сбой, если целевая версия iOS меньше 8.0.

Я попытался пометить LocalAuthentication.framework как необязательный на этапах сборки и проверить доступность класса, вызвав:

var isTouchIDSupported: Bool {
        if let contextClass: AnyClass = NSClassFromString("LAContext") {
            return LAContext().canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: nil)
        }
        return false
    }

он не сработает, если я прокомментирую строку LAContext(), например:

var isTouchIDSupported: Bool {
            if let contextClass: AnyClass = NSClassFromString("LAContext") {
                //return LAContext().canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: nil)
            }
            return false

}

он падает в первые секунды запуска приложения, если я получаю доступ к любому классу LA (например, LAContext) в любом месте моего кода. Что я здесь делаю неправильно?

Журнал консоли для этого сбоя:

dyld: Symbol not found: _objc_isAuto
  Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
  Expected in: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/usr/lib/libobjc.A.dylib
 in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation

person iiFreeman    schedule 17.10.2014    source источник
comment
Вы используете Свифт? Тогда вам, вероятно, придется создать заголовочный файл моста и импортировать его туда.   -  person user965972    schedule 17.10.2014
comment
выбранный ответ на самом деле не решил ваш вопрос. Не могли бы вы опубликовать фактический ответ, содержащий решение. Я также страдаю от той же проблемы.   -  person Harshit Gupta    schedule 27.10.2014
comment
У меня была та же проблема, и я автоматически изменил Link Framework на NO. Это не решило проблему. Вы можете это исправить?   -  person David Liu    schedule 27.10.2014


Ответы (4)


LocalAuthentication.framework доступен с iOS 8.0. [ iOS Framework ]

Чтобы избежать сбоя в iOS 7, перейдите в «Цели проекта» -> «Фазы сборки» -> «Связать двоичный файл с библиотеками» -> установите для статуса LocalAuthentication.framework значение «Необязательно».

person Asif Asif    schedule 17.10.2014
comment
сделано, но он все еще разбился. Это не сбой, только когда я удалил LocalAuthentification.framework из фаз сборки/связать двоичный файл с библиотеками - person iiFreeman; 17.10.2014
comment
Поскольку фреймворк доступен для iOS 8 и не имеет обратной совместимости, вы должны использовать его методы только для iOS 8. Например, вы можете поместить вызов метода между этим условием, чтобы избежать сбоя в iOS ниже 8. if([[[ UIDevice currentDevice] systemVersion] floatValue] ›= 8.0) { \\вызовы метода LocalAuthentification } - person Asif Asif; 17.10.2014
comment
Проблема заключалась в том, что в настройках сборки установлен флаг Link Frameworks Automatically для использования оператора @import, так как я изменил его на NO, и все стало работать правильно! - person iiFreeman; 17.10.2014
comment
@iiFreeman Я автоматически изменил Link Frameworks на NO. Это не сработало. Есть ли другие причины проблемы? - person David Liu; 27.10.2014
comment
@AsifAsif, вам никогда не следует тестировать дополнительные функции, проверяя systemVersion как число с плавающей запятой (что не так ... что такое 8.0.1 как число с плавающей запятой?) и никогда не следует выполнять подобные сравнения с числами с плавающей запятой в целом. См. ответ iiFreeman, чтобы узнать, как это правильно проверить. - person Nate; 25.02.2015

Похоже, это ошибка симулятора. Не выбирайте iPhone 5s (7.1). Если вы используете iPhone 5 (7.1) и пометите LocalAuthentification.framework как Необязательный, он работает. (также для параметра Связать платформу автоматически с параметром НЕТ)

Та же проблема с iPad Air (7.1), но вы можете использовать опцию Resizable iPad/iPhone, которая работает.

person akw    schedule 04.11.2014

Сначала я пометил LocalAuthentification.framework как необязательный, изменил "Link Framework Automatically" на NO, а затем просто проверил перед классом доступа в коде:

- (BOOL)isTouchIDSupported
{
    if (NSClassFromString(@"LAContext")) {
        return [self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil];
    }
    return false;
}

У меня работает нормально, надеюсь кому-нибудь поможет

person iiFreeman    schedule 30.10.2014
comment
Не работает. Я все еще получаю: dyld: Символ не найден: _objc_isAuto - person akw; 31.10.2014
comment
Вы пытались заменить @import LocalAuthentication на #import ‹LocalAuthentication/LocalAuthentication.h›? - person iiFreeman; 31.10.2014

Попробуйте условно импортировать инфраструктуру LocalAuthentication и весь связанный код с директивами препроцессора. После этого вы сможете запускать симуляторы и устройства iOS 7.x через Xcode.

person r3c0d3    schedule 05.05.2015