HVC-C Betaを用いたiOSアプリの制作in development

 
date:2015.01.13   posted by:Tanaka
 

お晩です、インターンの田中です。
前回はHVC-CのiOS SDKに付属するサンプルプロジェクトの起動方法について書きました。
次回はアプリのアイデアを発表すると予告していましたが、一気に作ってしまうところまでやってしまったので
今回は
・作った物の紹介
・新規プロジェクト立ち上げ時の事前設定と注意点
・SDKをSwiftで扱う時の注意点
を書いていきます。

作った物の紹介

今回作ったのは、ひたすら真顔で耐え続けるゲームアプリ。

その名も「(真顔)」(かっこまがお)です。

真顔で耐え続けて、何秒耐えられるかというゲーム。
想定する使用シーンは飲み会など、盛り上げてくれる人が居る場。
言われたらマズいことを言われても屈さず、どんなにおもしろいギャグが聞こえてきても笑わない鉄の意志を持ってください。

プレイ動画はこちら。

デモ画面動画
https://www.youtube.com/watch?v=I4xyRg6CGB8&feature=youtu.be

デモプレイ動画
https://www.youtube.com/watch?v=pcqd7oE1ACk&feature=youtu.be

こちらのアプリ、Swiftで書いてみました。
実装する上でポイントとなる部分を以下で紹介していきます。

新規プロジェクト立ち上げ時の事前設定

・SDKの追加

ダウンロードしたSDKファイルの中のsample_code > SimpleDemo > SDKのSDKフォルダを丸ごと、コピーでプロジェクトに追加してください。

・Background ModesとWireless Accessory Configurationの設定

Capabilitiesの中のWireless Accsessory ConfigurationとBackground ModesをOnにしてください。
Background ModesをOnにしたらその中のUses Bluetooth LE accessoriesにチェックを入れてください。

・Other Linker Flagsの設定

Build SettingsのOther Linker Flagsに-ObjCと入力しましょう。
項目を早く見つけるためには検索を使うと良いです。

・HVC-Cに接続するときにその他の処理を受け付けなくなる問題の対処法

サンプルプロジェクトでもあるように、iPhoneとHVC-Cを接続する際にその他の処理がストップします。
今回作ったアプリでも接続をするタイミングの待ち時間でUIActivityIndicatorViewを使って待機状態を利用者に知らせるようにしようとしたのですが、処理がストップしているのでうまく動きませんでした。
原因はセマフォを利用している部分。
対処方法はこちら(Objective-Cでスレッドをデッドロックさせずに非同期処理の終了を待つ方法。)を参考に以下のように書き換えました。

var semaphore: dispatch_semaphore_t = dispatch_semaphore_create(0)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
    for var i = 0; i < 10; i++ {
        sleep(1)

        dispatch_async(dispatch_get_main_queue(), {
            self.indicator.hidden = false
            self.indicator.startAnimating()
        })
    }

    dispatch_semaphore_signal(semaphore)
})

while dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW) != 0 {
    println("wait...")
    NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 0.1))
}

SDKをSwiftで扱う時の注意点

・Bridging Headerの設定

SDKはObjective-Cで書かれています。
Swiftで扱うにはBridging Headerを作成してBuild SettingsのObjective-C Bridging Headerの項目に作成したBridging Headerのファイル名を記入してください。
Bridging Headerの詳しい設定方法は調べるといくつか出てきますので、そちらを参考にしてください。

・HVCC_Define.hの書き換え

Objective-CのコードをSwiftで扱う時にいくつかのお約束がありますが、今回はenumです。
こちら(SwiftからObjective-Cのenumを扱う時の注意事項SwiftからObjective-Cのenumを扱う時の注意事項2)を参考にさせていただきました。
ビットによるフラグ管理を行うときenumに16進数を指定したりしますが、それをSwiftで扱う場合はObjective-C側をenumからNS_OPTIONSに書き換える必要があります。
HVCC_Define.hにもSwiftから扱うHVC_FUNCTIONというenumが存在しますので、それを以下のように書き換えます。

typedef NS_OPTIONS(NSInteger, HVC_FUNCTION)
{
    // 人体検出
    HVC_ACTIV_BODY_DETECTION        = 0x00000001,
    // 手検出
    HVC_ACTIV_HAND_DETECTION        = 0x00000002,
    // 顔検出
    HVC_ACTIV_FACE_DETECTION        = 0x00000004,
    // 顔方向検出
    HVC_ACTIV_FACE_DIRECTION        = 0x00000008,
    // 年齢推定
    HVC_ACTIV_AGE_ESTIMATION        = 0x00000010,
    // 性別推定
    HVC_ACTIV_GENDER_ESTIMATION     = 0x00000020,
    // 視線推定
    HVC_ACTIV_GAZE_ESTIMATION       = 0x00000040,
    // 目つむり推定
    HVC_ACTIV_BLINK_ESTIMATION      = 0x00000080,
    // 表情推定
    HVC_ACTIV_EXPRESSION_ESTIMATION = 0x00000100,
};

以上が特に気になるポイントでした。
あとはSDKのサンプルを元に自分のアプリで使いたい機能を抽出して、HVC-Cから送られるデータを扱ってやればホイホイホイッとアプリができるというわけです。
紹介した物の他にもう一つ作ってみようと思いますので、次回はその紹介をしたいと思いますー。

 
Copyright © TheDesignium inc. powered by WordPress & mootools.
Relative Keyword|none