HomeKit в Xamarin.iOS

HomeKit — это платформа Apple для управления устройствами домашней автоматизации. В этой статье приведены сведения о HomeKit и о настройке тестовых аксессуаров в симуляторе аксессуаров HomeKit и написании простого приложения Xamarin.iOS для взаимодействия с этими аксессуарами.

An example HomeKit enabled App

Apple представила HomeKit в iOS 8 в качестве способа эффективной интеграции нескольких устройств автоматизации дома от различных поставщиков в единый, согласованный блок. Благодаря продвижению общего протокола для обнаружения, настройки и управления устройствами домашней автоматизации HomeKit позволяет устройствам от не связанных поставщиков работать вместе, все без необходимости координировать усилия отдельных поставщиков.

С помощью HomeKit можно создать приложение Xamarin.iOS, которое управляет любым устройством с поддержкой HomeKit без использования предоставленных поставщиком API или приложений. С помощью HomeKit можно выполнить следующие действия:

  • Откройте новые устройства домашней автоматизации с поддержкой HomeKit и добавьте их в базу данных, которая будет сохраняться на всех устройствах iOS пользователя.
  • Настройка, настройка, отображение и управление любым устройством в базе данных домашней конфигурации HomeKit.
  • Взаимодействуйте с любым предварительно настроенным устройством HomeKit и командой для выполнения отдельных действий или работы в концерте, например включение всех светов на кухне.

Помимо обслуживания устройств в базе данных домашней конфигурации для приложений с поддержкой HomeKit, HomeKit предоставляет доступ к голосовой команде Siri. Учитывая соответствующую настройку HomeKit, пользователь может выдавать голосовые команды, такие как "Siri, включить свет в гостиной".

База данных домашней конфигурации

HomeKit упорядочивает все устройства автоматизации в заданном расположении в домашней коллекции. Эта коллекция позволяет пользователю сгруппировать устройства домашней автоматизации в логически упорядоченные единицы с значимыми и читаемыми метками.

Домашняя коллекция хранится в базе данных домашней конфигурации, которая автоматически будет резервной копии и синхронизирована на всех устройствах iOS пользователя. HomeKit предоставляет следующие классы для работы с базой данных конфигурации дома:

  • HMHome — Это контейнер верхнего уровня, содержащий все сведения и конфигурации для всех устройств автоматизации дома в одном физическом расположении (например, в одном семейном резиденции). У пользователя может быть несколько резиденций, таких как их основной дом и дом отдыха. Или они могут иметь разные "дома" на одном и том же свойстве, такие как главный дом и гостевой дом над гаражом. В любом случае необходимо настроить и сохранить хотя бы один HMHome объект перед вводом других сведений HomeKit.
  • HMRoom— В то время как необязательно, пользователь может определить определенные комнаты внутри дома (HMHomeнапример, HMRoom кухня, Ванная комната, Гараж или гостиная). Пользователь может сгруппировать все устройства автоматизации дома в определенном расположении в своем доме HMRoom и действовать над ними как единица. Например, попросите Siri отключить гаражные огни.
  • HMAccessory — Это представляет собой физическое устройство автоматизации с поддержкой HomeKit, установленное в резиденции пользователя (например, смарт-термостат). Каждому HMAccessory присваивается .HMRoom Если пользователь не настроил номера, HomeKit назначает аксессуары специальному номеру по умолчанию.
  • HMService — представляет службу, предоставляемую заданным HMAccessory, например состояние включено или выключение света или его цвета (если поддерживается изменение цвета). У каждой HMAccessory службы может быть несколько служб, таких как гаражная дверь, которая также включает в себя свет. Кроме того, у данного HMAccessory объекта могут быть службы, такие как обновление встроенного ПО, которые находятся за пределами пользовательского управления.
  • HMZone — позволяет пользователю сгруппировать коллекцию HMRoom объектов в логические зоны, такие как Upstairs, Downstairs или Basement. Хотя необязательно, это позволяет взаимодействию, как попросить Siri отключить все свет внизу.

Подготовка приложения HomeKit

Из-за требований безопасности, введенных HomeKit, приложение Xamarin.iOS, использующее платформу HomeKit, должно быть правильно настроено как на портале разработчика Apple, так и в файле проекта Xamarin.iOS.

Выполните следующие действия.

  1. Войдите на портал разработчика Apple.

  2. Щелкните сертификаты, идентификаторы и профили.

  3. Если вы еще этого не сделали, щелкните идентификаторы и создайте идентификатор приложения (например com.company.appname, в противном случае измените существующий идентификатор).

  4. Убедитесь, что служба 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 и убедитесь, что вы используете идентификатор приложения, который использовался для создания профиля подготовки:

    Set the App ID

  10. Наконец, измените файл Entitlements.plist и убедитесь, что выбрано право HomeKit :

    Enable the HomeKit entitlement

  11. Сохраните изменения во всех файлах.

С помощью этих параметров приложение теперь готово к доступу к API HomeKit Framework. Подробные сведения о подготовке см. в руководствах по подготовке устройств и подготовке приложения .

Внимание

Для тестирования приложения с поддержкой HomeKit требуется реальное устройство iOS, которое было правильно подготовлено для разработки. HomeKit нельзя протестировать из симулятора iOS.

Симулятор аксессуаров HomeKit

Чтобы обеспечить способ тестирования всех возможных устройств и служб домашней автоматизации, не имея физического устройства, Apple создала симулятор Аксессуара HomeKit. С помощью этого симулятора можно настроить и настроить виртуальные устройства HomeKit.

Установка симулятора

Apple предоставляет симулятор доступа HomeKit как отдельную загрузку из Xcode, поэтому вам потребуется установить его, прежде чем продолжить.

Выполните следующие действия.

  1. В веб-браузере посетите страницу загрузки для разработчиков Apple

  2. Скачайте дополнительные средства для Xcode xxx (где xxx — версия Xcode, установленная вами):

    Download the Additional Tools for Xcode

  3. Откройте образ диска и установите средства в каталоге приложений .

С установленным симулятором доступа HomeKit виртуальные аксессуары можно создать для тестирования.

Создание виртуальных аксессуаров

Чтобы запустить симулятор доступа HomeKit и создать несколько виртуальных аксессуаров, сделайте следующее:

  1. В папке "Приложения" запустите симулятор доступа HomeKit:

    The HomeKit Accessory Simulator

  2. Нажмите кнопку + и выберите новый аксессуар...:

    Add a new accessory

  3. Заполните сведения о новой аксессуаре и нажмите кнопку Готово :

    Fill out the information about the new accessory

  4. Нажмите кнопку Add Service.. и выберите тип службы в раскрывающемся списке:

    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 (и больше), разработчику потребуется добавить NSHomeKitUsageDescription ключ в файл приложения Info.plist и предоставить строку, указывающую, почему приложение хочет получить доступ к базе данных HomeKit пользователя. Эта строка будет представлена пользователю при первом запуске приложения:

The HomeKit permission dialog

Чтобы задать этот ключ, сделайте следующее:

  1. Дважды щелкните Info.plist файл в Обозреватель решений, чтобы открыть его для редактирования.

  2. В нижней части экрана перейдите в представление источника .

  3. Добавьте новую запись в список.

  4. В раскрывающемся списке выберите "Конфиденциальность" — Описание использования HomeKit:

    Select Privacy - HomeKit Usage Description

  5. Введите описание того, почему приложение хочет получить доступ к базе данных HomeKit пользователя:

    Enter a description

  6. Сохраните изменения в файле.

Внимание

Сбой NSHomeKitUsageDescription установки ключа в Info.plist файле приведет к тому, что приложение автоматически завершается ошибкой (закрывается системой во время выполнения) без ошибок при запуске в iOS 10 (или больше).

Подключение в HomeKit

Чтобы взаимодействовать с HomeKit, приложение Xamarin.iOS должно сначала создать экземпляр HMHomeManager класса. Home Manager — это центральная точка входа в HomeKit и отвечает за предоставление списка доступных домов, обновления и поддержания этого списка и возврата первичного дома пользователя.

Объект HMHome содержит все сведения о доме, включая все комнаты, группы или зоны, которые они могут содержать, а также любые аксессуары для автоматизации дома, установленные. Перед выполнением любых операций в HomeKit HMHome необходимо создать и назначить его в качестве основного дома.

Ваше приложение отвечает за проверка, если основной дом существует и создает и назначает его, если он отсутствует.

Добавление домашнего диспетчера

Чтобы добавить осведомленность HomeKit в приложение Xamarin.iOS, измените файл 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 все существующие дома будут загружены в коллекцию домов менеджера, и первичный дом будет загружен, если он доступен.

Добавление основного дома

PrimaryHome Если свойство HMHomeManager события находится null после DidUpdateHomes события, необходимо предоставить пользователю способ создания и назначения первичного дома перед продолжением.

Как правило, приложение будет представлять форму для пользователя, чтобы присвоить пользователю имя нового дома, который затем передается в диспетчер домашней страницы для настройки в качестве основного дома. Для примера приложения HomeKitIntro модальное представление было создано в конструкторе интерфейсов Xcode и вызывается 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является, произошла ошибка, и она должна быть представлена пользователю. Наиболее распространенные ошибки вызваны либо неуникальным именем дома, либо диспетчером домашней страницы, не в состоянии взаимодействовать с HomeKit.

Если дом был создан успешно, необходимо вызвать UpdatePrimaryHome метод, чтобы задать новый дом в качестве основного дома. Опять же, если error свойство не nullявляется, произошла ошибка, и она должна быть представлена пользователю.

Вы также должны отслеживать события и DidRemoveHome события диспетчера домашнего сайтаDidAddHome, а также обновлять пользовательский интерфейс приложения по мере необходимости.

Внимание

Метод AlertView.PresentOKAlert , используемый в приведенном выше примере кода, является вспомогательным классом в приложении HomeKitIntro, которое упрощает работу с оповещениями iOS.

Поиск новых аксессуаров

После определения или загрузки основного дома из домашнего диспетчера приложение Xamarin.iOS может вызвать HMAccessoryBrowser любые новые аксессуары для автоматизации дома и добавить их в дом.

StartSearchingForNewAccessories Вызовите метод, чтобы начать поиск новых аксессуаров и StopSearchingForNewAccessories метода после завершения.

Внимание

StartSearchingForNewAccessories Не следует оставить работу в течение длительного периода времени, так как это негативно влияет как на время работы батареи, так и на производительность устройства iOS. Apple предлагает вызвать StopSearchingForNewAccessories через минуту или только поиск, когда пользовательский интерфейс Find Accessory отображается пользователю.

Событие DidFindNewAccessory будет вызываться при обнаружении новых аксессуаров, и они будут добавлены в DiscoveredAccessories список в браузере аксессуаров.

Список DiscoveredAccessories будет содержать коллекцию объектов, определяющих HMAccessory устройство автоматизации дома с поддержкой HomeKit и доступные службы, такие как свет или управление дверью гаража.

После того как новая аксессуара найдена, она должна быть представлена пользователю и поэтому они могут выбрать его и добавить его в дом. Пример:

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 код установки будет напечатан на этикетке на самом устройстве, в поле продукта или в пользовательском руководстве пользователя аксессуара.

Необходимо отслеживать событие браузера accessory Browser DidRemoveNewAccessory и обновлять пользовательский интерфейс, чтобы удалить аксессуар из доступного списка после того, как пользователь добавил его в домашнюю коллекцию.

Работа с аксессуарами

После создания основного дома и добавления в него аксессуаров можно представить список аксессуаров (и при необходимости) для работы с пользователем.

Объект HMRoom содержит все сведения о данной комнате и любых аксессуарах, принадлежащих к нему. При необходимости комнаты можно упорядочить в одну или несколько зон. A HMZone содержит все сведения о данной зоне и всех комнатах, принадлежащих ему.

В этом примере мы будем держать вещи простыми и работать с аксессуарами дома напрямую, а не упорядочивать их в помещениях или зонах.

Объект HMHome содержит список назначенных аксессуаров, которые можно представить пользователю в своем Accessories свойстве. Например:

An example accessory

Форма здесь, пользователь может выбрать заданный аксессуар и работать со службами, предоставляемыми им.

Работа со службами

Когда пользователь взаимодействует с заданным устройством домашней автоматизации с поддержкой HomeKit, обычно это через предоставляемые им службы. Свойство ServicesHMAccessory класса содержит коллекцию объектов, определяющих HMService службы, которые предлагают устройства.

Услуги — это такие вещи, как свет, термостаты, открытые двери гаража, коммутаторы или замки. Некоторые устройства (например, открыватель двери гаража) предоставляют несколько услуг, таких как свет и возможность открывать или закрывать дверь.

Помимо определенных служб, предоставляемых данной аксессуарой, каждая аксессуара Information Service содержит свойства, такие как имя, производитель, модель и серийный номер.

Типы служб аксессуаров

Следующие типы служб доступны через перечисление HMServiceType :

  • AccessoryInformation — предоставляет сведения о заданном устройстве автоматизации дома (аксессуар).
  • AirQualitySensor — определяет датчик качества воздуха.
  • Батарея — определяет состояние батареи аксессуара.
  • CarbonDioxideSensor — определяет датчик углекислого газа.
  • CarbonMonoxideSensor — определяет датчик моноксида углерода.
  • ContactSensor — определяет датчик контакта (например, окно, открывающееся или закрытое).
  • Door — определяет датчик состояния двери (например, открытый или закрытый).
  • Вентилятор — определяет удаленный управляемый вентилятор.
  • GarageDoorOpener — определяет открыватель двери гаража.
  • ВлажностьSensor — определяет датчик влажности.
  • LeakSensor — определяет датчик утечки (например, для горячего нагревателя или стиральной машины).
  • LightBulb — определяет автономный свет или свет, который является частью другой аксессуара (например, открыватель двери гаража).
  • LightSensor — определяет датчик света.
  • LockManagement — определяет службу, которая управляет автоматизированной блокировкой двери.
  • LockMechanism — определяет удаленную блокировку (например, блокировку двери).
  • MotionSensor — определяет датчик движения.
  • ЗаполнениеSensor — определяет датчик заполнения.
  • Выход — определяет удаленный контролируемый выход стены.
  • SecuritySystem — определяет домашнюю систему безопасности.
  • StatefulProgrammableSwitch — определяет программируемый коммутатор, который остается в состоянии передачи после активации (например, переключатель перевернутого).
  • StatelessProgrammableSwitch — определяет программируемый коммутатор, который возвращается к исходному состоянию после активации (например, кнопки push).
  • SmokeSensor — определяет датчик дыма.
  • Переключатель — определяет переключатель включено или выключение, например стандартный переключатель стены.
  • TemperatureSensor — определяет датчик температуры.
  • Термостат — определяет смарт-термостат , используемый для управления системой HVAC.
  • Окно — определяет автоматическое окно, которое может быть удаленно открыто или закрыто.
  • WindowCovering — определяет удаленно управляемое покрытие окна, например слепки, которые могут быть открыты или закрыты.

Отображение сведений о службе

После загрузки HMAccessory вы можете запросить отдельные HNService объекты, которые он предоставляет, и отобразить эти сведения пользователю:

Displaying Service Information

Прежде чем пытаться работать с ним, следует всегда проверка Reachable свойство объектаHMAccessory. Аксессуар может быть недоступен для пользователя не в пределах диапазона устройства или если он был отключен.

После выбора службы пользователь может просмотреть или изменить одну или несколько характеристик этой службы для мониторинга или управления данным устройством домашней автоматизации.

Работа с характеристиками

Каждый HMService объект может содержать коллекцию HMCharacteristic объектов, которые могут предоставлять сведения о состоянии службы (например, открываемой или закрытой дверью) или разрешать пользователю настраивать состояние (например, задать цвет света).

HMCharacteristic не только предоставляет сведения о характеристике и его состоянии, но и предоставляет методы для работы с состоянием с помощью метаданных характеристик (HMCharacteristisMetadata). Эти метаданные могут предоставлять свойства (например, минимальные и максимальные диапазоны значений), которые полезны при отображении сведений пользователю или предоставлении им возможности изменять состояния.

Перечисление HMCharacteristicType предоставляет набор значений метаданных характеристик, которые можно определить или изменить следующим образом:

  • Администратор OnlyAccess
  • AirParticulateDensity
  • AirParticulateSize
  • AirQuality
  • AudioFeedback
  • Уровень заряда
  • Яркость
  • CarbonDioxideDetected
  • CarbonDioxideLevel
  • CarbonDioxidePeakLevel
  • CarbonMonoxideDetected
  • CarbonMonoxideLevel
  • CarbonMonoxidePeakLevel
  • ЗарядкаState
  • ContactState
  • ОхлаждениеThreshold
  • CurrentDoorState
  • CurrentHeatingCooling
  • CurrentHorizontalTilt
  • CurrentLightLevel
  • CurrentLockMechanismState
  • CurrentPosition
  • CurrentRelativeHumidity
  • CurrentSecuritySystemState
  • CurrentTemperature
  • CurrentVerticalTilt
  • FirmwareVersion
  • HardwareVersion
  • HeatingCoolingStatus
  • НагреваниеThreshold
  • Удержание
  • Оттенок
  • Выявление
  • InputEvent
  • УтечкаDetected
  • LockManagementAutoSecureTimeout
  • LockManagementControlPoint
  • LockMechanismLastKnownAction
  • Журналы
  • Производитель
  • Модель
  • MotionDetected
  • Имя.
  • ОбструкцияDetected
  • Заполнение
  • OutletInUse
  • OutputState
  • PositionState
  • PowerState
  • Сменаdirection
  • Смена
  • Насыщенность
  • SerialNumber
  • SmokeDetected
  • SoftwareVersion
  • StatusActive
  • StatusFault
  • StatusJammed
  • StatusLowBattery
  • StatusTampered
  • TargetDoorState
  • TargetHeatingCooling
  • TargetHorizontalTilt
  • TargetLockMechanismState
  • TargetPosition
  • TargetRelativeHumidity
  • TargetSecuritySystemState
  • TargetTemperature
  • TargetVerticalTilt
  • TemperatureUnits
  • Версия

Работа со значением характеристик

Чтобы убедиться, что приложение имеет последнее состояние заданной характеристики, вызовите ReadValue метод HMCharacteristic класса. err Если свойство не nullтак, произошла ошибка, и она может быть представлена пользователю.

Свойство "Характеристика" Value содержит текущее состояние заданной характеристики в качестве атрибута 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);

Приведенная выше строка преобразует значение в объект float , который затем можно использовать в коде Xamarin C#.

Чтобы изменить HMCharacteristicметод, вызовите метод WriteValue и заключите новое значение в 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 имитируемыми аксессуарами Value изменения свойства можно отслеживать внутри симулятора аксессуаров HomeKit.

С помощью приложения HomeKitIntro, работающего на реальном оборудовании устройств iOS, изменения значения характеристик должны быть замечены почти мгновенно в симуляторе аксессуаров HomeKit. Например, изменение состояния света в приложении iOS:

Changing the state of a light in an iOS app

Следует изменить состояние света в симуляторе аксессуаров HomeKit. Если значение не изменяется, проверка состояние сообщения об ошибке при написании новых значений характеристик и убедитесь, что аксессуар по-прежнему доступен.

Расширенные функции HomeKit

В этой статье рассматриваются основные функции, необходимые для работы с аксессуарами HomeKit в приложении Xamarin.iOS. Однако существует несколько расширенных функций HomeKit, которые не рассматриваются в этом руководстве:

  • Комнаты — аксессуары с поддержкой HomeKit могут при необходимости упорядочиваться в комнаты конечным пользователем. Это позволяет HomeKit представлять аксессуары таким образом, чтобы пользователь понимал и работал с ним. Дополнительные сведения о создании и обслуживании помещений см. в документации Apple по HMRoom .
  • Зоны — комнаты можно упорядочить в зоны конечным пользователем. Зона относится к коллекции комнат, которые пользователь может рассматривать как одну единицу. Например: вверх, внизу или подвал. Опять же, это позволяет HomeKit представлять и работать с аксессуарами таким образом, что имеет смысл для конечного пользователя. Дополнительные сведения о создании и обслуживании зон см. в документации Apple по HMZone .
  • Действия и наборы действий — действия изменяют характеристики службы аксессуаров и могут быть сгруппированы в наборы. Наборы действий служат скриптами для управления группой аксессуаров и координации их действий. Например, сценарий "Смотреть телевизор" может закрыть слепые, тусклые свет и включить телевизор и ее звуковую систему. Дополнительные сведения о создании и обслуживании наборов действий и действий Apple см. в документации по HMAction и HMActionSet.
  • Триггеры — триггер может активировать один или несколько наборов действий при выполнении заданного набора условий. Например, включите свет порта и заблокируйте все внешние двери, когда он становится темным вне. Дополнительные сведения о создании и обслуживании триггеров см. в документации Apple по HMTrigger .

Так как эти функции используют те же методы, которые представлены выше, они должны быть легко реализованы, следуя руководству Apple HomeKitDeveloper, руководству по пользовательскому интерфейсу HomeKit и справочнику по HomeKit Framework.

Рекомендации по просмотру приложений HomeKit

Перед отправкой приложения Xamarin.iOS с поддержкой HomeKit в iTunes Подключение для выпуска в iTunes App Store убедитесь, что вы следуйте рекомендациям Apple для приложений с поддержкой HomeKit:

  • Основное назначение приложения должно быть домашней автоматизацией при использовании платформы HomeKit.
  • Маркетинговый текст приложения должен уведомить пользователей о том, что HomeKit используется, и они должны предоставить политику конфиденциальности.
  • Сбор сведений о пользователях или использование HomeKit для рекламы строго запрещено.

Полные рекомендации по обзору см. в рекомендациях по обзору Apple App Store.

Новые возможности iOS 9

Apple внесла следующие изменения и дополнения к HomeKit для iOS 9:

  • Сохранение существующих объектов . Если существующий аксессуар изменен, диспетчер домашней страницы (HMHomeManager) сообщит вам о конкретном элементе, который был изменен.
  • Постоянные идентификаторы. Все соответствующие классы HomeKit теперь включают UniqueIdentifier свойство для уникальной идентификации данного элемента в приложениях с поддержкой HomeKit (или экземплярах одного и того же приложения).
  • Управление пользователями— добавлен встроенный контроллер представления для предоставления управления пользователями, имеющими доступ к устройствам HomeKit в главном доме пользователя.
  • Возможности пользователей — пользователи HomeKit теперь имеют набор привилегий, которые управляют функциями, которые они могут использовать в аксессуарах с поддержкой HomeKit и HomeKit. Приложение должно отображать только соответствующие возможности для текущего пользователя. Например, только администраторы должны иметь возможность поддерживать других пользователей.
  • Предопределенные сцены — предопределенные сцены созданы для четырех распространенных событий, происходящих для среднего пользователя HomeKit: Get Up, Leave, Return, Go to Bed. Эти предопределенные сцены нельзя удалить из дома.
  • Сцены и Siri — Siri имеет более глубокую поддержку Сцен в iOS 9 и может распознавать имя любой сцены, определенной в HomeKit. Пользователь может выполнять сцену, просто говоря его имя в Siri.
  • Категории аксессуаров — набор предопределенных категорий добавлен ко всем аксессуарам и помогает определить тип аксессуаров, добавляемый в дом или работаемый из приложения. Эти новые категории доступны во время настройки Аксессуара.
  • Поддержка Apple Watch — HomeKit теперь доступна для watchOS, и Apple Watch сможет управлять устройствами с поддержкой HomeKit без i Телефон находиться рядом с часами. HomeKit для watchOS поддерживает следующие возможности: просмотр домов, управление аксессуарами и выполнение сцен.
  • Новый тип триггера события. Помимо триггеров типа таймера, поддерживаемых в iOS 8, iOS 9 теперь поддерживает триггеры событий на основе состояния аксессуара (например, данных датчика) или географического расположения. Триггеры событий используются NSPredicates для задания условий их выполнения.
  • Удаленный доступ — с удаленным доступом пользователь теперь может управлять своими аксессуарами домашней автоматизации с поддержкой HomeKit, когда они находятся вне дома в удаленном расположении. В iOS 8 это было поддерживается только в том случае, если у пользователя есть 3-е поколение Apple TV в доме. В iOS 9 это ограничение снято, а удаленный доступ поддерживается с помощью iCloud и протокола доступа HomeKit (HAP).
  • Новые возможности Bluetooth Low Energy (BLE) — HomeKit теперь поддерживает больше типов аксессуаров, которые могут взаимодействовать через протокол Bluetooth Low Energy (BLE). Использование безопасного туннелирования HAP, аксессуар HomeKit может предоставлять еще один аксессуар Bluetooth через Wi-Fi (если он выходит из диапазона Bluetooth). В iOS 9 аксессуары BLE имеют полную поддержку уведомлений и метаданных.
  • Новые категории аксессуаров — Apple добавила следующие новые категории аксессуаров в iOS 9: покрытия окон, моторизованные двери и окна, системы сигнализации, датчики и программируемые коммутаторы.

Дополнительные сведения о новых функциях HomeKit в iOS 9 см. в разделе "Индекс HomeKit Apple" и "Новые возможности" в видео HomeKit.

Итоги

В этой статье представлена платформа домашней автоматизации Apple HomeKit. В нем показано, как настроить и настроить тестовые устройства с помощью симулятора доступа HomeKit и как создать простое приложение Xamarin.iOS для обнаружения, взаимодействия с устройствами домашней автоматизации и управления ими с помощью HomeKit.