[iOS 10] UIPasteboardに新しく追加されたメソッドについて

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

macOS Sierraの新機能であるUniversal Clipboardは、iOSのデバイスでコピーした「テキスト」や「画像」が、Macのクリップボードで共有できるというものですが、WWDC16のセッション 「What's New in Cocoa Touch」の中では、これに関連してUIPasteboardの新しいメソッドについて触れられていました。

紹介されていたUIPasteboardの新機能は、次の2つです。

  • クリップボードの内容確認
  • クリップボードの有効期範囲と期限

今回は、この新しいメソッドについて纏めてみたいと思います。

2 クリップボードの内容確認

例えば、 hasColorstrueが返った場合、クリップボードに色に関する情報が含まれていますので、開発者は、これを利用して、カラーピッカーのデフォルト色を設定するような事が可能です。

クリップボードにあるコンテンツを確認するメソッドは、次の4種類です。

var hasColors: Bool { get }
var hasImages: Bool { get }
var hasStrings: Bool { get }
var hasURLs: Bool { get }

そして、各メソッドを使用すると、次のようになります。

let pasteboard = UIPasteboard.general
pasteboard.string = "TEST"
pasteboard.url = URL(string: "http://www.sapporoworks.ne.jp")
//pasteboard.image = UIImage(named: "sample.png") // imageをセットするとhasImagesのみがtrueを返す
//pasteboard.color = UIColor.blue //colorをセットするとhasColorのみがtrueを返す

if pasteboard.hasStrings {
    print("has Strings!")
}
if pasteboard.hasURLs {
    print("has URLs!")
}
if pasteboard.hasImages {
    print("has images!")
}
if pasteboard.hasColors {
    print("colors!")
}

上記コードで確認していて分かったのですが、imageやcolorにデータをセットすると、既存のstringやurlが消えてしまいます。 また、UIImage()のように、データの無いものをセットしてもhasImagesはfalseとなります。

3 クリップボードの有効範囲と期間

Universal Clipboardが導入されたUIPasteboardでは、セキュリティ上のリスクを下げるため、次の2つの機能が追加されています。

  • 有効範囲をローカルのみに制限する
  • 有効期限を設定する

上記の新機能を使用するためには、新しく追加されたsetItems:メソッドを使用します。

func setItems(_ items: [[String : Any]],  options: [UIPasteboardOption : Any] = [:])

ここでパラメータに使用されるUIPasteboardOptionも、iOS 10 以降で追加されたものですが、ここに、有効範囲や期限を設定できます。

static let localOnly: UIPasteboardOption //Bool
static let expirationDate: UIPasteboardOption // NSData

(1) ローカルのみ

有効範囲をローカルのみに制限する例は、次のようになるでしょう。 (すいません、macOS Sierraが、まだ手元に無く確認出来ていません)

let pasteboard = UIPasteboard.general
pasteboard.setItems([["key": "value"]], options: [UIPasteboardOption.localOnly : true])

(2) 有効期限

有効期限を制限する例は、次のようになるでしょう。

let pasteboard = UIPasteboard.general
let expirationDateOfTomorrow = Date().addingTimeInterval(60 * 60 * 24) //24時間有効
pasteboard.setItems([["key": "value"]], options: [UIPasteboardOption.expirationDate: expirationDateOfTomorrow])

4 最後に

今回は、Universal Clipboardに関連して拡張されたUIPasteboardについて纏めてみました。 macOS Sierraがインストールでき次第、更に動作確認を進めたいと思います。

5 参考リンク


API Reference UIPasteboard
API Reference setItems(_:options:)
API Reference UIPasteboardOption