1. koogawa
Changes in body
Source | HTML | Preview
@@ -1,167 +1,168 @@
※本記事は、 [一般に公開されている情報](https://developer.apple.com/videos/wwdc/2015/?id=713)を元に作成しています。
watchOS 2から <b>Watch Connectivity</b> が使えるようになりましたね。
# Watch Connectivityとは
![image](https://qiita-image-store.s3.amazonaws.com/0/8292/2d784780-be5f-19c5-8ea2-b2c2565a97b4.png)
([Watch Connectivity Framework Reference](https://developer.apple.com/library/prerelease/ios/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html)より引用)
> The Watch Connectivity framework (WatchConnectivity.framework) provides a two-way communications conduit between an iOS app and a WatchKit app on a paired Apple Watch. Apps use this framework to pass files and data back and forth. Live communication is possible when both apps are active; otherwise, you send data in the background so that it is available when the other app launches.
つまり、iPhone ↔ Apple Watch 間で、双方向にデータを送受信することが可能になります。
Watch Connectivityには、大きく分けて <b>Background transfers</b> と <b>Interactive messaging</b> の二種類が存在します。
## Background transfersの特徴
* すぐにデータが転送されるわけではない
* 転送のタイミングはOSがよしなに決めてくれる
* データは転送する前にキューイングされる
## Interactive messagingの特徴
* データは即座に転送される
* 双方向のデータ送受信が可能
* Watch App、iOS Appが通信可能状態(reachable)である必要がある
# Session
データを受け取る側は準備が必要です。
-```objc
-if ([WCSession isSupported]) {
- WCSession *session = [WCSession defaultSession];
- session.delegate = self;
- [session activateSession];
+```swift
+if (WCSession.isSupported()) {
+ let session = WCSession.defaultSession()
+ session.delegate = self
+ session.activateSession()

}
```
最初に `isSupported ` メソッドで、デバイスがWatch Connectivityに対応してるかを確認します。その後、`WCSession` オブジェクトを作ってデリゲートをセットし、セッションを開始します。
# Background transfers
Background transfersには次の3つの転送方法が存在します。
## 1. Application Context
* 転送するデータはキューイングされ、待ち状態になる
* 新しいデータがキューに追加されると古いデータは上書きされる
* 結果的に最新のデータのみが転送されることになる
* 全てのデータを完全に送る必要がないときに便利
-```objc
+```swift
// 送信側
-NSDictionary *applicationDict = @{@"hoge" : @"huga"};
-[[WCSession defaultSession] updateApplicationContext:applicationDict error:nil];
+do {
+ let applicationDict = ["hoge" : "huga"]
+ try WCSession.defaultSession().updateApplicationContext(applicationDict)
+} catch {
+ // エラー処理
+}
```
-```objc
+```swift
// 受信側
-- (void)session:(nonnull WCSession *)session
- didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext
-{
+func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
// 処理
}
```
## 2. User Info Transfer
* Application Contextとは違い、データは上書きされない
* すべてのデータを転送する必要がある時に便利
-```objc
+```swift
// 送信側
-[[WCSession defaultSession] transferUserInfo:applicationDict];
+let transfer = WCSession.defaultSession().transferUserInfo(applicationDict)
```
-```objc
+```swift
// 受信側
-- (void)session:(nonnull WCSession *)session
- didReceiveUserInfo:(nonnull NSDictionary<NSString *,id> *)userInfo
+func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])
{
// 処理
}
```
## 3. File Transfer
* ファイルの転送が可能
-```objc
+```swift
// 送信側
-NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"marimo" ofType:@"png"]];
-WCSessionFileTransfer *fileTransfer = [[WCSession defaultSession] transferFile:url
- metadata:self.applicationDict];
+let url = // ファイルのURL
+let data = // ファイル情報
+let fileTransfer = WCSession.defaultSession().transferFile(url,
+metadata:data)
```
送信待ちのファイルは `outstandingFileTransfers` プロパティで確認できる。
-```objc
+```swift
// 受信側
-- (void)session:(nonnull WCSession *)session
- didReceiveFile:(nonnull WCSessionFile *)file
+func session(session: WCSession, didReceiveFile file: WCSessionFile)
{
// 処理
}
```
# Interactive messaging
* リアルタイムのデータ送受信が可能
* iPhoneとApple Watchがペアリングされている必要がある
* iOS App/Watch Appがフォアグラウンドである必要がある
最初に、相手側のデバイスと通信可能であることを確認します。
-```objc
-if ([[WCSession defaultSession] isReachable]) {
+```swift
+if (WCSession.defaultSession().reachable) {
```
reachableであれば、通信を開始します。
-```objc
+```swift
// 送信側
-[[WCSession defaultSession] sendMessage:self.applicationDict
- replyHandler:^(NSDictionary *replyHandler) {
- // do something
- }
- errorHandler:^(NSError *error) {
- // do something
- }
- ];
+WCSession.defaultSession().sendMessage(applicationDict,
+ replyHandler: { ([String : AnyObject]) -> Void in
+ // リプライ受け取り後の処理
+ })
+ errorHandler: { (NSError) -> Void in
+ // エラー処理
+});
```
-```objc
+```swift
// 受信側
-- (void)session:(nonnull WCSession *)session
- didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message
- replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * __nonnull))replyHandler
+func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)
{
// 処理
}
```
# サンプルコード
Objective-Cですが、簡単なサンプルコードを書きました。
https://github.com/koogawa/WatchConnectivitySample
どなたかSwift版を作ってくださいm(_ _)m
+<b>2015.7.6追記:</b>InteractiveMessagingだけですが、サンプル作りました
+https://github.com/koogawa/InteractiveMessagingSample
+
# リンク
* [Introducing Watch Connectivity](https://developer.apple.com/videos/wwdc/2015/?id=713) - WWDC15 VIDEO
* [Watch Connectivity Framework Reference](https://developer.apple.com/library/prerelease/ios/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html)
* [watchOS-2-Sampler](https://github.com/shu223/watchOS-2-Sampler) - shu223さんによるwatchOS 2の新機能サンプルコード集
* [watchOS 2 新機能の細かい話](http://www.slideshare.net/t26v0748/watchos-2) - shu223さんによるスライド
--
本記事は http://blog.koogawa.com/entry/2015/07/05/023459 でも公開しております。