HomekitAPP 开发说明文档.docx
- 文档编号:9213590
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:40
- 大小:1.01MB
HomekitAPP 开发说明文档.docx
《HomekitAPP 开发说明文档.docx》由会员分享,可在线阅读,更多相关《HomekitAPP 开发说明文档.docx(40页珍藏版)》请在冰豆网上搜索。
HomekitAPP开发说明文档
HomekitAPP开发说明
本文由CocoaChina翻译组成员iBenjamin_Go和浅夏@旧时光翻译自苹果开发文档:
HomeKitDeveloperGuide,敬请勘误。
本文档内容包括
第一部分:
简介
第二部分:
启用HomeKit
第三部分:
创建Home布局
第四部分:
创建Homes和添加Accessories
第五部分:
观察HomeKit数据库的变化
第六部分:
访问服务和特性
第七部分:
测试HomeKitApp
第八部分:
创建动作集(ActionSets)和触发器(Triggers)
第九部分:
用户管理
第一部分:
简介
该文档旨在帮你编写HomeKitapp。
HomeKit库是用来沟通和控制家庭自动化配件的,这些家庭自动化配件都支持苹果的HomeKitAccessoryProtocol。
HomeKit应用程序可让
用户发现兼容配件并配置它们。
用户可以创建一些action来控制智能配件(例如恒温或者光线强弱),对其进行分组,并且可以通过Siri触发。
HomeKit对象被存储在用户iOS设备的数据库中,并且通过iCloud还可以同步到其他iOS设备。
HomeKit支持远程访问智能配件,并支持多个用户设备和多个用户。
HomeKit还对用户的安全和隐私做了处理。
注意:
如果你是开发设计HomeKit硬件的供应商,你可以去HardwareDevelopers下的HomeKit页面了解MFiProgram相关信息,也可以阅读 ExternalAccessoryProgrammingTopics.
另请参阅
以下资源提供了更多关于创建HomeKit应用程序的信息:
∙HomeKitUserInterfaceGuidelines 提供了用户界面设计指南
∙AppStoreReviewGuidelines:
HomeKit 提供了加快app审核的技巧
∙HomeKitFrameworkReference 描述了HomeKit框架中的类和方法
∙ExternalAccessoryFrameworkReference 列出了系统提供的发现和配置无线智能家居产品UI
∙HomeKitCatalog 提供示例演示HomeKit特性
∙WWDC2014:
IntroducingHomeKit 对HomeKit更高层次的分析
∙iOSSecurity 描述HomeKit如何处理iOS上的安全和隐私
第二部分:
启用HomeKit
HomeKit应用服务只提供给通过AppStore发布的app应用程序。
在你的Xcode工程中,HomeKit应用程序需要额外的配置,你的app必须有开发证书和代码签名才能使用HomeKit。
在Xcode的Capabilities面板使用HomeKit,可避免代码签名的问题。
你无需直接在Xcode或者会员中心编辑授权文件(entitlements)。
设置
为了完成本文档中所有步骤,你需要:
1.一个安装Xcode6或者Xcode6以上版本的Mac电脑。
2.为了获得最佳体验,你的Mac电脑上最好安装最新的OSX系统和最新的Xcode版本。
3.加iOS开发者计划。
4.在Member Center拥有创建代码签名和资源配置的权限。
在你开始使用HomeKit之前,请确保你已经完成以下任务。
创建你团队的配置文件(ProvisioningProfile),请参阅:
AppDistributionQuickStart .
当你成功地完成了之前的任务后,General面板中Team弹出菜单中的错误信息和问题修复按钮将会消失。
代码签名配置被成功创建后会展示下方的General面板。
解决代码签名和证书配置问题,请参阅 AppDistributionGuide文档中Troubleshooting这一节。
启用HomeKit
想要使用HomeKit,首先要启用它。
Xcode将会添加HomeKit权限到你的工程授权文件中和会员中心的AppID授权文件中,也会将HomeKit框架添加到你的工程中。
HomeKit需要一个明确的AppID,这个AppID是为了你完成这些步奏而创建的。
启用HomeKit的步骤如下:
1.在Xcode中,选择View>Navigators>ShowProjectNavigator。
2.从Project/Targets弹出菜单中target(或者从Project/Targets的侧边栏)
3.点击Capabilities查看你可以添加的应用服务列表。
4.滑到HomeKit所在的行并打开关。
下载HomeKitAccessorySimulator
无需为了开发Homekit应用程序而购买硬件产品。
你可以使HomeKitAccessorySimulator来测试HomeKitapp和模拟配件设备之间的通信。
HomeKitAccessorySimulator不是和Xcode一起发布的。
下载HomeKitAccessorySimulator步骤如下:
1.在Capabilities面板的HomeKit分区,点击DownloadHomeKitAccessorySimulator按钮。
(或者选择Xcode>OpenDeveloperTool>MoreDeveloperTools)
2.在浏览器中搜索并且下载"HardwareIOToolsforXcode".dmg文件。
3.在Finder中双击~/Downloads中的.dmg文件。
4.把HomeKitAccessorySimulator拖拽到/Application文件中。
之后,你将可以使用HomeKitAccessorySimulator测试你的HomeKit应用程序,正如TestingYourHomeKitApp(第30页)中描述的那样。
第三部分:
创建Home布局
HomeKit允许用户创建一个或者多个Home布局。
每个Home(HMHome)代表一个有网络设备的住所。
用户拥有Home的数据并可通过自己的任何一台iOS设备进行访问。
用户也可以和客户共享一个Home,但是客户的权限会有更多限制。
被指定为primaryhome的home默认是Siri指令的对象,并且不能指定home。
每个Home一般有多个room,并且每个room一般会有多个智能配件。
在home(HMHome) 中,每个房间是独立的room,并具有一个有意义的名字,例如“卧室”或者“厨房”,这些名字可以在Siri命令中使用。
一个accessory(HMAccessory)代表实际家庭中的自动化设备,例如车库开门器。
一个sevice(HMService)是accessory提供的?
种实际服务,例如打开或者关闭车库,或者车库上的灯。
如果你的app缓存了home布局的信息,那么当其布局发声改变的时候,app就需要更新这些信息。
使用HMHomeManager对象可以从HomeKit数据库获取HMHome和其他相关的对象。
本章描述的API获取对象后,你应该通过代理回调函数保持获取对象和HomeKit数据库同步,具体描述请参看“ObservingHomeKitDatabaseChanges".
创建HomeManager对象
使用HomeManager—一个HMHomeManager对象的访问home、room、配件、服务以及其他HomeKit对象。
在创建家庭对象管理器(homemanager)之后,直接设置它的代理,以便获取到这些对象之后及时的通知到你。
1
2
self.homeManager = [[HMHomeManager alloc] init];
self.homeManager.delegate = self;
当你创建一个homemanager对象时,HomeKit就开始从HomeKit数据库获取这些homes和相关对象,例如room和accessory对象。
当HomeKit正在获取那些对象时,homemanager的primaryHome属性是nil,并且homes属性是个空数组。
你的app应该处理用户还没有完成创建home的情况,但是app应该等待直到HomeKit完成初始化。
当获取对象完成之后,HomeKit会发送homeManagerDidUpdateHomes:
消息给homemanager的代理。
注意:
当app进入前台或者在后台Homemanager属性发生改变时,这个homeManagerDidUpdateHomes:
方法就会被调用,详情请参阅“ObservingChangestotheCollectionofHomes”。
获取PrimaryHome和Homes集合
通过homemanager的primaryHome属性,可以得到primaryhome,代码如下:
1
HMHome *home = self.homeManager.primaryHome;
使用homemanager的homes属性可以得到用户的所有home的集合;例如自家主要居所、度假别墅以及办公室。
每个home都对应一个独立的home对象。
1
2
3
HMHome *home;
for(home in self.homeManager.homes ){
…}
获取Home中的所有room
在一个home中,rooms属性定义accessories的物理位置。
用home的rooms属性可以枚举home中的所room。
1
2
3
4
5
HMHome *home = self.homeManager.primaryHome;
HMRome *room;
for(room in home.rooms){
…
}
获取Room中的Accessories
Accessories数组属于home,但是被指定给了home中的room。
假如用户没有给一个accessory指定room,那么这个accessories被指定一个默认的room,这个room是roomForEntireHome方法的返回值。
用room的accessories属性可以枚举room中所有的accessory。
代码如下:
1
2
3
4
HMAccessory *accessory;
for(accessory in room.accessories){
…
}
如果你要展示一个个accessory的相关信息或者允许用户控制它,可设置accessory的代理方法并实现这个代理方法,详情请见“ObservingChangestoAccessories”.
一旦你获取到一个accessory对象,你就可以访问它的服务和对象,详情请参阅“AccessingServicesandCharacteristics”。
获取Home中的Accessories属性
使用HMHome类中的accessories的方法,可以直接从Home对象中获取所有的accessory对象,而不用枚举home中的所有room对象(详情请见“GettingtheAccessoriesinaRoom”。
第四部分:
创建Homes和添加Accessories
HomeKit对象被保存在一个可以共享的HomeKit数据库里,它可以通过HomeKit框架被多个应英程序访问。
所有HomeKit调用的方法都是异步写入的,并且这些方法都包含一个完成处理后的参数。
如果这个方法处理成功了,你的应用将会在完成处理函数里更新本地对象。
应用程序启动时,HomeKit对象发生改变的并不能收到代理回调?
法,只能接受处理完成后的回调函数。
想要观察其他应用程序启动时HomeKit对象的变化,请参阅:
ObservingHomeKitDatabaseChanges。
查阅异步消息完成处理后传过来的错误码的信息,请参阅:
HomeKitConstantsReference.
对象命名规则
HomeKit对象的名字,例如home、room和zone对象都可以被Siri识别,这一点已经在文档中指出。
以下几点是HomeKit对象的命名规则:
∙对象名字在其命名空间内必须是唯一的。
∙属于用户所有的home名字都在一个命名空间内。
∙一个home对象及其所包含的对象在另一个命名空间内。
∙名字只能包含数字、字母、空格以及省略号字符。
∙名字必须以数字或者字母字符开始。
∙在名字比较的时候,空格或者省略号是忽略的(例如home1和home1同一个名字)。
∙名字没有大小写之分。
想了用户可以使用哪些语言与Siri进行交互,请参阅HomeKitUserInterfaceGuidelines文档中的"SiriIntegration"
创建Homes
在HMHomeManager类中使用addHomeWithName:
completionHandler:
异步方法可以添加一个home。
作为参数传到那个方法中的home的名字,必须是唯一独特的,并且是Siri可以识别的home名字。
1
2
3
4
5
6
7
[self.homeManager addHomeWithName:
@"My Home"
completionHandler:
^(HMHome *home, NSError *error) {
if (error !
= nil) {
// Failed to add a home
} else {
// Successfully added a home
} }];
在else语句中,写入代码以更新你应的程序的视图。
为了获取homemanager对象,请参阅GettingtheHomeManagerObject.
在Home中增加一个Room
使用addRoomWithName:
completionHandler:
异步方法可以在一个home中添加一个room对象。
作为参数传到那个方法中的room的名字,必须是唯一独特的,并且是Siri可识别的room名字。
1
2
3
4
5
6
7
8
NSString *roomName = @"Living Room";
[home addRoomWithName:
roomName completionHandler:
^(HMRoom
*room, NSError *error) {
if (error !
= nil) {
// Failed to add a room to a home
} else {
// Successfully added a room to a home
} }];
在else语句中,写入代码更新应用程序的视图。
发现配件
Accessories封装了物理配件的状态,因此它不能被用户创建。
想要允许用户给家添加新的配件,我们可以使HMAccessoryBrowser对象找到一个与home没有关联的配件。
HMAccessoryBrower对象在后台搜寻配件,当它找到配件的时候,使用委托来通知你的应用程序。
只有在startSearchingForNewAccessories方法调用之后或者stopSearchingForNewAccessories方法调用之前,HMAccessoryBrowserDelegate消息才被发送给代理对象。
发现home中的配件
1.在你的类接口中添加配件浏览器委托协议,并且添加一个配件浏览器属性。
代码如下:
1
2
3
@interface EditHomeViewController ()
@property HMAccessoryBrowser *accessoryBrowser;
@end
用你自己的类名代替EditHomeViewController
2.创建配件浏览器对象,并设置它的代理
1
2
self.accessoryBrowser = [[HMAccessoryBrowser alloc] init];
self.accessoryBrowser.delegate = self;
3.开始搜寻配件
1
[self.accessoryBrowser startSearchingForNewAccessories];
4.将找到的配件添加到你的收藏里
1
2
3
4
5
6
7
- (void)accessoryBrowser:
(HMAccessoryBrowser *)browser
didFindNewAccessory:
(HMAccessory *)accessory {
// Update the UI per the new accessory; for example,
reload a picker
view.
[self.accessoryPicker reloadAllComponents];
}
用你自己的代码实现上面的accessoryBrowser:
didFindNewAccessory:
方法。
当然也可以实现accessoryBrowser:
didRemoveNewAccessory:
这个方法来移除配件,这个配件对你的视图或者收藏来说不再是新的。
5.停止搜寻配件
如果一个视图控制器正在开始搜寻配件,那么可以通过重写viewWillDisappear:
方法来停止搜寻配件。
代码如下:
1
2
3
- (void)viewWillDisappear:
(BOOL)animated {
[self.accessoryBrowser stopSearchingForNewAccessories];
}
注意:
在WiFi网络环境下,为了安全地获取新的并且能够被HomeKit发现的无线配件,请参阅ExternalAccessoryFrameworkReference.
为Home和room添加配件(Accessory)
配件归属于home,并且它可以被随意添加到home中的任意一个room中。
使用addAccessory:
completionHandler:
这个异步方法可以在home中添加配件。
这个配件的名字作为一个参数传递到上述异步方法中,并且这个名字在配件所属的home中必须是唯一的。
使用assignAccessory:
toRoom:
completionHandler:
这个异步方法可以给home中
的room添加配件。
配件默认的room是roomForEntireHome这个方法返回值room。
下面的代码演示了如何给home和room添加配件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Add an accesory to a home and a room
// 1. Get the home and room objects for the completion
handlers.
__block HMHome *home = self.home;
__block HMRoom *room = roomInHome;
// 2. Add the accessory to the home
[home addAccessory:
accessory completionHandler:
^(NSError
*error) {
if (error) {
// Failed to add accessory to home
} else {
if (accessory.room !
= room) {
// 3. If successfully, add the accessory to
the room
[home assignAccessory:
accessory toRoom:
room
completionHandler:
^(NSError *error) {
if (error) {
// Failed to add accessory to room
} }];
} }
}];
配件可提供一项或者多项服务,这些服务的特性是由制造商定义。
想了解配件的服务和特性目的,请参阅 AccessingServicesandCharacteristics.
更改配件名称
使用updateName:
completionHandler:
异步方法可以改变配件的名称,代码如下:
1
2
3
4
5
6
7
8
[accessory updateName:
@"Kid's Night Light"
completionHandler:
^(NSError *error) {
if (error) {
// Failed to change the name
} else {
// Successfully changed the name
}
}];
为Homes和Room添加Bridge(桥接口)
桥接口是配件中的一个特殊对象,它允许你和其他配件交流,但是不允许你直接和HomeKit交流。
例如一个桥接口可以是控制多个灯的枢纽,它使用的是自己的通信协议,而不是HomeKit配件通信协议。
想要给home添加多个桥接口,你可以按照AddingAccessoriestoHomesandRooms中所描述的步骤,添加任何类型的配件到home中。
当你给home添加一个桥接口时,在桥接口底层的配件也会被添加到home中。
正如ObservingHomeKitDatabaseChanges中所描述的那样,每次更改通知设计模,home的代理不会接收到桥接口的home:
didAddAccessory:
代理消息,而是接收一个有关于配件的home:
didAddAccessory:
代理消息。
在home中,要把桥接口后的配件和任何类型的配件看成一样的--例如,把它们加入配件列表的配置表中。
相反的是,当你给room增添一个桥接口时,这个桥接口底层的配件并不会自动地添加到room中,原因是桥接口和它的的配件可以位于到不同的room中。
创建分区
分区(HMZone)是任意可选的房间(rooms)分组;例如楼上、楼下或者卧室。
房间可以被添加到一个或者多个区域。
可使用addZoneWithName:
completionHandler:
异步方法创建分区。
所创建的作为参数传递到这个方法中分区的名称,在home中必须是唯一的,并且应该能被Siri识别。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
__block HMHome *home = self.home;
NSString *zoneName = @"Upstairs";
[home addZoneWithName:
zoneName completionHandler:
^(HMZone
*zone, NSError *error)
{
if (error) {
// Failed to create zone
} else {
// S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Homekit APP 开发说明文档 开发 说明 文档