我正在开发一个基于 HomeKit API 的演示 iOS 应用程序。
我已经为特定家庭(H1)创建了场景(动作集)AS1,并带有一些服务(S1 S2 ...),以便一次执行多个动作。我可以毫无问题地创建多个场景,但我在更新任何创建的场景时遇到问题
我的申请流程
- 显示添加的主页(ListView)
- 单击任何主页,出现详细屏幕,但选项很少(附件 A1 ,房间 A2 ,场景 A3 ......)
- 点击 A1 添加配件(可以从这里更改添加配件的服务特性)
- A3 有一个添加场景(Action-Set)的列表以及一个将新场景(Action-Set)添加到当前主页的按钮
- 用户可以单击任何添加的场景(动作集)来更新其动作并命名两者
问题:一旦我从附件 A1 选项更改了服务的特性,添加到场景动作的特性就会更新为相同的值。
我的假设:我认为每个创建的场景(动作集)分别维护自己的特征值,如果用户从附件 A1(从其他地方)修改任何服务的特征,那么它不应该影响添加到已保存场景的动作的值(前提条件 - 用户在创建场景的操作中选择了该附件)
我将动作集(场景)更新为的方法,
- 一旦用户单击任何添加的 Action-Set 服务列表,用户可以单击任何服务以更新其特性
- 访问当前 Action-Set 的 Action
- 每个动作的访问特征(HMCharacteristicWriteAction) 访问特征的服务
- 创建 CustomServices 实例(以跟踪一些其他信息,例如用户将该服务包含到当前操作集中等)并将其添加到数据源并避免重复
- 一旦用户完成值更改并单击更新操作按钮
- 启动更新过程
更新场景(动作集)
1.检查用户是否更改了Action-set的名称,
- 然后首先更新动作集的名称,一旦成功块执行,删除所有过去添加的动作(如果存在)。
- 向更新的场景添加新动作。
2.如果场景(动作集)名称与旧名称相同,
- 如果存在,则删除所有以前的操作。
- 向更新的场景添加新动作。
这是用于填充服务列表视图的代码片段(准备数据源)
func prepareDataSource(){
var actionsArray = NSArray(array:
self.currentScene!.actions.allObjects)
for (var index = 0 ; index<actionsArray.count; index++ ){
var sWritttenAction:HMCharacteristicWriteAction? = actionsArray[index] as? HMCharacteristicWriteAction
if let sActionCharacteristic = sWritttenAction!.characteristic{
var accessoryService = sActionCharacteristic.service as HMService
if(!isServiceAlraedyAdded(accessoryService.name)){
var sceneService = DMIAccessoryService.initWithService(accessoryService)
sceneService.isSelected = true
//Add Services
self.services.append(sceneService)
self.addedServices.append(sceneService)
println("its a diffrent service")
}
else
{
println("Already has the same service")
}
}
}
}
我已经多次阅读 HomeKit 文档,但没有发现与此问题相关的任何内容。
据我了解动作集的概念,它应该单独维护特征值,以便我们以后可以更改它的动作值。
自最近几天以来我一直面临这个问题(因为几天前在这里发布了同样的问题)现在我确定这是苹果主页 API 中的一个错误,因为一旦我尝试重新执行相同的操作集(前置条件:用户从A1选项中更改服务特征的值。它执行成功并更新所有与创建的场景(ActionSet)具有相同特征的附件。
请任何发现更新场景(ActionSet)类似问题的人帮助我。如果我的方法是错误的,请随时指出我。