(Swift) Приложение iOS аварийно завершает работу, прежде чем запросить доступ к HomeKit

В моем приложении iOS, когда я удаляю приложение со своего телефона и перестраиваю его, когда я запускаю его, приложение вылетает из-за попытки доступа к настроенным мной переменным HMHomeManager, а ТОГДА запрашивает разрешение на доступ к HomeKit.

Могу ли я что-нибудь сделать, чтобы приложение запрашивало разрешение для HomeKit, прежде чем произойдет сбой?

Я попытался поместить это в свой файл appDelegate.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    //push notifications
    registerPushNotifications()

    let home = HMHomeManager()
    home.accessibilityActivate()

    return true
}

Но это не работает. Спасибо за помощь!

редактировать:

Это код, который дает сбой, он вызывается при загрузке первого контроллера представления.

//adding the accessories
func addAcessories() {
    for accessory in (homeManager.primaryHome?.accessories)! { // <-- crashes right here
        if accessory.isBridged == true {
            devices.append(accessory)
            print(accessory.name)
        }
    }
    print("")
}

редактировать: когда он падает, он дает мне (lldb) в консоли и Thread 1: EXC_BREAKPOINT в текстовом редакторе.

Я также пытался поместить это в свой файл appDelegate. Я пытался заставить appDelegate соответствовать HMHomeManagerDelegate

class AppDelegate: UIResponder, UIApplicationDelegate, HMHomeDelegate, HMHomeManagerDelegate {

и вызывая это в моем методе ApplicationDidFinishLoadingWithOptions.

 let home = HMHomeManager()
    home.accessibilityActivate()

    home.delegate = self

    homeKit.addAcessories()
    homeKit.addCharacteristics()

    return true

person Jolaroux    schedule 12.12.2016    source источник
comment
Опубликуйте соответствующий код, который дает сбой.   -  person Andy Ibanez    schedule 13.12.2016
comment
^^ это, а также попробуйте обернуть ваш код, который дает сбой, в операторе защиты, и если это не удается, снова запросите разрешение.   -  person TheValyreanGroup    schedule 13.12.2016
comment
Я вставил код, и я посмотрю, как я могу это сделать   -  person Jolaroux    schedule 13.12.2016
comment
Есть ли общий способ, чтобы приложение запрашивало разрешение перед запуском? я не могу найти ничего подобного   -  person Jolaroux    schedule 13.12.2016
comment
Есть ли код, который я могу запустить, чтобы запросить разрешение вручную?   -  person Jolaroux    schedule 13.12.2016


Ответы (1)


Вы должны добавить NSHomeKitUsageDescription в свой info.plist, чтобы предотвратить сбой.

Это автоматически запросит разрешение. Кроме того, вы также должны добавить для него описание, начиная с iOS 10. Вы можете просто сказать «(ИМЯ ПРИЛОЖЕНИЯ) нуждается в доступе к домашнему комплекту», но вы можете сделать это так, как захотите.

Изменить: попробуйте удалить код HomeKit из вашего appDelegate.

person Timmy    schedule 13.12.2016
comment
На самом деле у меня это есть, что меня смущает. Он запрашивает разрешение после сбоя с сообщением, которое я поместил в файл info.plist. - person Jolaroux; 13.12.2016
comment
Вы добавили ключ под Information Property List, и этот ключ называется Privacy - Home Kit Usage Description? Кроме того, вы запускаете приложение в симуляторе или на устройстве? - person Timmy; 13.12.2016
comment
Извините, между HomeKit не должно быть пробела - person Timmy; 13.12.2016
comment
Да, ключ находится в правильном месте, под Information Property List, в Privacy- HomeKit Usage Description, и я запускаю приложение на устройстве. Проблема только в том, когда приложение запрашивает разрешение. Он спрашивает после попытки запуска кода, а не до запуска приложения. - person Jolaroux; 13.12.2016
comment
Не могли бы вы обновить свой пост с сообщением о сбое из консоли, если оно есть? - person Timmy; 13.12.2016
comment
Попробуйте удалить все точки останова, которые у вас есть в вашем проекте, обновите свой Xcode, а также соберите и очистите свой проект. Это мой совет. - person Timmy; 13.12.2016
comment
Это не точка останова, которую я реализовал, это сбой в коде. Точка, в которой код перестал работать и рухнул. - person Jolaroux; 13.12.2016
comment
Я не был уверен, потому что exc_breakpoint также появляется, когда у вас есть точка останова, о которой, как я думал, вы, возможно, забыли, если возможно, попробуйте сразу не использовать код HomeKit в делегате приложения. - person Timmy; 13.12.2016
comment
Хорошо, когда я закомментировал код в делегате приложения и контроллер корневого представления, который вызывает код домашнего комплекта, разрешение было успешно запрошено! Но теперь у меня возникла проблема с поиском, где инициализировать эти переменные домашнего комплекта при загрузке приложения. - person Jolaroux; 13.12.2016
comment
Что ж, поскольку это проблема только при первом запуске, потому что только после того, как вы удалите приложение, которое удалит предыдущие параметры пользователя, которые он установил, я бы предложил поместить его в первый контроллер представления, с которым будет встречен новый пользователь. Возможно, как экран входа в систему или представление, которое отображается после регистрации. Вы не должны слишком беспокоиться об этом, учитывая, что это будет показано только один раз. - person Timmy; 13.12.2016
comment
Я не понимаю, что я только что написал выше, но я хотел сказать, что это просто первый контроллер представления, который отображается пользователю при загрузке приложения. Я понятия не имею, что творилось у меня в голове, когда я писал свой комментарий выше, лол. - person Timmy; 13.12.2016