騒音のない世界 BLOG

コンピュータと、音楽と。

UIPasteboardをもっと理解する (前編)

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-moviecom.apple.pict public.jpegのように書きます。

また、UTIは継承でき、is-a関係を持ちます。public.dataを継承してpublic.textpublic.imageという型が定義され、public.imageを継承してpublic.jpegpublic.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形式で指定する

いかがでしたでしょうか。前編はここまでです。後編では具体的な動作例や注意点について見ていきます。

UIPasteboardをもっと理解する (後編) - 騒音のない世界 BLOG