HomeKit:"添加配件时出错无法完成操作"和"添加附件时出错无法完成操作"

时间:2015-08-25 15:26:46

标签: ios homekit pairing hmaccessory

编辑:我收到以下错误代码:

  

添加附件时出错无法完成操作。   (HMErrorDomain错误2。)

  

添加附件时出错无法开始与附件配对[name = xxxxx,providedName = xxxxx,uuid = xxxxx-xxxxx-xxxxx-xxxxx-xxxxx,identifier = xxxxx,configuration-app-id =(null),home = (null),bridge =(null)]

两者都是2号。

不明白是HMCatalog应用程序的原因。我的代码出了什么问题? 它在附件模拟器上工作正常,但在真正的附件上却不行(真正的附件仅通过HMCatalog应用程序添加,但不是我的自定义应用程序)。

实际行为:

  • 从我的应用添加配件(第一次工作)
  • 重置附件,然后重新添加(不起作用,并在下面的屏幕截图中给出配对错误)。 然而如果我使用Apple示例 HMCatalog 确实会出现这些错误,那么它确实有效。

enter image description here

有时候:

enter image description here

预期结果:

  • 从我的应用中添加配件而没有配对错误

这是我的添加附件代码

 [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 个答案:

答案 0 :(得分:2)

编辑:根据上面的Tushar Koul的评论,看起来您需要忽略浏览器上的discoveredAccessories数组,而是从accessoryBrowserDelegate构建您自己的对象数组(-accessoryBrowser:didFindNewAccessory和-accessoryBrowser:didRemoveAccessory)

告诉浏览器开始搜索后,当前可用的任何附件都将传递给这些方法。

找不到HMErrorCode 2(参见apple docs)。这意味着您拥有的附件指针不再有效。这可能是因为抓住配件对象然后告诉配件浏览器开始寻找配件。如果在添加附件之前取消分配浏览器,也可能发生这种情况。

在尝试将附件添加到家中之前,请确保为HMAccessoryBrowser获取新的HMAccessory。如果您可以分享更多代码,以显示您添加的HMA配件的来源,我可能会提供更多帮助。

答案 1 :(得分:2)

经过5次不同的组合和几个小时的测试,以下是我的发现 -

  1. HMAccessoryBrowser的实例化应该在我们开始搜索homekit设备之前发生。
  2. 我在连续行的viewDidLoad中有这个,并且100%没有时间工作

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

    E.g。如果在视图控制器中使用它,那么视图控制器代码应该看起来像 -

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

    所以我认为你应该在之前初始化HMAccessoryBrowser

    1. HMAccessoryBrowser的实例应该处于活动状态,直到家中附件的添加完成为止。

    2. 在向家中添加附件之前,请勿致电stopSearchingForNewAccessories

    3. 所以谈论#2和#3

      • 您在致电startSearchingForNewAccessories后找到该设备,然后就此致电[self.home addAccessory: completion:]

      在您成功完成此操作之前,请勿调用stopSearchingForNewAccessories并保持HMAcccessoryBrowser实例处于活动状态。

      我正在寻找我的homekit配件,发现它我会停止搜索,然后尝试将附件添加到我家。我几乎每次都会得到ErrorCode 2。一旦我停止致电stopSearching,我看到了更好的结果

      1. 我怀疑使用discoveredAccessories数组中的对象引用。相反,我建议使用从委托回调
      2. 收到的对象

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