2

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

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

和:

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

两者都是数字 2。

不明白为什么在 HMatalog 应用程序上可以正常工作。我的代码有什么问题?它在附件模拟器上运行良好,但在真正的附件上却不行(真正的附件只能通过 HMatalog 应用程序添加,而不是我的自定义应用程序)。


实际行为:

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

在此处输入图像描述

而有时:

在此处输入图像描述

预期成绩:

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

这是我的添加附件代码

 [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);
             }
             }];**/
        }
    }];
4

2 回答 2

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

于 2015-10-22T20:31:49.747 回答
2

编辑:根据上面 Tushar Koul 的评论,您似乎需要忽略浏览器上的 foundAccessories 数组,而是从附件浏览器委托(-accessoryBrowser:didFindNewAccessory 和 -accessoryBrowser:didRemoveAccessory)构造您自己的对象数组。

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

未找到 HMErrorCode 2(请参阅Apple 文档)。这意味着您拥有的附件指针不再有效。这可能是由于抓取了一个附件对象,然后告诉附件浏览器开始寻找附件。如果在添加附件之前释放浏览器,也可能会发生这种情况。

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

于 2015-08-25T22:45:01.720 回答