December 2009 Archives

iPhone OSにおいて、アプリケーション間でデータを共有する、最も簡単な方法は、ペーストボードを使用することです。

典型的なパターンをあげてみましょう。
ユーザがメモアプリケーションで文字列を選んで「コピー」の操作をし、メール送信画面で「ペースト」操作を行うと、その文字列がメールに貼り付けられます。これは、コピー操作で、メモアプリケーションが文字列をペーストボードに格納し、メールアプリケーションが、ペースト操作の時にそこから文字列を取り出すことで実現されています。それと同じ方法で、どんなアプリケーションでも、ペーストボードを介してデータを受け渡すことが可能です。

ペーストボードには、文字列だけでなく、さまざまな種類のデータを格納することができます。例えば、弊社のExport for Google Documentsというアプリケーションでは、Googleドキュメントからエクスポートしたドキュメントデータを、ペーストボードに格納する機能を持っています。

ここでは、どのような形でペーストボードにデータを格納すればいいのか及び、弊社製Copy & Sendアプリでそのデータを活用する例について簡単に説明したいと思います。

UIPasteboardクラス

iPhone SDKの中では、UIPasteboardクラスがペーストボードを表現するオブジェクトになります。システム内には、複数のペーストボードが存在していますが、それぞれが、UIPasteboardのインスタンスに対応します。

システム標準で用意されているものには、以下の2種類があります。
  • General pasteboard
    • システム標準のペーストボードであり、通常のコピー/ペースト操作で使用されます。
  • Find pasteboard
    • 検索バーに入力されたテキストが保存されるペーストボード

上記以外に、各アプリケーションで固有なものを、自由に作成することができます。標準のペーストボードは、予期しない場面で勝手に上書きされてしまうことがあるので、アプリケーション固有のデータは、固有のペーストボードを使用することをお奨めします。

また、各ペーストボードには、一意に識別するための名称が付与されており、名称が不明なペーストボードにはアクセスできないようになっています。

ペーストボード内のデータ構造

ペーストボード内のデータは、アイテムと呼ばれるNSDictionryの集合として管理されています。
アイテムのNSDictionryのキーは、データの種類を表すUTI(Uniform Type Identifier)と呼ばれる文字列であり、値としてデータのオブジェクトが格納されています。したがって、アイテムの中には、異なる種類のデータを複数格納することができます。
以下に、データ構造の概念図を示します。

Pasteboard_items.png

これは、少し複雑な組合せの例になっています。
1つ目のアイテムは、URLとテキストのペアで構成されています。例えば、Safariでハイパーリンクを長押ししてコピーした場合は、この形になります。
2つ目のアイテムは、Excelのスプレッドシートを、単独で格納したアイテムの例です。
3つ目のアイテムは、JPEG画像とテキストのペアで構成されています。カメラロールの写真をコピーした場合には、この形になります。

Copy & Send及び、Copy & Send Liteで、ペーストボードの内容をブラウズすると、これらのデータ構造を確認することができます。興味がある方は、お試しください。

UIPasteboardのAPIについて

アイテムを操作するためのAPIは、以下の種類に分かれます。
(詳細は、UIPasteboardのリファレンスを参照してください)

  • 標準的な単一タイプのデータを扱うためのもの
    • データにアクセスするためのプロパティとして定義されています。
      • string/strings
      • image/images
      • URL/URLs
      • color/colors
  • 任意のデータタイプを扱うためのもの
    • 上記以外に、UTIを明示的に指定してデータを操作するメソッドが用意されています。

ペーストボードの活用例

一部、冒頭で述べたことの繰り返しになりますが、弊社製の以下のアプリ間で、ペーストボードを使ったデータ連携を実現しています。
  • Export for Google Documents
    • Googleドキュメントからエクスポートしたドキュメントデータを、ペーストボードに格納する。
  • Copy & Send / Copy & Send Lite
    • ペーストボードに格納されているアイテムを活用する機能を実装している。
  • 他のデバイスへの送信
  • 永続領域への保存
  • 内容のブラウズ
これによって、Export for Google Documentsのドキュメントデータを、他のデバイスに送信するといったことができるようになっています。


みなさんが作成したアプリケーションでも、Copy & Send / Copy & Send Liteを有効に活用していただければ幸いです。

開発者の方のために、具体的な連携機能の実装方法について、アプリの中からアクセスできるヘルプドキュメントにて説明しています。よろしければ、そちらをご参照いただければと思います。

よろしくお願いいたします。



Copy & Sendでは、データの送受信に、iPhone OS 3.0から追加されたGameKitを使用しています。当初はBluetoothのみのサポートだったのですが、iPhone OS 3.1からは、WiFi経由での通信もできるようになっていることは、あまり認知されていないように思います。われわれも、Copy & Sendアプリケーションを開発している過程で、偶然気付いたというのが正直なところです。
便利な機能なのですが、いくつか制約もあるので、そのときの経験を元に、概要をまとめておきたいと思います。

開発者向けのドキュメントには明記されていない

Appleから公開されているGameKitに関するドキュメントは、以下の2つですが、いずれにも、WiFi機能のサポートについては説明されていません。


Developer Forums の発言によると、これらのドキュメントは、いずれも3.0レベルのまま更新されていないので、3.1から追加されたWiFi通信機能のことが記載されていないだけのようです。

GKPeerPickerControllerを使った場合は、Bluetoothのみ使用可能である

なぜか、GKPeerPickerControllerクラスを使って接続を確立する場合は、Bluetooth通信のみが使用可能なようです。
WiFi通信を使うためには、GKSessionを使って、自分で接続相手を探して接続する必要があります。

BluetoothとWiFiのどちらを使用するのかを明示的に選択することはできない

WiFiとBluetoothの両方が有効な状態の場合、どちらを使って通信するのかということを、明示的に選択することはできません。Game Kit Frameworkが、勝手に選んでしまいます。GKPeerPickerControllerを使わないで実装した場合は、暗黙的にWiFiを使ってしまうわけですね。
裏を返せば、ドキュメントに記載されていないこととあわせて考えると、GKPeerPickerControllerを使わないで実装した場合にのみ、偶然この機能に気付くということにもなります。

WiFiとBluetoothの状態を検知できない

GKPeerPickerControllerを使う場合、Bluetoothが無効な場合に、以下のようなalertメッセージが出ます。

Bluetooth_unavail.png

GKPeerPickerControllerを使わない場合は、WiFiとBluetoothの状態を検知することができません。

Bluetoothをサポートしていないデバイスでも通信できる

同一WiFiネットワーク内に限定されますが、iPod touch 1Gでも、通信することができるのは、メリットかなと思います。
あと、iPhone Simulatorとも通信できるで、iPhoneの実機が1台しかなくても、テストが可能になることもうれしいですね。

Copy & Sendアプリケーションへの影響

Copy & Sendでは、GKPeerPickerControllerを使わないで実装しているので、以下のような影響を受けています。

  • そのときの状況により、WiFiとBluetoothのどちらで通信されるのかを予測することはできません。
  • WiFiとBluetoothの両方が無効な状態であっても、そのことをユーザに通知することができません。

このあたりについては、ユーザのみなさんに不便を感じさせてしまうところだと思うので、もう少しきめ細かい制御ができるようになると、ありがたいところです。

Copy & Sendを使用して場合は、お手数ですが、WiFiとBluetoothを予めONにしていただくよう、お願いいたします。






12/18にアップデートを申請していたExport for Google Documentsのアップデートが、Ready for Saleになりました。6日間というのは、これまでで最短記録です。

Export for Google Documents (AppStore)

今回は、主に2つの機能追加が中心となっています。

Copy & Sendアプリケーションとの連携

これまでも、ドキュメントをペーストボードに格納する機能を提供していましたが、そのデータを活用できるアプリケーションが存在していなかったので、中途半端な状態でした。
同じデバイスの中に、Copy & Sendがインストールされていれば、このアプリでペーストボードに格納したドキュメントを利用することができます。

06_PasteBoard.png

ペーストボード状態表示画面で、「Copy & Sendを起動する」ボタンをタップすると、Copy & Sendが起動されます。あとは、Copy & Sendの機能を使って、ドキュメントを別のデバイスに送信したり、永続領域に保存するなどできるようになります。

Copy & Send (有料版) (AppStore)

Copy & Send (無料版) (AppStore)

スプレッドシートからワークシートを選択する

スプレッドシートをPDFとしてエクスポートする場合、ワークシートを選択することができるようになりました。

02_ChooseSheet.png


通常の流れですと、本日中にAppStoreにも出てくるはずですが、米国がクリスマス休暇に入っているため、スムーズに行かない可能性もあります。その場合は、ご了承ください。






iPhone/iPod touchのペーストボードに格納されているデータを活用するための、Copy & Sendというアプリをリリースしました。
今回は、有料版と無料版の2本立てとなっています。

スクリーンショット(2009-12-20 12.32.18).png

Copy & Send (有料版)


主な機能

通常のコピー操作でペーストボードにデータを格納した後、このアプリを起動することで、簡単にデータを活用することができます。

主な機能は、以下の通りです。
  • ペーストボード内のデータをブラウズする。
    • 複数のアイテムがペーストボードに格納されている場合であっても、一覧表示して内容を確認することができます。
    • テキスト、画像、ドキュメントについては、内容確認するための簡易的なビューワ機能もあります。
    • ペーストボードを使ったアプリを開発している方にも役立つ機能だと思います。
  • ペーストボード内のデータを、別のiPhone/iPod touchにBluetooth経由で送信する。
    • Copy & Sendがインストールされている別のiPhone/iPod touchに、データを送信して共有することができます。
    • 例えば、カメラロールにある写真を選択してコピーした後、このアプリを起動して、簡単な操作をすることで、その写真を送ることができます。
  • ペーストボード内にあるデータの中で、長く取っておきたいものを、保存する。

有料版と無料版の違いについて

無料版には、若干の機能制限があります。
  • 画像送信時のサイズ縮小
    • 有料版では、サイズを縮小せずに画像を送信することができますが、無料版は常に縮小されます。
  • データの保存機能
    • 有料版では、ローカルデータベースにデータを保存することができますが、無料版では画像をカメラロールに保存する機能のみ利用可能です。

他のアプリとの連携について

他のアプリから、このアプリを起動するためのURLを公開しています。
使用方法については、アプリ内のヘルプドキュメントにて説明していますので、そちらをご参照ください。


まずは、無料版をお気軽にお試しいただければと思います。
よろしくお願いいたします。


iPhone Applications

Twitter