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

РЕДАКТИРОВАТЬ: я получаю следующие коды ошибок:

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

А также:

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

Оба с номером 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);
             }
             }];**/
        }
    }];

2 ответа

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

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

Я имел это в моем viewDidLoad в последовательных строках, и он не работал 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 в живых.

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

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

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

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

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

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

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

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