2016年02月16日

WWDC15 - 713 Introducing Watch Connectivity

Introducing Watch Connectivity
WWDC 2015 | System Framework | Session 713
57:23
https://developer.apple.com/videos/play/wwdc2015-713/


※WWDCセッション関係の記事は、セッション内容を要約して内容を伝えるのが目的ではない。各セッションビデオで何が話されているかの項目をテキスト化することで後で何かを調べたいときにどのビデオを見れば良いか判断する材料にするために書いている。

Apple Watchアプリケーションの通信機能全般

watchOS 2で新規に追加されたWatchConnectivityフレームワークの使い方。NSURLSessionを使う方法。そしてComplication。

WatchConnectivityフレームワークは、バックグラウンド通信の方法を「アプリケーションコンテキスト(iPhone->Watch)」「ユーザー情報(Watch->iPhone)」「ファイル転送」に別けて仕組み、コードを説明。ユーザー対話についても同様に説明。

iPhoneなしでの通信にNSURLSessionが仕えるようになったのでこの方法についても同様に説明。

最後にComplicationというWeb、Watch、iPhoneの三者連携での通信を説明。動作原理などをアニメーション付きスライドで説明している。時計のフェース上に様々な情報を組み合わせる仕組みなのだがが、Apple Watchを持っていないので具体的にどういうものなのかよく理解できなかった。

Videoに15秒バックとか30秒バック欲しい。

[watchOS 1]
iPhone = iOS App + WatchKit Extension+Data Sotre
Apple Watch = Watch App

iPhone = iOS App + Data Sotre
Apple Watch = Watch App+WatchKit Extension+Data Sotre

[WatchConnectivity]
watchOS 2 and iOS 9
WatchConnectivity <--> iPhone
NSURLSession <--> インターネット

[Example Apps with watchOS 2 Support]
Social Networking
Image Editing
Weather
Sports
iOS Game
Run Tracker
Surfing
News

[Setup]
iOS 9/watchOS 2に共通のAPIとiOSのみのAPIがある。
iOS/watchOS両側ともできるだけ早い段階でセットアップする。
常に受信可能状態にすること。
viewDidLoadなどでやるのは不適当。バックグラウンド起動時に通信できないため。
iPadではサポートされない。

if (WCSession.isSupported()) {
let session = WCSession.defaultSession()
session.delegate = self // conforms to WCSessionDelegate
session.activateSession()
}

[Session State]
iPhone側のみ

asession.paired == false →
ペアリングが実行されると
func sessionWatchStateDidChange(_)が呼ばれる。
asession.paired == true →

session.watchAppInstalled == false
インストールする
session.watchAppInstalled == true

session.watchDirectoryURL != nil
インストールされるとこのディレクトリーが設定される。
Watch directory
Watch Appに直接関係するデータだけに使う
・'Last queued item' marker
・Preferences
・Files queued for transfer

session.complicationEnabled == false
→通信開始
session.complicationEnabled == false

[Communication] 9:00〜
Background transfers
- Content not needed immediately
- OS intelligently transfer content
Interactive messaging
- Live communication

[Background Transfers]
Newsアプリなどで蓄積された新着ニュースなど
Queue up content
OS transfer content
- Sending side can exit
- Piuck opportune time
- Delivers on receiver next launch
Recommended
- Morst information not needed immidiately

Types
- Application Context
user locationに応じた情報。
- User info transfer
- File transfer

SNS app
iPhone: applicationContext
Watch: receivedApplicationContext

iPhone: updateApplicationContext(_: )
最新の情報でApplication Contextは置き換えられる
システムが適当なタイミングで送る
Watch:
WatchKit Extentionが起動したときに読み込む。

送信側
do {
let context = // Create context dictionary with latest state
try WCSession.defaultSession().updateApplicationContext(context)
} catch {
}

受信側
func session(session: WCSession,
didReceiveApplicationContext: applicationContext: [String : AnyObject] ) {
}
delegateメソッドはメインキュー以外で呼ばれる。

Application Contextは…
Most interesting/relevant content
Overriding behavior
Dictionary
- Property list types
Recomended use cases
- Many Apple Watch apps
- Glances

[User info transfer]
Watch: Outstanding User Info Transfer
transferUserInfo(_: ) データがキューイングされる
システムが適当な時に
iPhone: iOS appが起動したらデータが

送信側
let userInfo = // Create dictionary of userInfo
let userInfTransfer = WCSession.defaultSession().transferUserInfo(userInfo)

let transfers = WCSession.defaultSession().outstandingUserInfoTransfers()
配列、キャンセル可能

受信側
func session(session: WCSession,
didReceiveUserInfo userInfo: [String : AnyObject]) {
}
non-main serial queueで呼ばれる

Queue user infos(dictionaries)
- Property list types
In memeory content
Access outstanding transfer

[File transfer]
iPhone: Outstanading File Transfers
transferFile(_: metadata: )
システムが適当なタイミングで送信
Watch: ~/Documents/Inbox/

送信側コード
let url =
let metadata =
let fileTransfer = WCSession.defaultSession().transferFile( url, metadata: metadata)

let transfers = WCSession.defaultSession().outstandingFileTransfers()
配列:キャンセル可能

受信側コード
func session(session: WCSession, didReceiveFile file: WCSessionFile) {
}

WCSessionFile
- File URL (in Inbox)
- Metadata
Move file to take control
- File deleted from inbox

Very similar to user info transfer
QUeue files
Access to outstanding content in queue
Additional metadata
- Small
- Property list types

[Intaractive Messaging] 28:30〜
Reachability
- Other app available
- Required for messaging
- Property on WCSession
WCSession.defaultSession().reachable

iPhone:
- Devices conected
- Watch app foreground

Watch:
- Devices conected
- WatchKit extension foreground
iPhoneアプリは起動していなくてもよい。iPhoneアプリをバックグラウンド起動できるから。

[[Types]]
Dictionary
- Property list types
func sendMessage(message:, replyHandler:, errorHandler: )

Data
- Custome data
- Own serialization
func sendMessageData(data:, replyHandler:, errorHandler: )

Optional handler
Recommended
- Confimation by receiver
Separate delegate callbacks

func session(session: WCSession,
didReceiveMessage message: [String : AnyObject],
replayHandler: ([String : AnyObject]) -> Void) {

}

func session(session: WCSession,
didReceiveMessage message: [String : AnyObject]) {

}


if (WCSession.defaultSession().reachable) {
let message = // Create dictionary of content
WCSession.defaultSession().sendMessage(message,
replyHandler: { [String : AnyObject] ) -> Void in
})
errorHandler: { (NSErro) -> Void in
});
}

[NSURLSession] 38:00〜
Existing foundation class
HPPT request
Available in watchOS 2
Tetherless Wi-Fi

[[When to use]
Server has new content
Similar to iOS apps
- Content tailored ..

[NSURLSession and WatchConnectivity]
バックグラウンドでiPhoneからApplication Contextを送る。
Watch Appが起動中はサーバーと直接対話してデータを取り込む。

[Complications] 41:00〜
時計とその他の情報を1画面で表示する形態

Updating clock face
Get content to Apple Watch

ClockKitを使って
CLKComplicationServer.sharedInstance()
getCurrentTimelineTntryForComplication(
getTimelineEntriesForComplication
...

ClockKit
- Content for past, present, and futur
- Background launched for updating
- Specify whern content provided will be stale budgeted

WatchKit extension wil get launched in the background
NSURLSession
Special complication update where iOS app is reachable
Populate as much as posssibel of the ClockKit timeline

[[Stay Current]]

[[Requested intarval fetch]
Use a NSURLSession background session if possible
NSURLSession requests might not complete until next time the extension runs
Requested update time is suggestion
Keep runtime as short as possible
use ClockKit

[Push Kit]
Updated PushKit framework

pushRegistry = PKPushRegistry(queue: dipatch_get_main_queue())
pushRegistry.delegate = self // confirms to PKPushRegistryDelegate
pushRegistry.desiredPushTypes = [PKPushTypeComplication]

func pushRegistry(registry: PKPushRegistry!,
didUpdatePushCreadentials credentials: PKPushCredentials!,
forType type: String!) {

}

[WatchConnectivity]

posted by 永遠製作所 at 21:48| 東京 ☀| Comment(0) | TrackBack(0) | WWDC | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/433897581
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック