HomeKit: Ошибка при добавлении аксессуара Операция не может быть завершена и Ошибка при добавлении аксессуара Операция не может быть завершена

EDIT: я получаю следующие коды ошибок:

Ошибка при добавлении аксессуара Операция не может быть завершена. (Ошибка HMErrorDomain 2.)

И:

Ошибка при добавлении аксессуара. Не удалось начать сопряжение с аксессуаром [ имя = ххххх, заданное имя = ххххх, uuid = ххххх-ххххх-ххххх-ххххх-ххххх, идентификатор = ххххх, идентификатор приложения-конфигурации = (нулевой), домашний = (нулевой) , мост = (ноль)]

Оба с номером 2.

Чего я не понимаю, так это почему в приложении HMCatalog это работает. Что не так с моим кодом? Он отлично работает на симуляторе аксессуаров, но не на реальном аксессуаре (настоящий аксессуар добавляется только через приложение HMCatalog, но не через мое пользовательское приложение).


Реальное поведение:

  • добавить аксессуар из моего приложения (работает с первого раза)
  • сбросьте аксессуар, а затем снова добавьте его (не работает и выдает ошибку сопряжения на скриншоте ниже). Однако когда он выдает эти ошибки, если я использую пример Apple HMCatalog, он работает.

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

И иногда:

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

Ожидаемые результаты:

  • добавляет аксессуар из моего приложения без ошибки сопряжения

Это мой добавить код аксессуара:

 [self.home addAccessory:self.accessory completionHandler:^(NSError *error) {
        NSLog(@"in adding for accessory %@", self.accessory.name);
        if (error) {
            NSLog(@"Error adding accessory %@ %li", error.localizedDescription, (long)error.code);

            UIAlertController *alertController = [UIAlertController
                                                  alertControllerWithTitle:@"Pairing error"
                                                  message:error.localizedDescription
                                                  preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction *okAction = [UIAlertAction
                                       actionWithTitle:NSLocalizedString(@"OK", @"OK action")
                                       style:UIAlertActionStyleDefault
                                       handler:^(UIAlertAction *action)
                                       {
                                           NSLog(@"OK action");
                                       }];

            [alertController addAction:okAction];
            [self presentViewController:alertController animated:YES completion:nil];

        }
        else{
            // TODO: Tweak this
            NSLog(@"Added to home");

            [self dismiss:nil];
            /**
             [homeSweetHome assignAccessory:accessory toRoom:nil completionHandler:^(NSError *error) {
             if (error) {
             NSLog(@"Failed adding accessory %@ to room %@", accessory.name, room.name);
             }
             }];**/
        }
    }];

person mm24    schedule 25.08.2015    source источник
comment
Эта первая ошибка не выглядит так, как будто она исходит от homekit (это не что-то из HMErrorDomain и не показывает HMErrorCode). У ошибки есть код? Откуда берутся дом и аксессуары? И почему вы переназначаете свои свойства на __block vars?   -  person Adam Shiemke    schedule 25.08.2015
comment
Я создал дом в приложении HMCatalog, аксессуар — настоящий аксессуар. Я использовал блоки, так как это был асинхронный метод, теперь я их убрал. Скоро сообщу код ошибки.   -  person mm24    schedule 26.08.2015
comment
@AdamShiemke код ошибки 2   -  person mm24    schedule 26.08.2015
comment
Я получаю ту же ошибку, что и вы. Кажется, есть некоторые ошибки, когда вы удаляете аксессуар и добавляете его снова... или используете кнопку сброса в симуляторе. Кажется, HomeKit не любит ремонтировать аксессуары.   -  person Josh Gafni    schedule 09.09.2015
comment
вы нашли решение для этого ?? В настоящее время я сталкиваюсь с этой проблемой в своем приложении   -  person Tushar Koul    schedule 21.10.2015
comment
Не совсем к сожалению.. где-то должно быть что-то с четкой документацией по кодам ошибок.. это не может быть только в коде..   -  person mm24    schedule 21.10.2015
comment
@ mm24 Я думал о том, как получить ссылку на self.accessory. В моем коде я беру ссылку из массива discoveredAccessories в HMAccessoryBrowser. ВОЗМОЖНО, мы должны использовать вспомогательный объект, который передается в качестве параметра методу didFindAccessorydelegate.   -  person Tushar Koul    schedule 21.10.2015
comment
@TusharKoul, наверное, ты прав. Глядя на код моего приложения, у меня есть локальный массив, который я заполняю из делегата, и я никогда не использую массив discoveryAccessories.   -  person Adam Shiemke    schedule 22.10.2015


Ответы (2)


РЕДАКТИРОВАТЬ: согласно комментарию Тушара Коула выше, похоже, вам нужно игнорировать массив обнаруженных аксессуаров в браузере и вместо этого создавать свой собственный массив объектов из аксессуара BrowserDelegate (-accessoryBrowser:didFindNewAccessory и -accessoryBrowser:didRemoveAccessory).

После указания браузеру начать поиск все доступные в настоящее время аксессуары будут переданы этим методам.

HMErrorCode 2 не найден (см. яблочные документы). Это означает, что указатель аксессуара, который у вас есть, больше недействителен. Это может быть вызвано захватом объекта-аксессуара и последующим указанием обозревателю аксессуаров начать поиск аксессуаров. Это также может произойти, если браузер был освобожден до того, как вы добавили аксессуар.

Убедитесь, что вы получаете новый HMAccessory для HMAccessoryBrowser, прежде чем пытаться добавить аксессуар в свой дом. Если вы можете поделиться дополнительным кодом, показывающим, откуда берется добавляемый вами HMAccessory, я мог бы помочь больше.

person Adam Shiemke    schedule 25.08.2015
comment
Я проверил свой код, и объект браузера аксессуара и аксессуара не равен нулю.. действительно не понимаю, что происходит.. также кажется, что аксессуар доступен.. Я попытаюсь упростить свой код и вставить его здесь.. - person mm24; 26.08.2015

После 5 различных комбинаций и нескольких часов тестирования вот мои выводы:

  1. Создание экземпляра HMAccessoryBrowser должно произойти задолго до того, как мы начнем поиск устройств homekit.

У меня было это в моем представленииDidLoad в последовательных строках, и это НЕ работало в 100% случаев.

  self.accessoryBrowser = [HMAccessoryBrowser alloc] init]; 
[self.accessoryBrowser startSearchingForNewAccessories];

Например. Если вы используете его в контроллере представления, тогда этот код контроллеров представления должен выглядеть так:

    -(instanceType)init{  
if(self = [super init]){   
self.accessoryBrowser = [HMAccessoryBrowser alloc] init];  } 
}

    -(void)viewDidLoad{ 
[self.accessoryBrowser startSearching];
 }

Поэтому я считаю, что вы должны инициализировать HMAccessoryBrowser раньше.

  1. Экземпляр HMAccessoryBrowser должен быть активен до тех пор, пока не будет завершено добавление аксессуара в домашнюю папку.

  2. Не звоните stopSearchingForNewAccessories, пока не завершится добавление аксессуара в дом.

Итак, о № 2 и № 3

  • вы находите устройство после звонка startSearchingForNewAccessories , затем звоните [self.home addAccessory: completion:] на нем.

Пока вы не завершите эту операцию успешно, НЕ вызывайте stopSearchingForNewAccessories и не оставляйте экземпляр HMAcccessoryBrowser активным.

Я искал свой аксессуар для домашнего набора, найдя его, я прекращал поиск, а затем пытался добавить аксессуар в свой дом. Я получал ErrorCode 2 почти каждый раз. Как только я перестал звонить stopSearching, результаты стали лучше

  1. У меня есть сомнения по поводу использования ссылки на объект из массива discoveredAccessories. Вместо этого я бы рекомендовал использовать объект, полученный от обратного вызова делегата.

- (void)accessoryBrowser:(HMAccessoryBrowser *)browser didFindNewAccessory:(HMAccessory *)accessory

person Tushar Koul    schedule 22.10.2015
comment
Спасибо за подсказку не звонить stopSearchingForNewAccessories! - person d.felber; 18.01.2017