Xamarin.iOS의 HomeKit

HomeKit은 홈 자동화 디바이스를 제어하기 위한 Apple의 프레임워크입니다. 이 문서에서는 HomeKit을 소개하고 HomeKit 액세서리 시뮬레이터에서 테스트 액세서리를 구성하고 이러한 액세서리와 상호 작용하는 간단한 Xamarin.iOS 앱을 작성하는 방법을 설명합니다.

An example HomeKit enabled App

Apple은 다양한 공급업체의 여러 홈 자동화 장치를 일관된 단일 단위로 원활하게 통합하는 방법으로 iOS 8에서 HomeKit을 도입했습니다. HomeKit은 홈 자동화 디바이스를 검색, 구성 및 제어하기 위한 공통 프로토콜을 홍보하여 개별 공급업체가 작업을 조정하지 않고도 비관련 공급업체의 디바이스가 함께 작동할 수 있도록 합니다.

HomeKit을 사용하면 공급업체 제공 API 또는 앱을 사용하지 않고 HomeKit 사용 디바이스를 제어하는 Xamarin.iOS 앱을 만들 수 있습니다. HomeKit을 사용하여 다음을 수행할 수 있습니다.

  • 새 HomeKit 사용 홈 자동화 디바이스를 검색하고 사용자의 모든 iOS 디바이스에서 유지되는 데이터베이스에 추가합니다.
  • HomeKit 홈 구성 데이터베이스의 모든 디바이스를 설정, 구성, 표시 및 제어합니다.
  • 미리 구성된 HomeKit 디바이스와 통신하고 주방의 모든 조명을 켜는 등 개별 작업을 수행하거나 공동으로 작업하도록 명령합니다.

HomeKit은 Home Configuration Database에서 HomeKit 지원 앱에 디바이스를 제공하는 것 외에도 Siri 음성 명령에 대한 액세스를 제공합니다. 적절하게 구성된 HomeKit 설정이 제공되면 사용자는 "Siri, 거실의 조명 켜기"와 같은 음성 명령을 실행할 수 있습니다.

홈 구성 데이터베이스

HomeKit은 지정된 위치에 있는 모든 자동화 디바이스를 홈 컬렉션으로 구성합니다. 이 컬렉션은 사용자가 홈 자동화 디바이스를 의미 있는 사람이 읽을 수 있는 레이블을 사용하여 논리적으로 정렬된 단위로 그룹화할 수 있는 방법을 제공합니다.

홈 컬렉션은 자동으로 백업되고 사용자의 모든 iOS 디바이스에서 동기화되는 홈 구성 데이터베이스에 저장됩니다. HomeKit은 홈 구성 데이터베이스를 사용하기 위한 다음 클래스를 제공합니다.

  • HMHome - 단일 물리적 위치(예: 단일 패밀리 레지던스)의 모든 홈 자동화 디바이스에 대한 모든 정보와 구성을 보유하는 최상위 컨테이너입니다. 사용자에게는 기본 집 및 휴가용 주택과 같은 둘 이상의 거주지가 있을 수 있습니다. 또는 기본 하우스와 차고 위에 게스트 하우스와 같은 동일한 속성에 다른 "주택"이 있을 수 있습니다. 어느 쪽이든 다른 HomeKit 정보를 입력하기 전에 하나 HMHome 이상의 개체 를 설정 및 저장해야 합니다 .
  • HMRoom - 선택 사항이지만 HMRoom 사용자는 주방, 욕실, 차고 또는 거실과 같은 집 (HMHome) 내부의 특정 방을 정의 할 수 있습니다. 사용자는 집의 특정 위치에 있는 모든 홈 자동화 디바이스를 a HMRoom 로 그룹화하고 이를 단위로 사용할 수 있습니다. 예를 들어 Siri에게 차고 조명을 끄도록 요청합니다.
  • HMAccessory - 사용자의 거주지에 설치된 개별 물리적 HomeKit 지원 자동화 디바이스(예: 스마트 자동 온도 조절기)를 나타냅니다. 각각 HMAccessory 에 할당됩니다 HMRoom. 사용자가 회의실을 구성하지 않은 경우 HomeKit은 특수 기본 회의실에 액세서리를 할당합니다.
  • HMService - 조명의 켜기/끄기 상태 또는 색 변경이 지원되는 경우와 같이 지정된 HMAccessory서비스에서 제공하는 서비스를 나타냅니다. 각각 HMAccessory 은 조명을 포함하는 차고 문 오프너와 같은 두 개 이상의 서비스를 가질 수 있습니다. 또한 지정된 HMAccessory 서비스에는 사용자 제어를 벗어난 펌웨어 업데이트와 같은 서비스가 있을 수 있습니다.
  • HMZone - 사용자가 개체 컬렉션을 HMRoom 위층, 아래층 또는 지하실과 같은 논리 영역으로 그룹화할 수 있습니다. 선택 사항이지만, 이를 통해 Siri에게 아래층의 모든 조명을 끄도록 요청하는 것과 같은 상호 작용을 할 수 있습니다.

HomeKit 앱 프로비전

HomeKit에서 적용되는 보안 요구 사항 때문에 HomeKit 프레임워크를 사용하는 Xamarin.iOS 앱은 Apple 개발자 포털과 Xamarin.iOS 프로젝트 파일 모두에서 제대로 구성되어야 합니다.

다음을 수행하십시오:

  1. Apple 개발자 포털에 로그인합니다.

  2. 인증서, 식별자 및 프로필을 클릭합니다.

  3. 아직 수행하지 않은 경우 식별자를 클릭하고 앱의 ID를 만듭니다(예: com.company.appname). 그렇지 않으면 기존 ID를 편집합니다.

  4. 지정된 ID에 대해 HomeKit 서비스가 검사 있는지 확인합니다.

    Enable the HomeKit service for the given ID

  5. 변경 내용을 저장합니다.

  6. 프로비저닝 프로필>개발을 클릭하고 앱에 대한 새 개발 프로비저닝 프로필을 만듭니다.

    Create a new development provisioning profile for the app

  7. 새 프로비저닝 프로필을 다운로드하여 설치하거나 Xcode를 사용하여 프로필을 다운로드하고 설치합니다.

  8. Xamarin.iOS 프로젝트 옵션을 편집하고 방금 만든 프로비저닝 프로필을 사용하고 있는지 확인합니다.

    Select provisioning profile just created

  9. 다음으로 Info.plist 파일을 편집하고 프로비저닝 프로필을 만드는 데 사용된 앱 ID를 사용하고 있는지 확인합니다.

    Set the App ID

  10. 마지막으로 Entitlements.plist 파일을 편집하고 HomeKit 자격이 선택되었는지 확인합니다.

    Enable the HomeKit entitlement

  11. 모든 파일에 변경 내용을 저장합니다.

이러한 설정이 준비되면 애플리케이션은 이제 HomeKit Framework API에 액세스할 준비가 되었습니다. 프로비저닝에 대한 자세한 내용은 Device Provisioning and Provisioning Your App 가이드를 참조하세요.

Important

HomeKit 지원 앱을 테스트하려면 개발을 위해 제대로 프로비전된 실제 iOS 디바이스가 필요합니다. iOS 시뮬레이터에서 HomeKit을 테스트할 수 없습니다.

HomeKit 액세서리 시뮬레이터

실제 디바이스 없이도 가능한 모든 홈 자동화 디바이스 및 서비스를 테스트할 수 있는 방법을 제공하기 위해 Apple은 HomeKit 액세서리 시뮬레이터만들었습니다. 이 시뮬레이터를 사용하여 가상 HomeKit 디바이스를 설정 및 구성할 수 있습니다.

시뮬레이터 설치

Apple은 HomeKit 액세서리 시뮬레이터를 Xcode에서 별도의 다운로드로 제공하므로 계속하기 전에 설치해야 합니다.

다음을 수행하십시오:

  1. 웹 브라우저에서 Apple 개발자용 다운로드를 방문 합니다.

  2. Xcode xxx용 추가 도구(여기서 xxx는 설치한 Xcode의 버전)를 다운로드합니다.

    Download the Additional Tools for Xcode

  3. 디스크 이미지를 열고 애플리케이션 디렉터리에 도구를 설치합니다 .

HomeKit 액세서리 시뮬레이터를 설치하면 테스트를 위해 가상 액세서리를 만들 수 있습니다.

가상 액세서리 만들기

HomeKit 액세서리 시뮬레이터를 시작하고 몇 가지 가상 액세서리를 만들려면 다음을 수행합니다.

  1. Applications 폴더에서 HomeKit 액세서리 시뮬레이터를 시작합니다.

    The HomeKit Accessory Simulator

  2. + 단추를 클릭하고 새 액세서리를 선택합니다...:

    Add a new accessory

  3. 새 액세서리에 대한 정보를 입력하고 마침 단추를 클릭합니다.

    Fill out the information about the new accessory

  4. 서비스 추가 단추를 클릭하고 드롭다운에서 서비스 유형을 선택합니다.

    Select a service type from the dropdown

  5. 서비스의 이름을 입력하고 마침 단추를 클릭합니다.

    Enter a Name for the service

  6. 특성 추가 단추를 클릭하고 필요한 설정을 구성하여 서비스에 대한 선택적 특성을 제공할 수 있습니다.

    Configuring the required settings

  7. 위의 단계를 반복하여 HomeKit에서 지원하는 가상 홈 자동화 디바이스의 각 유형 중 하나를 만듭니다.

몇 가지 샘플 가상 HomeKit 액세서리를 만들고 구성하면 이제 Xamarin.iOS 앱에서 이러한 디바이스를 사용하고 제어할 수 있습니다.

Info.plist 파일 구성

iOS 10 이상에 대한 새로운 기능인 개발자는 앱의 파일에 키를 추가하고 NSHomeKitUsageDescriptionInfo.plist 이 사용자의 HomeKit 데이터베이스에 액세스하려는 이유를 선언하는 문자열을 제공해야 합니다. 이 문자열은 앱을 처음 실행할 때 사용자에게 표시됩니다.

The HomeKit permission dialog

이 키를 설정하려면 다음을 수행합니다.

  1. 솔루션 탐색기 파일을 두 번 클릭하여 Info.plist 편집용으로 엽니다.

  2. 화면 아래쪽에서 원본 보기로 전환합니다.

  3. 목록에 새 항목을 추가합니다.

  4. 드롭다운 목록에서 개인 정보 - HomeKit 사용 설명을 선택합니다.

    Select Privacy - HomeKit Usage Description

  5. 앱이 사용자의 HomeKit 데이터베이스에 액세스하려는 이유에 대한 설명을 입력합니다.

    Enter a description

  6. 변경 내용을 파일에 저장합니다.

Important

iOS 10 이상에서 실행할 때 오류 없이 파일의 키를 설정 NSHomeKitUsageDescription 하지 않으면 앱이 자동으로 실패(런타임 시 시스템에서 닫힘)Info.plist됩니다.

HomeKit에 커넥트

HomeKit과 통신하려면 Xamarin.iOS 앱이 먼저 클래스의 HMHomeManager 인스턴스를 인스턴스화해야 합니다. Home Manager는 HomeKit의 중심 진입점이며 사용 가능한 주택 목록을 제공하고, 해당 목록을 업데이트 및 기본 해당 목록을 확인하고 사용자의 기본 홈을 반환하는 역할을 담당합니다.

이 개체는 HMHome 설치된 홈 자동화 액세서리와 함께 포함할 수 있는 모든 객실, 그룹 또는 영역을 포함하여 홈 제공에 대한 모든 정보를 포함합니다. HomeKit에서 작업을 수행하려면 먼저 하나 HMHome 이상의 작업을 만들고 기본 홈으로 할당해야 합니다.

앱은 주 홈이 있는 경우 검사 만들고 할당해야 합니다.

홈 관리자 추가

Xamarin.iOS 앱에 HomeKit 인식을 추가하려면 AppDelegate.cs 파일을 편집하여 편집하고 다음과 같이 표시합니다.

using HomeKit;
...

public HMHomeManager HomeManager { get; set; }
...

public override void FinishedLaunching (UIApplication application)
{
    // Attach to the Home Manager
    HomeManager = new HMHomeManager ();
    Console.WriteLine ("{0} Home(s) defined in the Home Manager", HomeManager.Homes.Count());

    // Wire-up Home Manager Events
    HomeManager.DidAddHome += (sender, e) => {
        Console.WriteLine("Manager Added Home: {0}",e.Home);
    };

    HomeManager.DidRemoveHome += (sender, e) => {
        Console.WriteLine("Manager Removed Home: {0}",e.Home);
    };
    HomeManager.DidUpdateHomes += (sender, e) => {
        Console.WriteLine("Manager Updated Homes");
    };
    HomeManager.DidUpdatePrimaryHome += (sender, e) => {
        Console.WriteLine("Manager Updated Primary Home");
    };
}

애플리케이션이 처음 실행되면 사용자가 HomeKit 정보에 액세스할 수 있도록 허용할지 묻는 메시지가 표시됩니다.

The user will be asked if they want to allow it to access their HomeKit information

사용자가 확인에 응답하면 애플리케이션이 HomeKit 액세서리로 작업할 수 있으며 그렇지 않으면 작동하지 않으며 HomeKit에 대한 모든 호출은 오류와 함께 실패합니다.

홈 관리자가 준비되면 다음으로 애플리케이션은 기본 홈이 구성되었는지 확인해야 하며, 그렇지 않은 경우 사용자가 홈 홈을 만들고 할당할 수 있는 방법을 제공해야 합니다.

기본 홈에 액세스

위에서 설명한 대로 HomeKit을 사용할 수 있기 전에 기본 홈을 만들고 구성해야 하며, 아직 없는 경우 사용자가 기본 홈을 만들고 할당할 수 있는 방법을 제공하는 것은 앱의 책임입니다.

앱이 백그라운드에서 처음 시작되거나 반환되면 클래스의 이벤트를 모니터링 DidUpdateHomes 하여 주 홈이 HMHomeManager 있는지 검사 합니다. 존재하지 않는 경우 사용자가 인터페이스를 만들 수 있는 인터페이스를 제공해야 합니다.

다음 코드를 뷰 컨트롤러에 추가하여 주 홈에 대한 검사 수 있습니다.

using HomeKit;
...

public AppDelegate ThisApp {
    get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}
...

// Wireup events
ThisApp.HomeManager.DidUpdateHomes += (sender, e) => {

    // Was a primary home found?
    if (ThisApp.HomeManager.PrimaryHome == null) {
        // Ask user to add a home
        PerformSegue("AddHomeSegue",this);
    }
};

홈 관리자가 HomeKit DidUpdateHomes 에 연결하면 이벤트가 발생하며, 기존 주택은 관리자의 주택 컬렉션에 로드되고, 사용 가능한 경우 기본 홈이 로드됩니다.

기본 홈 추가

이벤트 이후에 PrimaryHomeDidUpdateHomes 속성 HMHomeManagernull 있는 경우 계속하기 전에 사용자가 기본 홈을 만들고 할당할 수 있는 방법을 제공해야 합니다.

일반적으로 앱은 사용자가 새 홈의 이름을 지정하는 양식을 표시합니다. 그러면 홈 관리자에 전달되어 기본 홈으로 설정됩니다. HomeKitIntro 샘플 앱의 경우 모달 보기가 Xcode Interface Builder에서 생성되고 앱의 기본 인터페이스에서 segue에 의해 AddHomeSegue 호출되었습니다.

사용자가 새 홈의 이름을 입력할 수 있는 텍스트 필드와 홈을 추가하는 단추를 제공합니다. 사용자가 홈 추가 단추를 탭하면 다음 코드는 홈 관리자를 호출하여 홈을 추가합니다.

// Add new home to HomeKit
ThisApp.HomeManager.AddHome(HomeName.Text,(home,error) =>{
    // Did an error occur
    if (error!=null) {
        // Yes, inform user
        AlertView.PresentOKAlert("Add Home Error",string.Format("Error adding {0}: {1}",HomeName.Text,error.LocalizedDescription),this);
        return;
    }

    // Make the primary house
    ThisApp.HomeManager.UpdatePrimaryHome(home,(err) => {
        // Error?
        if (err!=null) {
            // Inform user of error
            AlertView.PresentOKAlert("Add Home Error",string.Format("Unable to make this the primary home: {0}",err.LocalizedDescription),this);
            return ;
        }
    });

    // Close the window when the home is created
    DismissViewController(true,null);
});

메서드는 AddHome 새 홈을 만들고 지정된 콜백 루틴으로 반환하려고 시도합니다. 속성이 error 아닌 null경우 오류가 발생하여 사용자에게 표시되어야 합니다. 가장 일반적인 오류는 고유하지 않은 홈 이름 또는 Home Manager가 HomeKit과 통신할 수 없기 때문에 발생합니다.

홈이 성공적으로 만들어진 경우 새 홈을 기본 홈으로 설정하는 방법을 호출 UpdatePrimaryHome 해야 합니다. 다시 말하지만, 속성이 errornull으면 오류가 발생하여 사용자에게 표시되어야 합니다.

또한 홈 관리자 DidAddHomeDidRemoveHome 이벤트를 모니터링하고 필요에 따라 앱의 사용자 인터페이스를 업데이트해야 합니다.

Important

AlertView.PresentOKAlert 위의 샘플 코드에서 사용되는 메서드는 iOS 경고를 더 쉽게 사용할 수 있도록 하는 HomeKitIntro 애플리케이션의 도우미 클래스입니다.

새 액세서리 찾기

홈 관리자에서 기본 홈이 정의되거나 로드되면 Xamarin.iOS 앱에서 호출 HMAccessoryBrowser 하여 새 홈 자동화 액세서리를 찾아 홈에 추가할 수 있습니다.

완료되면 메서드를 StartSearchingForNewAccessories 호출하여 새 액세서리 및 메서드를 StopSearchingForNewAccessories 찾습니다.

Important

StartSearchingForNewAccessories iOS 디바이스의 배터리 수명과 성능 모두에 부정적인 영향을 주므로 장기간 실행되지 않아야 합니다. Apple은 1분 후에 전화를 걸 StopSearchingForNewAccessories 거나 Find Accessory UI가 사용자에게 표시될 때만 검색할 것을 제안합니다.

DidFindNewAccessory 액세서리가 검색되면 이벤트가 호출되고 액세서리 브라우저의 DiscoveredAccessories 목록에 추가됩니다.

목록에는 DiscoveredAccessories HomeKit 지원 홈 자동화 디바이스 및 사용 가능한 서비스(예: 조명 또는 차고 도어 컨트롤)를 정의하는 개체 컬렉션 HMAccessory 이 포함됩니다.

새 액세서리를 찾은 후에는 사용자에게 표시되어야 하므로 해당 액세서리를 선택하여 홈에 추가할 수 있습니다. 예시:

Finding a new accessory

메서드를 AddAccessory 호출하여 선택한 액세서리를 홈 컬렉션에 추가합니다. 예시:

// Add the requested accessory to the home
ThisApp.HomeManager.PrimaryHome.AddAccessory (_controller.AccessoryBrowser.DiscoveredAccessories [indexPath.Row], (err) => {
    // Did an error occur
    if (err !=null) {
        // Inform user of error
        AlertView.PresentOKAlert("Add Accessory Error",err.LocalizedDescription,_controller);
    }
});

속성이 err 아닌 null경우 오류가 발생하여 사용자에게 표시되어야 합니다. 그렇지 않으면 사용자가 추가할 디바이스에 대한 설정 코드를 입력하라는 메시지가 표시됩니다.

Enter the setup code for the device to add

HomeKit 액세서리 시뮬레이터에서 이 번호는 설치 코드 필드 아래에서 찾을 수 있습니다.

The Setup Code field in the HomeKit Accessory Simulator

실제 HomeKit 액세서리의 경우 설치 코드는 디바이스 자체의 레이블, 제품 상자 또는 액세서리의 사용자 설명서에 인쇄됩니다.

액세서리 브라우저의 DidRemoveNewAccessory 이벤트를 모니터링하고 사용자 인터페이스를 업데이트하여 사용자가 홈 컬렉션에 추가한 후 사용 가능한 목록에서 액세서리를 제거해야 합니다.

액세서리 작업

기본 홈이 설정되고 액세서리가 추가되면 사용자가 작업할 수 있는 액세서리(및 선택적으로 방) 목록을 표시할 수 있습니다.

개체에는 HMRoom 지정된 방과 해당 공간에 속하는 모든 액세서리에 대한 모든 정보가 포함됩니다. 객실은 선택적으로 하나 이상의 영역으로 구성될 수 있습니다. A HMZone 에는 지정된 영역에 대한 모든 정보와 해당 영역에 속한 모든 방이 포함됩니다.

이 예제를 위해, 우리는 물건을 단순하게 유지하고 집의 액세서리를 방이나 구역으로 구성하는 대신 직접 작업할 것입니다.

개체에는 HMHome 해당 속성에서 사용자에게 Accessories 표시할 수 있는 할당된 액세서리 목록이 포함되어 있습니다. 예시:

An example accessory

여기에서 사용자는 지정된 액세서리를 선택하고 제공하는 서비스를 사용할 수 있습니다.

서비스 작업

사용자가 지정된 HomeKit 사용 홈 자동화 디바이스와 상호 작용하는 경우 일반적으로 제공하는 서비스를 통해 제공됩니다. 클래스의 HMAccessory 속성에는 Services 디바이스에서 제공하는 서비스를 정의하는 개체 컬렉션 HMService 이 포함됩니다.

서비스는 조명, 자동 온도 조절기, 차고 문 오프너, 스위치 또는 잠금 장치와 같은 것입니다. 일부 장치(예: 차고 도어 오프너)는 조명과 문을 열거나 닫는 기능과 같은 두 개 이상의 서비스를 제공합니다.

지정된 액세서리가 제공하는 특정 서비스 외에도 각 액세서리에는 이름, 제조업체, 모델 및 일련 번호와 같은 속성을 정의하는 속성이 포함되어 Information Service 있습니다.

액세서리 서비스 유형

다음 서비스 유형은 열거형을 HMServiceType 통해 사용할 수 있습니다.

  • AccessoryInformation - 지정된 홈 자동화 디바이스(액세서리)에 대한 정보를 제공합니다.
  • AirQualitySensor - 대기 질 센서를 정의합니다.
  • 배터리 - 액세서리 배터리의 상태를 정의합니다.
  • CarbonDioxideSensor - 이산화탄소 센서를 정의합니다.
  • CarbonMonoxideSensor - 일산화탄소 센서를 정의합니다.
  • ContactSensor - 연락처 센서(예: 열려 있거나 닫히는 창)를 정의합니다.
  • Door - 문 상태 센서(예: 열린 센서 또는 닫힘)를 정의합니다.
  • - 원격 제어 팬을 정의합니다.
  • GarageDoorOpener - 차고 문 오프너를 정의합니다.
  • HumiditySensor - 습도 센서를 정의합니다.
  • LeakSensor - 누수 센서(예: 온수기 또는 세탁기)를 정의합니다.
  • 전구 - 독립 실행형 조명 또는 다른 액세서리(예: 차고 도어 오프너)의 일부인 빛을 정의합니다.
  • LightSensor - 광원 센서를 정의합니다.
  • LockManagement - 자동화된 도어 잠금을 관리하는 서비스를 정의합니다.
  • LockMechanism - 원격 제어 잠금(예: 도어 잠금)을 정의합니다.
  • MotionSensor - 동작 센서를 정의합니다.
  • OccupancySensor - 점유 센서를 정의합니다.
  • 콘센트 - 원격 제어 벽 콘센트를 정의합니다.
  • SecuritySystem - 홈 보안 시스템을 정의합니다.
  • StatefulProgrammableSwitch - 한 번 트리거된 상태(예: 대칭 이동 스위치)에서 다시 기본 프로그래밍 가능한 스위치를 정의합니다.
  • StatelessProgrammableSwitch - 트리거된 후(예: 푸시 단추) 초기 상태로 반환되는 프로그래밍 가능한 스위치를 정의합니다.
  • SmokeSensor - 연기 센서를 정의합니다.
  • 스위치 - 표준 벽 스위치처럼 켜기/끄기 스위치를 정의합니다.
  • TemperatureSensor - 온도 센서를 정의합니다.
  • 자동 온도 조절기 - HVAC 시스템을 제어하는 데 사용되는 스마트 자동 온도 조절기를 정의합니다.
  • - 지팡이를 원격으로 열거나 닫을 수 있는 자동화된 창을 정의합니다.
  • WindowCovering - 열거나 닫을 수 있는 블라인드와 같이 원격으로 제어되는 창 덮개를 정의합니다.

서비스 정보 표시

로드한 HMAccessory 후에는 제공하는 개별 HNService 개체를 쿼리하고 해당 정보를 사용자에게 표시할 수 있습니다.

Displaying Service Information

작업을 시도하기 전에 항상 a의 HMAccessory 속성을 검사 Reachable 합니다. 사용자가 디바이스 범위 내에 없거나 분리된 경우 액세서리에 연결할 수 없습니다.

서비스가 선택되면 사용자는 해당 서비스의 하나 이상의 특성을 보거나 수정하여 지정된 홈 자동화 디바이스를 모니터링하거나 제어할 수 있습니다.

특성 작업

HMService 개체에는 서비스 상태(예: 문을 열거나 닫는 경우)에 대한 정보를 제공하거나 사용자가 조명 색 설정과 같은 상태를 조정할 수 있는 개체 컬렉션 HMCharacteristic 이 포함될 수 있습니다.

HMCharacteristic특성 및 해당 상태에 대한 정보를 제공 할뿐만 아니라 특성 메타데이터 (HMCharacteristisMetadata)를 통해 상태로 작업하는 메서드도 제공합니다. 이 메타데이터는 사용자에게 정보를 표시하거나 상태를 수정하도록 허용할 때 유용한 속성(예: 최소 및 최대 값 범위)을 제공할 수 있습니다.

이 열거형은 HMCharacteristicType 다음과 같이 정의하거나 수정할 수 있는 특성 메타데이터 값 집합을 제공합니다.

  • 관리OnlyAccess
  • AirParticulateDensity
  • AirParticulateSize
  • AirQuality
  • AudioFeedback
  • BatteryLevel
  • 밝기
  • CarbonDioxideDetected
  • CarbonDioxideLevel
  • CarbonDioxidePeakLevel
  • CarbonMonoxideDetected
  • CarbonMonoxideLevel
  • CarbonMonoxidePeakLevel
  • ChargingState
  • ContactState
  • CoolingThreshold
  • CurrentDoorState
  • CurrentHeatingCooling
  • CurrentHorizontalTilt
  • CurrentLightLevel
  • CurrentLockMechanismState
  • CurrentPosition
  • CurrentRelativeHumidity
  • CurrentSecuritySystemState
  • CurrentTemperature
  • CurrentVerticalTilt
  • 펌웨어 버전
  • HardwareVersion
  • HeatingCoolingStatus
  • HeatingThreshold
  • HoldPosition
  • 색상
  • 식별
  • InputEvent
  • LeakDetected
  • LockManagementAutoSecureTimeout
  • LockManagementControlPoint
  • LockMechanismLastKnownAction
  • 로그
  • 제조업체
  • 모델
  • MotionDetected
  • 속성
  • ObstructionDetected
  • OccupancyDetected
  • OutletInUse
  • OutputState
  • PositionState
  • PowerState
  • RotationDirection
  • RotationSpeed
  • 채도
  • SerialNumber
  • SmokeDetected
  • SoftwareVersion
  • StatusActive
  • StatusFault
  • StatusJammed
  • StatusLowBattery
  • StatusTampered
  • TargetDoorState
  • TargetHeatingCooling
  • TargetHorizontalTilt
  • TargetLockMechanismState
  • TargetPosition
  • TargetRelativeHumidity
  • TargetSecuritySystemState
  • TargetTemperature
  • TargetVerticalTilt
  • TemperatureUnits
  • 버전

특성 값 작업

앱에 지정된 특성의 최신 상태가 있는지 확인하려면 클래스의 메서드를 ReadValue 호출합니다 HMCharacteristic . 속성이 err 아닌 null경우 오류가 발생하여 사용자에게 표시될 수도 있고 표시되지 않을 수도 있습니다.

Characteristic의 Value 속성은 지정된 특성의 현재 상태를 a NSObject로 포함하므로 C#에서 직접 작업할 수 없습니다.

값을 읽기 위해 HomeKitIntro 샘플 애플리케이션에 다음 도우미 클래스가 추가되었습니다.

using System;
using Foundation;
using System.Globalization;
using CoreGraphics;

namespace HomeKitIntro
{
    /// <summary>
    /// NS object converter is a helper class that helps to convert NSObjects into
    /// C# objects
    /// </summary>
    public static class NSObjectConverter
    {
        #region Static Methods
        /// <summary>
        /// Converts to an object.
        /// </summary>
        /// <returns>The object.</returns>
        /// <param name="nsO">Ns o.</param>
        /// <param name="targetType">Target type.</param>
        public static Object ToObject (NSObject nsO, Type targetType)
        {
            if (nsO is NSString) {
                return nsO.ToString ();
            }

            if (nsO is NSDate) {
                var nsDate = (NSDate)nsO;
                return DateTime.SpecifyKind ((DateTime)nsDate, DateTimeKind.Unspecified);
            }

            if (nsO is NSDecimalNumber) {
                return decimal.Parse (nsO.ToString (), CultureInfo.InvariantCulture);
            }

            if (nsO is NSNumber) {
                var x = (NSNumber)nsO;

                switch (Type.GetTypeCode (targetType)) {
                case TypeCode.Boolean:
                    return x.BoolValue;
                case TypeCode.Char:
                    return Convert.ToChar (x.ByteValue);
                case TypeCode.SByte:
                    return x.SByteValue;
                case TypeCode.Byte:
                    return x.ByteValue;
                case TypeCode.Int16:
                    return x.Int16Value;
                case TypeCode.UInt16:
                    return x.UInt16Value;
                case TypeCode.Int32:
                    return x.Int32Value;
                case TypeCode.UInt32:
                    return x.UInt32Value;
                case TypeCode.Int64:
                    return x.Int64Value;
                case TypeCode.UInt64:
                    return x.UInt64Value;
                case TypeCode.Single:
                    return x.FloatValue;
                case TypeCode.Double:
                    return x.DoubleValue;
                }
            }

            if (nsO is NSValue) {
                var v = (NSValue)nsO;

                if (targetType == typeof(IntPtr)) {
                    return v.PointerValue;
                }

                if (targetType == typeof(CGSize)) {
                    return v.SizeFValue;
                }

                if (targetType == typeof(CGRect)) {
                    return v.RectangleFValue;
                }

                if (targetType == typeof(CGPoint)) {
                    return v.PointFValue;
                }
            }

            return nsO;
        }

        /// <summary>
        /// Convert to string
        /// </summary>
        /// <returns>The string.</returns>
        /// <param name="nsO">Ns o.</param>
        public static string ToString(NSObject nsO) {
            return (string)ToObject (nsO, typeof(string));
        }

        /// <summary>
        /// Convert to date time
        /// </summary>
        /// <returns>The date time.</returns>
        /// <param name="nsO">Ns o.</param>
        public static DateTime ToDateTime(NSObject nsO){
            return (DateTime)ToObject (nsO, typeof(DateTime));
        }

        /// <summary>
        /// Convert to decimal number
        /// </summary>
        /// <returns>The decimal.</returns>
        /// <param name="nsO">Ns o.</param>
        public static decimal ToDecimal(NSObject nsO){
            return (decimal)ToObject (nsO, typeof(decimal));
        }

        /// <summary>
        /// Convert to boolean
        /// </summary>
        /// <returns><c>true</c>, if bool was toed, <c>false</c> otherwise.</returns>
        /// <param name="nsO">Ns o.</param>
        public static bool ToBool(NSObject nsO){
            return (bool)ToObject (nsO, typeof(bool));
        }

        /// <summary>
        /// Convert to character
        /// </summary>
        /// <returns>The char.</returns>
        /// <param name="nsO">Ns o.</param>
        public static char ToChar(NSObject nsO){
            return (char)ToObject (nsO, typeof(char));
        }

        /// <summary>
        /// Convert to integer
        /// </summary>
        /// <returns>The int.</returns>
        /// <param name="nsO">Ns o.</param>
        public static int ToInt(NSObject nsO){
            return (int)ToObject (nsO, typeof(int));
        }

        /// <summary>
        /// Convert to float
        /// </summary>
        /// <returns>The float.</returns>
        /// <param name="nsO">Ns o.</param>
        public static float ToFloat(NSObject nsO){
            return (float)ToObject (nsO, typeof(float));
        }

        /// <summary>
        /// Converts to double
        /// </summary>
        /// <returns>The double.</returns>
        /// <param name="nsO">Ns o.</param>
        public static double ToDouble(NSObject nsO){
            return (double)ToObject (nsO, typeof(double));
        }
        #endregion
    }
}

애플리케이션 NSObjectConverter 에서 특성의 현재 상태를 읽어야 할 때마다 사용됩니다. 예를 들면 다음과 같습니다.

var value = NSObjectConverter.ToFloat (characteristic.Value);

위의 줄은 값을 Xamarin C# 코드에서 사용할 수 있는 값으로 float 변환합니다.

수정하려면 해당 메서드를 HMCharacteristicWriteValue 호출하고 호출에서 NSObject.FromObject 새 값을 래핑합니다. 예를 들면 다음과 같습니다.

Characteristic.WriteValue(NSObject.FromObject(value),(err) =>{
    // Was there an error?
    if (err!=null) {
        // Yes, inform user
        AlertView.PresentOKAlert("Update Error",err.LocalizedDescription,Controller);
    }
});

속성이 err 아닌 null경우 오류가 발생하여 사용자에게 표시되어야 합니다.

특성 값 변경 테스트

액세서리를 HMCharacteristics 사용하고 시뮬레이션할 때 HomeKit 액세서리 시뮬레이터 내에서 속성 수정 Value 을 모니터링할 수 있습니다.

실제 iOS 디바이스 하드웨어에서 실행되는 HomeKitIntro 앱을 사용하면 HomeKit 액세서리 시뮬레이터에서 특성 값의 변경 내용을 거의 즉시 볼 수 있습니다. 예를 들어 iOS 앱에서 조명 상태를 변경합니다.

Changing the state of a light in an iOS app

HomeKit 액세서리 시뮬레이터에서 조명의 상태를 변경해야 합니다. 값이 변경되지 않으면 새 특성 값을 작성할 때 오류 메시지의 상태를 검사 액세서리에 연결할 수 있는지 확인합니다.

고급 HomeKit 기능

이 문서에서는 Xamarin.iOS 앱에서 HomeKit 액세서리를 사용하는 데 필요한 기본 기능을 설명했습니다. 그러나 이 소개에서는 다루지 않는 HomeKit의 몇 가지 고급 기능이 있습니다.

  • - HomeKit 지원 액세서리는 필요에 따라 최종 사용자가 객실로 구성할 수 있습니다. 이를 통해 HomeKit은 사용자가 쉽게 이해하고 작업할 수 있는 방식으로 액세서리를 제시할 수 있습니다. 회의실을 만들고 기본 방법에 대한 자세한 내용은 Apple의 HMRoom 설명서를 참조하세요.
  • 영역 - 룸은 필요에 따라 최종 사용자가 영역으로 구성할 수 있습니다. 영역은 사용자가 단일 단위로 처리할 수 있는 방 컬렉션을 나타냅니다. 예: 위층, 아래층 또는 지하실. 다시 말하지만, 이를 통해 HomeKit은 최종 사용자에게 적합한 방식으로 액세서리를 제시하고 작업할 수 있습니다. 영역을 만들고 기본 자세한 내용은 Apple의 HMZone 설명서를 참조하세요.
  • 작업 및 작업 집합 - 작업은 접근자 서비스 특성을 수정하고 집합으로 그룹화할 수 있습니다. 작업 집합은 액세서리 그룹을 제어하고 해당 작업을 조정하는 스크립트 역할을 합니다. 예를 들어 "TV 시청" 스크립트는 블라인드를 닫고, 조명을 흐리게 하고, 텔레비전과 사운드 시스템을 켤 수 있습니다. 작업 및 작업 집합 만들기 및 기본 대한 자세한 내용은 Apple의 HMActionHMActionSet 설명서를 참조하세요.
  • 트리거 - 지정된 조건 집합이 충족되면 트리거가 하나 이상의 작업 집합을 활성화할 수 있습니다. 예를 들어 포치 조명을 켜고 바깥쪽이 어두워지면 모든 외부 문을 잠급니다. 트리거를 만들고 기본 방법에 대한 자세한 내용은 Apple의 HMTrigger 설명서를 참조하세요.

이러한 기능은 위에서 설명한 것과 동일한 기술을 사용하므로 Apple의 HomeKitDeveloper 가이드, HomeKit 사용자 인터페이스 지침HomeKit 프레임워크 참조에 따라 쉽게 구현할 수 있습니다.

HomeKit 앱 검토 지침

HomeKit 지원 Xamarin.iOS 앱을 iTunes 앱 스토어에서 릴리스할 iTunes 커넥트 제출하기 전에 HomeKit 사용 앱에 대한 Apple의 지침을 따르세요.

  • HomeKit 프레임워크를 사용하는 경우 앱의 기본 용도 는 홈 자동화여야 합니다 .
  • 앱의 마케팅 텍스트는 HomeKit이 사용되고 있음을 사용자에게 알리고 개인 정보 취급 방침을 제공해야 합니다.
  • 사용자 정보를 수집하거나 광고를 위해 HomeKit을 사용하는 것은 엄격히 금지됩니다.

전체 검토 지침은 Apple의 앱 스토어 검토 지침을 참조하세요.

iOS 9의 새로운 기능

Apple은 iOS 9용 HomeKit을 다음과 같이 변경하고 추가했습니다.

  • 기존 개체 유지 관리 - 기존 액세서리가 수정되면 홈 관리자(HMHomeManager)가 수정된 특정 항목을 알려줍니다.
  • 영구 식별자 - 이제 모든 관련 HomeKit 클래스에는 HomeKit 사용 앱(또는 동일한 앱의 인스턴스)에서 지정된 항목을 고유하게 식별하는 속성이 포함 UniqueIdentifier 됩니다.
  • 사용자 관리 - 기본 사용자 홈의 HomeKit 디바이스에 액세스할 수 있는 사용자에 대한 사용자 관리를 제공하기 위해 기본 제공 보기 컨트롤러가 추가되었습니다.
  • 사용자 기능 - HomeKit 사용자에게는 이제 HomeKit 및 HomeKit 지원 액세서리에서 사용할 수 있는 기능을 제어하는 권한 집합이 있습니다. 앱은 현재 사용자에게만 관련 기능을 표시해야 합니다. 예를 들어 관리자만 다른 사용자를 기본 수 있어야 합니다.
  • 미리 정의된 장면 - 평균 HomeKit 사용자에 대해 발생하는 네 가지 일반적인 이벤트인 Get Up, Leave, Return, Go to Bed에 대해 미리 정의된 장면이 생성되었습니다. 이러한 미리 정의된 장면은 가정에서 삭제할 수 없습니다.
  • 장면 및 Siri - Siri는 iOS 9의 장면에 대해 더 심층적으로 지원하며 HomeKit에 정의된 장면의 이름을 인식할 수 있습니다. 사용자는 Siri에 이름을 말하기만 하면 장면을 실행할 수 있습니다.
  • 액세서리 범주 - 미리 정의된 범주 집합이 모든 액세서리에 추가되었으며 홈에 추가되거나 앱 내에서 작업 중인 액세서리 유형을 식별하는 데 도움이 됩니다. 이러한 새 범주는 액세서리를 설정하는 동안 사용할 수 있습니다.
  • Apple Watch 지원 - HomeKit은 이제 watchOS에서 사용할 수 있으며 Apple Watch는 시계 근처에 있는 i전화 없이 HomeKit 지원 장치를 제어할 수 있습니다. watchOS용 HomeKit은 홈 보기, 액세서리 제어 및 장면 실행 기능을 지원합니다.
  • 새 이벤트 트리거 유형 - iOS 8에서 지원되는 타이머 유형 트리거 외에도 iOS 9는 이제 액세서리 상태(예: 센서 데이터) 또는 지리적 위치를 기반으로 이벤트 트리거를 지원합니다. 이벤트 트리거는 실행에 대한 조건을 설정하는 데 사용합니다 NSPredicates .
  • 원격 액세스 - 원격 액세스를 사용하면 이제 사용자가 원격 위치에서 집을 벗어날 때 HomeKit 사용 홈 자동화 액세서리를 제어할 수 있습니다. iOS 8에서는 사용자가 가정에서 3세대 Apple TV를 사용하는 경우에만 지원되었습니다. iOS 9에서는 이 제한이 해제되고 iCloud 및 HAP(HomeKit Accessory Protocol)를 통해 원격 액세스가 지원됩니다.
  • 새로운 Bluetooth BLE(저에너지) 기능 - HomeKit은 이제 BLE(Bluetooth 저에너지) 프로토콜을 통해 통신할 수 있는 더 많은 액세서리 유형을 지원합니다. HAP 보안 터널링을 사용하여 HomeKit 액세서리는 Wi-Fi를 통해 다른 Bluetooth 액세서리를 노출할 수 있습니다(Bluetooth 범위를 벗어난 경우). iOS 9에서 BLE 액세서리는 알림 및 메타데이터를 완전히 지원합니다.
  • 새로운 액세서리 범주 - Apple은 iOS 9에서 창 덮개, 전동 문 및 Windows, 경보 시스템, 센서 및 프로그래밍 가능한 스위치와 같은 새로운 액세서리 범주를 추가했습니다.

iOS 9에서 HomeKit의 새로운 기능에 대한 자세한 내용은 Apple의 HomeKit 인덱 스 및 HomeKit 비디오의 새로운 기능을 참조하세요.

요약

이 문서에서는 Apple의 HomeKit 홈 자동화 프레임워크를 소개했습니다. HomeKit 액세서리 시뮬레이터를 사용하여 테스트 디바이스를 설정 및 구성하는 방법과 HomeKit을 사용하여 홈 자동화 디바이스를 검색, 통신 및 제어하는 간단한 Xamarin.iOS 앱을 만드는 방법을 보여 줬습니다.