iOSアプリと連携させて使えるデバイスたち

第4回1,600万色の表現力をもつLED電球「hue」連携するiOSアプリをつくる その2:応用編

前回の記事その1:基礎編では、Philips hueの特長、HueSDKのプロジェクトへの導入方法、基本的な機能の実装方法を一通り紹介しました。本記事ではそれらを踏まえた応用編として、iOS7の新機能+Parse+hueを使ったアプリの実装方法を説明します。

プッシュ通知がきたときにhueを光らせる

iOS7登場以前はプッシュ通知を送ることはできても、ユーザがアプリを起動しない限りは任意の処理を行うことはできませんでした。しかし、iOS7からプッシュ通知(Remote notification)をバックグラウンドで処理できるようになり、Background Fetchも可能になり、さらに画面表示や通知音を出さない「サイレントプッシュ」も可能になりました。

そこで、これらのiOS7新機能を活用し、プッシュ通知の受信をhueの明滅で知らせるサンプルを作成します。これにより、⁠その1」で紹介したundaの事例「新規ユーザがサインアップしたらhueが光る」のように、何らかの重要な通知を、ランプの明滅という気付きやすいアラートで知らせることが可能になります。

上述したiOS7の新機能のおかげで、hueを光らせるためにアプリを起動する必要がない、という点がポイントです。また、通常はプッシュ通知を送るためにはサーバを用意する必要があるのですが、本記事ではモバイル向けバックエンドを代替わりしてくれるクラウドサービスParseを使用してプッシュ通知を送信する手順を紹介します。

①Parseにサインアップ、新規アプリを作成する

サインアップは Github アカウントでログインするだけ。

あとは、会社の形態を選択し、アプリ名を入力すれば新規アプリが作成されます。

②Parse SDKをプロジェクトに導入する

HueSDK入りプロジェクトとして、⁠その1:基礎編」で説明したとおり "QuickStartApp_iOS" を複製したものを用意します。

Parseのダウンロードページより、iOS用SDKをダウンロードします。

zipファイルを解凍すると出てくる、Parse.frameworkをプロジェクトに追加し、下記依存フレームワークもプロジェクトにリンクしておきます。

  • AudioToolbox.framework
  • CFNetwork.framework
  • CoreGraphics.framework
  • CoreLocation.framework
  • libz.dylib
  • MobileCoreServices.framework
  • QuartzCore.framework
  • Security.framework
  • StoreKit.framework
  • SystemConfiguration.framework

ここでヘッダをインポートしてビルドしてみると、Facebook SDK関連のUndefined symbolsエラーが大量に出てきます。hueを利用したプロジェクト [Build Settings] > [Other Linker Flags] で "-ObjC" フラグを削除するか、それで他のライブラリの利用に不都合が出る場合は、Facebook iOS SDKを追加してください。

参考記事:

③AppDelegateの実装

AppDelegate.m でヘッダをインポートします。

#import <Parse/Parse.h>

application:didFinishLaunchingWithOptions:で、ParseのApplication IdとClient Keyをセットするメソッドと、⁠通常のプッシュ通知の実装と同様に⁠⁠ registerForRemoteNotificationTypes: メソッドをコールします。

[Parse setApplicationId:@"YOUR_APPLICATION_ID"
              clientKey:@"YOUR_CLIENT_KEY"];

[application registerForRemoteNotificationTypes:
 UIRemoteNotificationTypeBadge|
 UIRemoteNotificationTypeAlert|
 UIRemoteNotificationTypeSound];

Application IdとClient Keyは、Parseダッシュボードの [Settings] > [Application Keys] で確認できるほか、クイックスタートガイドでも確認できます。

デバイストークンを受け取るデリゲートメソッドapplication:didRegisterForRemoteNotificationsWithDeviceToken:を次のように実装します。

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    PFInstallation *currentInstallation = [PFInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    [currentInstallation saveInBackground];
}

④証明書を作成

iOS Dev Centerで証明書を作成します。

まず、App ID作成時に、App Servicesの欄で"Push Notifications"にチェックを入れておきます。

画像

AppIDの編集画面からCertificateを作成します(通常のCertificate作成手順と同様なので、ここでは詳細を割愛します⁠⁠。

画像

作成したSSL証明書をダウンロードし、クリックしてキーチェーンにインストールします。

作成したAppIDでProvisioning Profileを作成し、ダウンロード&インストール、Xcodeプロジェクトでの設定(Info.plistのBundle IDと、Build SettingsのCode Signing Identityの設定)もしておきます。

⑤Parseに証明書を登録

キーチェーンから、④で作成した証明書をp12形式で書き出します(パスワード設定不要⁠⁠。

画像

Parseダッシュボードの、[Settings] > [Push notifications] > [Apple Push Certificate] から、書き出したp12を登録します。

まずはここまでで、通知が送れるようになっています。アプリを起動し、プッシュ通知を許可したうえでバックグラウンド状態にし、Parseダッシュボードの、[Push Notifications] にある「+ Send a push」ボタンから通知を送ってみると、iOSデバイス側で通知を受け取れます。

⑥通知を受け取ったらhueを光らせる

通知を受け取ったらアプリを起動しなくてもバックグラウンドで処理できるよう、[Capabilities] > [Backgound Modes]で、"Background fetch"と"Remote notifications"にチェックを入れておきます。

画像

③で実装したapplication:didFinishLaunchingWithOptions:のregisterForRemoteNotificationTypes:まわりの処理を次のように書き換えてください。

[application unregisterForRemoteNotifications];
[application registerForRemoteNotificationTypes:
 UIRemoteNotificationTypeBadge|
 UIRemoteNotificationTypeAlert|
 UIRemoteNotificationTypeSound|
 UIRemoteNotificationTypeNewsstandContentAvailability];

[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

通知を受け取った際に呼ばれるデリゲートメソッド、application:didReceiveRemoteNotification:fetchCompletionHandler: でhueを光らせる処理をおこないます。⁠その1:基礎編」で解説した、アラートモードを使用します。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
{
    NSLog(@"notification received:%@", userInfo);

    // PHLightオブジェクトを取得
    PHBridgeResourcesCache *cache = [PHBridgeResourcesReader readBridgeResourcesCache];
    PHLight *light = [cache.lights.allValues firstObject];
    
    // PHLightStateオブジェクトの設定
    PHLightState *lightState = [[PHLightState alloc] init];
    lightState.alert = ALERT_LSELECT;
    
    // ライト(PHLightオブジェクト)に状態(PHLightStateオブジェクト)を送信
    id bridgeSendAPI = [[[PHOverallFactory alloc] init] bridgeSendAPI];
    [bridgeSendAPI updateLightStateForId:light.identifier
                           withLighState:lightState
                       completionHandler:^(NSArray *errors)
     {
         // 送信完了時の処理
         completionHandler(UIBackgroundFetchResultNoData);
     }];
}

以上で実装は完了です。

試してみる

Parseからバックグラウンド処理のトリガとなる通知を送ります。Parseダッシュボードの[Push Notifications]の「+ Send a Push」ボタンを押して出てくる送信画面の、⁠Compose message」の欄に "{ "aps": { "content-available": 1} }" と入力し、スイッチを動かしてJSON形式を指定してください。

画像

通知を送信すると、アプリがバックグラウンドにある状態でもhueが明滅します。

まとめ

hueと連携するiOSアプリの事例として、⁠プッシュ通知がきたときにhueを光らせる」アプリの実装方法を説明しました。hueは出力側のデバイスなので(※もちろんhueの光を入力とすることも可能ですが)他のiOSの機能やデバイスと連携させやすく、今後も何か別のデバイスを紹介する際に応用事例としてhueを絡めて紹介することも検討しています。国内のアップルストアAmazonで日本仕様正規品が販売されていて手に入れやすく、また普通の照明器具に取り付けられて非常に使いまわしやすいデバイスなので、ぜひお試しください。

おすすめ記事

記事・ニュース一覧