Glance及び通知

Glance

Glanceの概要

Glanceは重要な情報を表示するための補助的な方法です。全てのアプリがGlanceを必要とするわけではありません。Glanceはタイムリーにすぐに関連する情報を提供します。航空会社のアプリでフライトの搭乗口の情報がGlanceで表示されたり、カレンダーアプリのGlanceは次の会議の情報を表示するかもしれません。次の図はサンンプルアプリ「Lister」のGlanceは、Todoリスト内の完了した項目や残っている項目を表示しています。
サンプルアプリ「Lister」のGlanceインタフェース

glance_lister_2x
出典 https://developer.apple.com/

 
 
GlanceはWatchKitアプリとWatchKit Extensionの一部として提供されます。GlanceのインタフェースはWatchKitアプリのストーリーボードファイル内に存在し、そのインタフェースはカスタムWKInterfaceControllerオブジェクトによって管理されいます。ただし、Glanceのインタフェース・コントローラの唯一の仕事はGlanceのコンテンツをセットすることだけです。Glanceはユーザとの対話インタフェースをサポートせず、Glanceをタップすると自動的にWatcKitアプリを起動するだけです。

Glanceのライフサイクル

Glance インタフェース・コントローラのライフサイクルは、Glanceがすばやく表示されるためにGlance インタフェース・コントローラが早期に初期化されることを除いては、他のインタフェース・コントローラと同じです。初期化からGlanceが表示されるまでの間にどれだけ時間が経過するかは分からないので、表示されている情報が最新であるか確かめるためのチェック処理をwillActivateメソッドに含めることができる。
インタフェース・コントローラ のライフサイクルについては、WatchKit Extension Life Cycleを参照してください。

Glance Interfaceガイドライン

XcodeはGlanceのコンテンツを配置するための固定レイアウトを提供します。コンテンツのためのレイアウトを選択し、次のガイドラインに従いコンテンツを作成してください。

  • すばやく情報を伝えられるようにGlanceを設計する。画面全体にテキストを敷き詰めてはいけません。情報を伝えるために、グラフィック、色、およびアニメーションを適切に使用してください。
  • もっとも重要なデータにフォーカスする。GlanceはWatchKitアプリに変わるものではありません。WatchKitアプリがそれを含むiOSアプリの機能限定版であるのと同様に、GlanceはWatchKtアプリをさらに機能限定版にしたものです。
  • Glanceインタフェースには対話型のコントロールを含めない。対話型のコントロールとしてはボタン、スイッチ、スライダー、メニューを含みます。
  • Glanceインタフェースにはテーブルや地図を避ける。禁止されていないが限られたスペースにはテーブル・地図はあまり有用でない。
  • 表示する情報はタイムリーであるべき。利用者にとって重要な情報を提供するために、時間と場所を含む全ての利用可能なリソースを使用してください。インタフェース・コントローラが初期化されてからユーザーに表示されるまでの間に発生した変更についてGlanceを更新しなければならないことを覚えておいてください。
  • 全てのテキストでシステムフォントを使用すること。Glanceでカスタムフォントを使うためには、画像にテキストを描画してその画像を表示する必要があります。

アプリは1つのGlance インタフェース・コントローラしか持たないので、1つのコントローラーで必要なデータを表示することができなければなりません。

Glanceインタフェースの管理

Xcodeプロジェクトに WatchKitアプリのターゲットを追加する場合、Glanceインタフェースを追加するか選択することができます。最初に追加するのを忘れた場合でも、後からプロジェクトにGlanceを追加することができます。Glanceインタフェースコントローラはアプリケーションのストーリーボードと外観が少し異なります。具体的にはGlanceエントリポイントオブジェクトが接続されており、デフォルトでは次図のように表示されています。

glance_interface_2x
出典 https://developer.apple.com/

 
実行時にGlanceの内容を設定するには、カスタムWKInterfaceControllerサブクラスを使用します。WatchKitアプリで他のインタフェース・コントローラークラスを実装するのと同じ方法でこのサブクラスを実装することができます。

アプリにGlanceインタフェースを追加する

Glanceインタフェースを実装するために必要な関連ファイルを作成するためには、WatchKitアプリのターゲットを作成するときにGlanceシーンオプションを含める必要があります。XcodeはGlanceストーリーボードシーンやカスタムGlanceインタフェース・コントローラークラスを提供します。ターゲットを作成しなかった場合は、手動でプロジェクトを設定してください。
手動でGlanceインタフェースを追加するには

  1. WKInterfaceControllerのサブクラスを作成します。
    新しいソースファイルを作成し、WatchKit エクステンションのターゲットに追加します。サブクラスには「GlanceInterfaceController」のような適切な名前をつけます。
  2. ストーリーボードで、Glanceインタフェース・コントローラーをストーリーボードにドラッグします。
    新しい Glanceインタフェース・コントローラーのシーンは、前の図で示したようなGlanceエントリポイントオブジェクトを持ちます。
  3. Identity Inspectorを開きGlanceインタフェース・コントローラーを選択します。
  4. 手順1で作成したクラスをGlanceインタフェース・コントローラーに設定します。

WatchKitアプリは1つのGlanceインタフェースを持ちます。アプリのストーリーボードに複数のGlanceインタフェース・コントローラーを追加してはいけません。

Glanceインタフェース・コントローラーの実装および更新

Glanceの唯一の仕事はラベルや画像の内容を設定することであるため、Glanceインタフェース・コントローラーの実装は比較的簡単です。

  • ラベルや画像の初期値を設定してGlanceインタフェースを初期化するためにinitとawakeWithContext:を使用します。
  • 画面上に表示される前に必要であればGlanceインタフェースを更新するには、willActivateを使用します。

画面上に表示された後でGlanceのコンテンツを更新するには、NSTimerオブジェクトで定期的な更新の実行を行います。 自動的に更新されるのでWKInterfaceDateとWKInterfaceTimerを更新する必要なありません。

Glanceからのアプリ起動をカスタマイズする

ユーザがGlanceをタップすると対応するWatchKitアプリを起動します。通常はアプリを起動するとメイン・インタフェース・コントローラーを表示します。Glanceからアプリの起動をカスタマイズするには以下の操作を行います。

  • Glanceインタフェース・コントローラー内で
    • initとawakeWithContext:メソッドで普通にGlanceを設定します。
    • ある時点でupdateUserActivity:userInfo:webpageURL:メソッドを呼び出し、アプリにGlanceの状態についての情報を伝えるためにuserInfパラメータを使います。起動時には、アプリは、違ったインタフェース・コントローラを表示するためにそのコンテキストデータを使用することができます。
  • アプリのメイン・インタフェース・コントローラでは
    • handleUserActivity:メソッドを実装します。提供されたuserInfoディクショナリを使用してUIを適切に設定します。

updateUserActivity:userInfo:webpageURL:メソッドの呼び出しはWatchKitアプリに起動時に、メイン・インタフェース・コントローラーの handleUserActivity:メソッドを呼び出すよう指示します。handleUserActivity:の実装では、UIを適切に構成するために提供されたコンテキストデータを使用してください。例えば、ページベースのインタフェースを備えたアプリでは、最初に表示するページを選択するために提供されたデータを使用します。

通知

通知の概要

Apple WatchはiOS上の既存のインタラクティブ・ノーティフィケーション・サポートを最大限に活用します。あなたのiOSアプリが通知をサポートしている場合は、Apple  Wathcは適切なタイミングでこれらの通知を表示します。アプリのローカルまたはリモート通知がユーザーのiPhoneに到着すると、iOSはiPhoneまたはApple Watchにその通知を表示するかどうか決定します。Apple Watchに送られた通知の場合、システムはノーティフィケーションが利用可能であることをさりげなくユーザーに知らせます。ユーザが通知を表示することを選択した場合、システムはまず省略バージョンのノーティフィケーションを表示し、続いてより詳細ばバージョンを表示します。ユーザーは詳細ノーティフィケーションを非表示にするかWatchKitアプリを起動するか、ノーティフィケーションの提供されたアクションボタンをタップして操作することができます。
アプリは、通知をサポートするために何かをする必要はありません。システムはノーティフィケーションのアラート・メッセージを表示するデフォルトのノーティフィケーション・インタフェースを提供します。しかしアプリはノーティフィケーション・インタフェースをカスタマイズして、カスタムグラフィック、コンテンツ、ブランディングを含めることができます。

注意
Apple WatchはiOSがそれらをサポートする場合にのみローカル及びリモートのノーティフィケーションを表示します。iOSアプリでローカル及びリモートのノーティフィケーションをサポートする方法についてはLocal および Push Notificationプログラミングガイドを参照してください。

ショートルック・インタフェース

ユーザーが最初にノーティフィケーションを見るとき、次の図のようなシステムはショートルック・インタフェースを表示します。ショートルック・インターフェースはカスタマイズできない非スクロール画面です。システムはテンプレートを使用し、アプリ名とアイコンを表示すると共に、ローカル通知またはリモート通知のペイロードに格納されているタイトル文字列を表示します。ユーザーが継続して通知を見たい場合、システムはショートルック・インタフェースからロングルック・インタフェースに素早く移行します。
 

shortlook_calendar_2x
出典 https://developer.apple.com/

ショートルックで使われるタイトルは、通知の趣旨の短い内容を提供します。ローカル通知の場合、UILocalNotificationオブジェクトのalertTitleプロパティを使ってこの文字列を設定します。リモート通知の場合、ペイロード内のalertディクショナリのtitleキーを追加します。通知のタイトル文字列を追加する方法についてはLocal および Push Notification プログラミングガイドを参照してください。
 

ロングルック・インタフェース

ロングルック・インタフェースは通知の内容及び関連するアクションボタンを表示するスクロール可能な画面です。カスタム通知インタフェースを提供しな場合は、Apple Watchはアプリのアイコン、通知のタイトル文字列及びアラートメッセージが含まれたデフォルトのインターフェースで表示します。カスタム通知インターフェースを提供した場合、Apple Watchは代わりにカスタマイズインターフェースを使用して表示します。
ロングルック・インタフェースは3つの領域に分かれています。

  • 帯の部分はアプリのアイコンとアプリ名をオーバーレイ表示します。帯の色は変更可能です。
  • コンテンツ領域には、到着した通知についての詳細な情報が含まれます。コンテンツ領域のカスタマイズ方法については、カスタム通知インターフェースを参照してください。

次にいくつかのアクションボタンを含むロングルック通知の例を示します。

longlook_calendar_2x
出典 https://developer.apple.com/

アプリのアイコンをタップするとWatchKitアプリを起動します。アプリで定義したボタンをタップすると選択したアクションをiOSアプリや WatchKitアプリに送信します。フォアグラウンドアクションはWatchKitアプリとWatchKit エクステンションに送信し、バックグラウンドアクションはiOSアプリに送信します。Dismissボタンをタップスするとどのような機能のアクションも行わずにノーティフィケーション・インタフェースを閉じます。それ以外の場所をタップしても何も起きません。

通知にアクションボタンを追加する

アクションボタンは通知のための幾つかの標準的な応答を提供することで、ユーザーの時間を節約します。Apple Watchはアクションボタンを表示する際にiOSアプリが登録したインタラクティブ通知を利用します。iOS8以降では、UIUserNotificationSettingsオブジェクトを使い生成された通知の表示時のタイプを登録することが必要です。その情報を登録する際に、アプリはそのカテゴリのために実行できるアクションを含むカスタム通知カテゴリのセットを登録することができます。Apple Watchはロングルック・インタフェースに対応するアクションボタンを追加する際に、このカテゴリ情報を使用しています。
次のリストはサンプルiOSアプリの設定とカテゴリを登録するメソッドです。このメソッドは、WatchKitエクステンションではなく、iOSアプリの方に実装され、起動時にiOSのApp Delegateによって呼ばれます。実装はSwiftで書かれており会議参加への了承もしくは辞退のアクションを含んだ「招待」カテゴリの生成と登録を示しています。

func registerSettingsAndCategories() {
    var categories = NSMutableSet()
    var acceptAction = UIMutableUserNotificationAction()
    acceptAction.title = NSLocalizedString("Accept", comment: "Accept invitation")
    acceptAction.identifier = "accept"
    acceptAction.activationMode = UIUserNotificationActivationMode.Background
    acceptAction.authenticationRequired = false
    var declineAction = UIMutableUserNotificationAction()
    declineAction.title = NSLocalizedString("Decline", comment: "Decline invitation")
    declineAction.identifier = "decline"
    declineAction.activationMode = UIUserNotificationActivationMode.Background
    declineAction.authenticationRequired = false
    var inviteCategory = UIMutableUserNotificationCategory()
    inviteCategory.setActions([acceptAction, declineAction],
                  forContext: UIUserNotificationActionContext.Default)
    inviteCategory.identifier = "invitation"
    categories.addObject(inviteCategory)
    // Configure other actions and categories and add them to the set...
    var settings = UIUserNotificationSettings(forTypes: (.Alert | .Badge | .Sound),
                          categories: categories)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)
}

iOSアプリのカテゴリとアクションを設定する方法の詳細についてはLocal および Push Notification プログラミングガイドを参照してください。

アクションボタンのタップに反応する

ユーザーが通知のアクションボタンをタップすると、システムはUIUserNotificationActionオブジェクトに登録された情報をどのようにアクションを処理するか決定するために使用します。アクションはユーザーの認証とともにまたは認証なしで、フォアグラウンドまたはバックグラウンドで処理されます。フォアグラウンドとバックグラウンドのアクションの処理は異なります。

  • フォアグラウンド・アクションはWatchKitアプリを起動し、メイン・インタフェース・コントローラーのhandleActionWithIdentifier:forRemoteNotification:メソッドまたはhandleActionWithIdentifier:forLocalNotification:メソッドにタップしたボタンのIDを提供します。
  • アクションを処理するため、バックグラウンドアクションはiOSアプリをバックグラウンドで起動します。選択したアクションの情報はApp Delegateのapplication:handleActionWithIdentifier:forRemoteNotification:completionHandler:メソッドまたはapplication:handleActionWithIdentifier:forLocalNotification:completionHandler: メソッドに提供されます。

フォアグラウンドアクションでは、 WKUserNotificationInterfaceControllerサブクラスがアクションを処理しない事に注意することが重要です。フォアグラウンドアクションを選択するとアプリを起動しアプリのメイン・エントリ・ポイントのインタフェース・コントローラーをロードします。このイニシャル・インタフェース・コントローラは任意のアクションを処理する責務を負っています。インタフェース・コントローラはアクションを処理するためhandleActionWithIdentifier:forRemoteNotification:メソッドとhandleActionWithIdentifier:forLocalNotification: メソッド(必要に応じて)を実装する必要があります。

カスタム・ロングルック・インタフェースの管理

アプリにカスタム通知インタフェースを追加する

カスタム・インタフェースのカテゴリーを設定する

静的通知インタフェースを設定する

動的通知インタフェースを設定する

動的インタフェースを設計する

実行時に動的インタフェースを設定する

カスタムインタフェースのテスト

SwitfyJSON を iOS 8.3 & Xcode 6.3 で使う手順

Xcode6.3がリリースされたので早速アップデートしたらSwiftyJSONとAlamofireがエラーになってしまった。Xcode6.3でのSwiftyJSONとAlamofireのセットアップ方法をメモしておく。
Alamofireは1.2でXcode6.3対応が完了していますので、バージョンを指定してあげます。
pod ‘Alamofire’, ‘~> 1.2.0’
SwiftyJSONはブランチ「xcode6.3」にて対応されていますのでこちらを取得するように変更します。
pod ‘SwiftyJSON’, :git => ‘https://github.com/SwiftyJSON/SwiftyJSON.git’, :branch => ‘xcode6.3’
 

# sudo gem install cocoapods -v '>=0.36'
# pod --version
0.36.4
# pod init
# vi Podfile
# cat Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.2'
use_frameworks!
# for Xcode6.3
pod 'Alamofire', '~> 1.2.0'
# for Xcode6.2
#pod 'Alamofire', :git => "https://github.com/mrackwitz/Alamofire.git", :branch => "podspec"
# for Xcode6.2
#pod ‘SwiftyJSON’, ‘>= 2.1.3’
#pod 'SwiftyJSON', :git => "https://github.com/orta/SwiftyJSON", :branch => "podspec"
# for Xcode6.3
pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git', :branch => 'xcode6.3'
#pod 'Spring', '~> 1.0.3'
target 'ProjectName' do
end
target 'ProjectNameTests' do
end
# pod install
# open ProjectName.xcworkspace

raspberry pi 2 model bにいろいろ繋いでみる

raspberry pi 2 model b が到着!
早速いろんなセンサー類を繋いでみました。
まずはLチカから。トランジスタをスイッチとして使用します。ベースへ電圧をかけるとLEDが光り、Lowにすると消えます。
IMG_0652
 
単純にLチカじゃなくてLピカするなら1番ピン(3.3V)と6番ピン(GND)をつなぐだけです。
IMG_0643
 
次は、温度センサーADT7410の値を読み取ります。シリアルインタフェースのI2Cを使ってデータを読み取ります。
最近のraspberry piではI2Cを有効にする方法が変わっていてraspi-configから有効にできます。
IMG_0650
 
次に、モータードライーバーを使ってDCモーターを駆動します。モーターの正転と逆転を試します。
IMG_0656
 
電圧スピーカーでビープ音を鳴らします。昔、学研の科学の付録で聞いた、懐かしい音がなります。
IMG_0655
 
7セグLEDです。要はLEDがたくさんあるってだけです。
IMG_0653
最後にカメラの動作テスト。画質はまずまず。
IMG_0658
一通り動かして、以外と簡単にセンサー類を繋げられるのにびっくり!
あとはアイディア次第ですね。