HomeKit в Xamarin.iOS
HomeKit — это платформа Apple для управления устройствами домашней автоматизации. В этой статье приведены сведения о HomeKit и о настройке тестовых аксессуаров в симуляторе аксессуаров HomeKit и написании простого приложения Xamarin.iOS для взаимодействия с этими аксессуарами.
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.
Выполните следующие действия.
Войдите на портал разработчика Apple.
Щелкните сертификаты, идентификаторы и профили.
Если вы еще этого не сделали, щелкните идентификаторы и создайте идентификатор приложения (например
com.company.appname
, в противном случае измените существующий идентификатор).Убедитесь, что служба HomeKit была проверка для заданного идентификатора:
Сохранение изменений.
Щелкните "Разработка профилей>подготовки" и создайте новый профиль подготовки разработки для приложения:
Скачайте и установите новый профиль подготовки или используйте Xcode для скачивания и установки профиля.
Измените параметры проекта Xamarin.iOS и убедитесь, что вы используете только что созданный профиль подготовки:
Затем измените файл Info.plist и убедитесь, что вы используете идентификатор приложения, который использовался для создания профиля подготовки:
Наконец, измените файл Entitlements.plist и убедитесь, что выбрано право HomeKit :
Сохраните изменения во всех файлах.
С помощью этих параметров приложение теперь готово к доступу к API HomeKit Framework. Подробные сведения о подготовке см. в руководствах по подготовке устройств и подготовке приложения .
Внимание
Для тестирования приложения с поддержкой HomeKit требуется реальное устройство iOS, которое было правильно подготовлено для разработки. HomeKit нельзя протестировать из симулятора iOS.
Симулятор аксессуаров HomeKit
Чтобы обеспечить способ тестирования всех возможных устройств и служб домашней автоматизации, не имея физического устройства, Apple создала симулятор Аксессуара HomeKit. С помощью этого симулятора можно настроить и настроить виртуальные устройства HomeKit.
Установка симулятора
Apple предоставляет симулятор доступа HomeKit как отдельную загрузку из Xcode, поэтому вам потребуется установить его, прежде чем продолжить.
Выполните следующие действия.
В веб-браузере посетите страницу загрузки для разработчиков Apple
Скачайте дополнительные средства для Xcode xxx (где xxx — версия Xcode, установленная вами):
Откройте образ диска и установите средства в каталоге приложений .
С установленным симулятором доступа HomeKit виртуальные аксессуары можно создать для тестирования.
Создание виртуальных аксессуаров
Чтобы запустить симулятор доступа HomeKit и создать несколько виртуальных аксессуаров, сделайте следующее:
В папке "Приложения" запустите симулятор доступа HomeKit:
Нажмите кнопку + и выберите новый аксессуар...:
Заполните сведения о новой аксессуаре и нажмите кнопку Готово :
Нажмите кнопку Add Service.. и выберите тип службы в раскрывающемся списке:
Укажите имя службы и нажмите кнопку "Готово":
Вы можете предоставить дополнительные характеристики для службы, нажав кнопку "Добавить характеристику" и настроив необходимые параметры:
Повторите описанные выше действия, чтобы создать одно из типов виртуального устройства автоматизации дома, которое поддерживает HomeKit.
С помощью некоторых примеров виртуальных аксессуаров HomeKit, созданных и настроенных, теперь вы можете использовать и управлять этими устройствами из приложения Xamarin.iOS.
Настройка файла Info.plist
Новое для iOS 10 (и больше), разработчику потребуется добавить NSHomeKitUsageDescription
ключ в файл приложения Info.plist
и предоставить строку, указывающую, почему приложение хочет получить доступ к базе данных HomeKit пользователя. Эта строка будет представлена пользователю при первом запуске приложения:
Чтобы задать этот ключ, сделайте следующее:
Дважды щелкните
Info.plist
файл в Обозреватель решений, чтобы открыть его для редактирования.В нижней части экрана перейдите в представление источника .
Добавьте новую запись в список.
В раскрывающемся списке выберите "Конфиденциальность" — Описание использования HomeKit:
Введите описание того, почему приложение хочет получить доступ к базе данных HomeKit пользователя:
Сохраните изменения в файле.
Внимание
Сбой 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:
Если пользователь ответит ОК, приложение сможет работать со своими аксессуарами 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 и доступные службы, такие как свет или управление дверью гаража.
После того как новая аксессуара найдена, она должна быть представлена пользователю и поэтому они могут выбрать его и добавить его в дом. Пример:
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
является, произошла ошибка, и она должна быть представлена пользователю. В противном случае пользователю будет предложено ввести код установки для добавления устройства:
В симуляторе доступа HomeKit этот номер можно найти в поле "Код установки":
Для реальных аксессуаров HomeKit код установки будет напечатан на этикетке на самом устройстве, в поле продукта или в пользовательском руководстве пользователя аксессуара.
Необходимо отслеживать событие браузера accessory Browser DidRemoveNewAccessory
и обновлять пользовательский интерфейс, чтобы удалить аксессуар из доступного списка после того, как пользователь добавил его в домашнюю коллекцию.
Работа с аксессуарами
После создания основного дома и добавления в него аксессуаров можно представить список аксессуаров (и при необходимости) для работы с пользователем.
Объект HMRoom
содержит все сведения о данной комнате и любых аксессуарах, принадлежащих к нему. При необходимости комнаты можно упорядочить в одну или несколько зон. A HMZone
содержит все сведения о данной зоне и всех комнатах, принадлежащих ему.
В этом примере мы будем держать вещи простыми и работать с аксессуарами дома напрямую, а не упорядочивать их в помещениях или зонах.
Объект HMHome
содержит список назначенных аксессуаров, которые можно представить пользователю в своем Accessories
свойстве. Например:
Форма здесь, пользователь может выбрать заданный аксессуар и работать со службами, предоставляемыми им.
Работа со службами
Когда пользователь взаимодействует с заданным устройством домашней автоматизации с поддержкой HomeKit, обычно это через предоставляемые им службы. Свойство Services
HMAccessory
класса содержит коллекцию объектов, определяющих 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
объекты, которые он предоставляет, и отобразить эти сведения пользователю:
Прежде чем пытаться работать с ним, следует всегда проверка 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:
Следует изменить состояние света в симуляторе аксессуаров 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.