LionHeart SD BLOG

株式会社ライオンハート システムデザインの技術ブログ

Watch Connectivityを使ってiOSからWatchOSに画像データを送信してみる

こんにちは、株式会社ライオンハートの鵜飼です。

前回に引き続き、WatchOSについてもう少し試してみたので、調べた内容についてのメモです。

試してみたもの

AppleWatchにQRコードを表示して名刺代わりに、という使い方をしていらっしゃる方が居るそうで、その使い方面白そうだなぁと思って勉強がてらに簡単なモノを作ってみました。

参考

QRコードを作成する

iOS上でQRコードを作成する際には、Core Imageという純正のフレームワークを使うことで簡単に作成することが出来ます。

let qrText: String = "QRコードに含める文字列"
let qrFilter: CIFilter = CIFilter( name: "CIQRCodeGenerator" )!
qrFilter.setValue( qrText.dataUsingEncoding( NSISOLatin1StringEncoding, allowLossyConversion: false ), forKey: "inputMessage" )
qrFilter.setValue( "Q", forKey: "inputCorrectionLevel" )
let qrcodeImage: CIImage = qrFilter.outputImage!

この時点でQRコードの生成は完了しています。シンプル、簡単。
しかし、Core Imageで生成されたQRコードはかなり小さいので拡大します。

let sizeTransform = CGAffineTransformMakeScale(4, 4)
let qrcodeImage: CIImage = qrFilter.outputImage!.imageByApplyingTransform(sizeTransform)

最後に、WatchOSにデータを送る際にはファイルとして保存しておく必要があるっぽいので、アプリのドキュメント内に保存しておきます。
ただ、その時の直接CIImageからUIImageに変換すると何故かUIImageJPEGRepresentationからnilが返ってきてしまいますので、ちょっと遠回りします。

// CIImageからUIImageに変換する
let imageContext = CIContext(options:nil)
let temp:CGImageRef = imageContext.createCGImage(qrcodeImage, fromRect: qrcodeImage.extent)
let ret = UIImage(CGImage: temp)

// ファイルパスを指定する
var imagePath: String {
    let doc = NSSearchPathForDirectoriesInDomains( .DocumentDirectory, .UserDomainMask, true )[0] as String
    return ( doc as NSString ).stringByAppendingPathComponent( "send.jpg" )
}

// 指定したファイルパスに保存する
let data: NSData = UIImageJPEGRepresentation( resizeImage, 0.9 )!
data.writeToFile( imagePath, atomically: true )

これでWatchOSにデータを送信する準備ができました。

WatchOSにデータを送信する

前回の方法はテキストを送信するだけでしたので、データを送信する方法を別に記述します。

WCSession等の有効化の方法については、前回の記事を参照して下さい。

let transferFile: NSURL = NSURL( fileURLWithPath: imagePath )
WCSession.defaultSession().transferFile( transferFile, metadata: qrcodeImage.properties )

metadataに指定してるのは、最初に作成したCIImagepropertiesを指定してるんですが、あってるんですかね…一応送れてるのでデータ型はきっと合ってるんだと思います…。

受信側は下記のようになります。

@IBOutlet var qrImage: WKInterfaceImage!

func session( session: WCSession, didReceiveFile file: WCSessionFile ) {
    let data: NSData = NSData( contentsOfURL: file.fileURL )!
    let image: UIImage = UIImage( data: data )!
    self.qrImage.setImage( image )
}

これでWatchOSにQRコードが表示されているはずです。

雑感

iOS -> WatchOSのデータ送信はこのようなサンプルのように色々使いみちがありそうですが、WatchOS -> iOSにデータを送信するコトもできますので、そちらの方向性も何か考えていきたいですね。

参考