ShareExtensionで画像を取得する方法です。
環境
macOS Catalina 10.15.6
Xcode 11.6
準備
Target追加
XcodeのTargetsにShareExtensionを追加します。
plist設定
ShareExtensionのplistの以下を設定します。
NSExtension -> NSExtensionAttributes -> NSExtensionActivationRule -> NSExtensionActivationSupportsImageWithMaxCount
NSExtensionActivationSupportsImageWithMaxCountには共有できる画像の最大枚数を指定してください。
例) 最大20枚まで共有する場合
画像データ取得
共有するアイテムが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)
}
}
}
}
}