[iOS 8] HomeKit 対応アプリを作ろう (3) Swift で54行で試せる HomeKit のアクセサリーブラウザの実装方法

2014.11.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

HomeKit を試してみよう!

おはようございます!今回は Swift で HomeKit をわずか54行で試せる HomeKit のアクセサリーブラウザを作ってみたのでご紹介致します。

HomeKit は HealthKit と並び、 iOS 8 の新機能の中で、私が特に期待していたものの1つでした。しかしながら、対応製品には MFi(Made For iPhone) が必要ということもあり、日本の大手メーカーからは対応製品がすぐには出ないだろうなと推測できました。ですので少し残念でしたが、スタートアップの企業などが HomeKit 対応製品を販売したら、弊社のブログでも紹介させて頂きたいと思います。もちろん大手メーカーでも製品を出されたら紹介させて頂きたいと思います。

HomeKit について更に詳しく知りたい方は、弊社諏訪の記事 [iOS 8] HomeKit 対応アプリを作ろう (1) 概要 をご覧下さい。

HomeKit 実装

プロジェクトで HomeKit を有効にする

早速実装していきます。

Xcode 6 以降 で新規プロジェクトを作成します。プロジェクト作成後、プロジェクトの 「Capabilities」 から HomeKit を有効にします。このスイッチを ON にすることで、自動的に HomeKit.framework と アプリ名.entitlements が追加されます。

homekit_01

HealthKit と同じですね。App Store へリリースしたい時は、Distributionの ProvisioningProfile でも HomeKit を有効にしてください。

画像内の③に書いてあるシミュレーターについては後述します。「HomeKit Accessory Simulator」をダウンロードしておいてください。

アクセサリーブラウザ画面を作成する

アクセサリーブラウザとは、 iPhone と同一ネットワーク内にある HomeKit 対応製品をサーチする機能です。見つけた製品に対して、 HealthKit の API を通して遠隔で操作することが出来ます。

今回は製品が手元にないので、サーチするところまでを実装します。 UITableViewController を作成後、以下のように記述してください。

AccessoriesTableViewController

import UIKit
import HomeKit

class AccessoriesTableViewController: UITableViewController, HMAccessoryBrowserDelegate {

    private let accessoryBrowser = HMAccessoryBrowser()
    private var accessories = [HMAccessory]()

    override func viewDidLoad() {
        super.viewDidLoad()

        accessoryBrowser.delegate = self
        accessoryBrowser.startSearchingForNewAccessories()
    }

    func accessoryBrowser(browser: HMAccessoryBrowser!, didFindNewAccessory accessory: HMAccessory!) {
        NSLog("find \(accessory)")

        accessories.append(accessory)
        tableView.reloadData()
    }

    func accessoryBrowser(browser: HMAccessoryBrowser!, didRemoveNewAccessory accessory: HMAccessory!) {
        NSLog("remove \(accessory)")

        forIndexSearch: for index in 0..<accessories.count {
            if (accessories[index].isEqual(accessory)) {
                accessories.removeAtIndex(index)
                break forIndexSearch
            }
        }

        tableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // MARK: - Table view data source

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return accessories.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")

        let accessory = accessories[indexPath.row]
        cell.textLabel.text = accessory.name

        return cell
    }
}

ポイントは HMAccessoryBrowserDelegate の実装です。あとは単純に見つけたアクセサリーをテーブルに表示しているだけです。アクセサリーの電源が OFF になった時には、対象の製品がテーブルから消えるようにしています。

HomeKit をシミュレートする

実装が終わって、いざアプリを起動してみても同一ネットワーク内に HomeKit 対応製品がなければ何も表示されません。そこで、 Appple から配布されている HomeKit 対応製品をシミュレートするためのアプリ「HomeKit Accessory Simulator」を使用します。

2014/11/13 現在最新版のXcode 6.1で、HomeKitをシミュレートするためには、Apple Developersから「hardwareiotoolsforxcode_6.1」をダウンロードする必要があります。

こちらのイメージ内の「HomeKit Accessory Simulator」を使って、擬似的に HomeKit のハードウェアを構成することができます。

「HomeKit Accessory Simulator」を起動したらメニューの「File → New → Accessory...」からシミュレートするためのアクセサリーを追加します。

homekit_07homekit_02

その後、アクセサリーの持つサービス・特性を設定する事ができますので、テストしたい製品を作成してください。今回は製品を探す機能しか実装していないので、どの製品でも構いません。

homekit_03

3つの製品を追加しました。スイッチを ON にして、同一ネットワーク上の iPhone 実機で確認してみます。

homekit_04

次に、1つ目の製品のスイッチを OFF にして、表示が消えることを確認します。

homekit_05homekit_06

以上のように動作すれば、HomeKit 対応製品の名前をテーブルビューにリスト表示するアプリが出来ました。

実際にアプリを作成する時は、見つけた製品名をタップすると操作できる画面に遷移して、個々の製品の特性を遠隔操作できるようにすると良いでしょう。

まとめ

HomeKit の実装の流れは、プロジェクトの設定が HealthKit とほとんど同じであり、実装手順が CoreBluetooth とほとんど同じです。製品の持つ、サービス(Service)と特性(Characteristic)というワードも BLE の GATTプロファイル から来ているのでしょう。少しでも CoreBluetooth の実装をしたことがある方でしたら、アクセサリーブラウザの実装は簡単かもしれません。

堤さんの記事、【iOS8】いますぐ試せる HealthKit & HomeKitAdd Star では 「BLE の GATT、IP の JSON をラップする独自プロトコル」 と書かれていました。

HomeKit にはこの他にも、PrimaryHome を設定したり Room や Zone を設定したりすることが出来ます。しかしながら、現在だとあまり必要ないのでは・・・と思います。特に家が比較的小さい日本では、欧米などに比べて需要が少ないでしょう。

HomeKit の真の実力は製品が登場した後に発揮されます。先に、欧米などで実績が出た後に、日本にその製品がやってくることかと思われます。そこにアンテナを張っておくと少しだけ得した気分になれるかもしれませんね。