7
7

More than 3 years have passed since last update.

ShareExtensionで画像データを取得する

Posted at

ShareExtensionで画像を取得する方法です。

環境

macOS Catalina 10.15.6
Xcode 11.6

準備

Target追加

XcodeのTargetsにShareExtensionを追加します。

plist設定

ShareExtensionのplistの以下を設定します。

NSExtension -> NSExtensionAttributes -> NSExtensionActivationRule -> NSExtensionActivationSupportsImageWithMaxCount

NSExtensionActivationSupportsImageWithMaxCountには共有できる画像の最大枚数を指定してください。

例) 最大20枚まで共有する場合

スクリーンショット 2020-08-21 10.43.42.png

画像データ取得

共有するアイテムがPostされるとShareViewControllerの didSelectPost() が呼び出されるので、以下のようにして画像データを取得します。

ShareViewController.Swift
import MobileCoreServices // for kUTTypeImage

// 略

override func didSelectPost() {
    let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
    var count = 0

    // extensionItem.attachmentsにPostしたデータが入ってる
    for itemProvider in extensionItem.attachments! {
        // イメージでバリデーション
        if itemProvider.hasItemConformingToTypeIdentifier(String(kUTTypeImage)) {
            // アイテム読み込み
            itemProvider.loadItem(forTypeIdentifier: String(kUTTypeImage), options: nil) { (item, error) in
                if let url = item as? URL {
                    do {
                        // データ取る
                        let data = try Data(contentsOf: url)

                        // メタデータが欲しい場合
                        let source = CGImageSourceCreateWithData((data as CFData), nil)
                        let metadata = CGImageSourceCopyProperties(source!, nil)

                        // UIImagegが欲しい場合
                        let image = UIImage(data: data)

                        // この後image使ってやりたい処理をする
                    } catch {
                        print(error)
                    }
                }

                count += 1
                if count == extensionItem.attachments?.count {
                    // 全ての処理が完了したら呼び出す
                    self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
                }
            }
        }
    }
}

参考

Share Extensionでデータを共有する

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7