UIPasteboardといえばstring
プロパティやimage
プロパティでコピーペーストできるやつ、ぐらいに思ってませんか。この記事ではその概念と注意点をしっかり押さえつつ、具体的な動作例を見ていくことでUIPasteboardの理解を深めていきます。
(ちょっと長すぎたので概念と具体例で前後編に分けます。今回は前編になります。)
UIPasteboardとは
公式docの冒頭を要約すると、UIPasteboardは「データを自分のアプリ内のある場所から他のあらゆるアプリに共有するもの」のようです。典型的な使い方はデータコピーなどの際にUIPasteboardを通してデータを保存しておいて、アプリ内や別なアプリから再びUIPasteboardを通してデータを読み出して使う、といった感じです。単純なテキストや画像のコピーだけではなく、バイナリや独自データを他のアプリに転送するような用途でも使用できます。
UIPasteboardの種類
大きく分けて2種類のペーストボードがあります。
The General Pasteboard
どのアプリからも自由にアクセスできる、システムワイドなペーストボードです。UIPasteboard.general
でシングルトンとしてアクセスできます。メモ帳アプリなどで普通にコピーするとこのペーストボードに保存されます。逆に言うと、General Pasteboard
をプログラムから操作することによって現在コピーしているものが書き換わってしまい、ユーザーの混乱を招く恐れもあるので注意が必要です。
iOS10からはHandoffの新機能として、複数端末間でGeneral Pasteboard
に保存したデータを共有できるようになりました。こちらは共有不可にする設定も可能です。
Named Pasteboard
アプリ内で完結するようなものや、Team ID が共通なアプリ間でのデータの受け渡しにはNamed Pasteboard
が利用できます。これは、一意な名前をつけて生成され、システムを汚さず独占的に使用できるペーストボードです。
何を保存するのか
UIPasteboardは何を保存するのでしょうか。UIPasteboardのヘッダを見るとこういう部分があります。
// Direct access open var items: [[String : Any]]
Direct access
という言葉が示すように、このitems
プロパティでアクセスできるitem
が、ひとつのペーストボードに保存されるデータそのものです。これはPasteboard Item
と呼ばれるもので、ひとつのPasteboard Item
は[String : Any]
というDictionaryとなっています。var宣言されているため追加、削除、挿入など何でもできます。そして、これ以外のメソッドやプロパティのほとんどはこのデータに便利にアクセスするものです。
つまり、ひとつのペーストボードが保存しているのは「何でも保存できる辞書」の配列ということです。これが意味するのは、ペーストボードが保持する値は1つではないということです。普段単純にコピーペーストなどしていると新しいものをコピーすると古いものは消えるのが当然のような感じがしますが、ペーストボード自体はプログラム的には(リソースが許す限り)いくつでも値を保持できます。
Pasteboard Type
Pasteboard Item
のDictionaryにおけるキーとなる値がPasteboard Type
です。この実体は単なるStringであり、意図せず重複してしまうことがなければどんな文字列でも指定することができますが、UTI (Uniform Type Identifier)の使用が推奨されています。
UTI (Uniform Type Identifier)
UTIはAppleが制定しているデータフォーマットを識別する識別子で、reverse-DNSで書きます。UTIについてはこちらのドキュメントが詳しいです。 https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html#//apple_ref/doc/uid/TP40001319
例えば、com.apple.quicktime-movie
やcom.apple.pict
public.jpeg
のように書きます。
また、UTIは継承でき、is-a関係を持ちます。public.data
を継承してpublic.text
やpublic.image
という型が定義され、public.image
を継承してpublic.jpeg
やpublic.png
が定義される、といった具合です。
同じような役割を果たすものとしては、古くはOSTypeという"JPEG"
のように4文字でファイルタイプを識別するものがあったり、他にはファイル拡張子やMIME typeなどもそうですが、UTIはより柔軟で拡張性が高いとのことです。
ちなみに、特定のアプリ内でしか使わないデータフォーマットの場合は<app-bundle-id>.foo.bar
のように命名するようです。
まとめ
- ペーストボードにはGeneralとNamedの2種類ある
- 1つのペーストボードは「何でも保存できる辞書」の配列を持つ
- 1つの辞書をPasteboard Itemという
- itemsプロパティですべてのデータにアクセスできる
- stringプロパティやimageプロパティなどは単にitemsの中のデータに便利にアクセスするためのもの
- 辞書のキーはPasteboard Type
- 標準化されたデータフォーマット識別子であるUTI形式で指定する
いかがでしたでしょうか。前編はここまでです。後編では具体的な動作例や注意点について見ていきます。