はじめに
Share Extensionで画像の保存を行いたいと考えています。
Teratailで過去の質問を調べたところ似た様な質問が2つあったのでそれぞれ試してみたのですが保存できませんでした。
参考にした記事
Swiftでアプリから画像を取得したい
share extensionのdidSelectPostにおいて,画像の取得ができません
検証したコード
Share Extensionでpostを受け取る部分のコード
Swift
1 override func didSelectPost() { 2 let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem 3 let itemProvider = inputItem.attachments![0] 4 5 if itemProvider.hasItemConformingToTypeIdentifier("public.url"){ 6 itemProvider.loadPreviewImage(options: nil, completionHandler: { (url, error) in 7 if let image = url as? UIImage { 8 let userDefault = UserDefaults.standard 9 userDefault.set(image.pngData(), forKey: "img") 10 userDefault.synchronize() 11 } 12 self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil) 13 }) 14 } 15 }
画像の保存を確認する部分(ViewController)
Swift
1 @IBOutlet weak var image: UIImageView! 2 override func viewDidLoad() { 3 super.viewDidLoad() 4 // Do any additional setup after loading the view. 5 let defaults = UserDefaults.standard 6 if defaults.object(forKey: "img") != nil { 7 let objects = defaults.object(forKey: "img") as? NSData 8 image.image = UIImage(data: objects! as Data) 9 } else { 10 print("保存されていません") 11 } 12 }
不明点
写真アプリやSafariで画像を検索しアプリにポストした場合hasItemConformingToTypeIdentifierの部分で弾かれて保存に失敗します。
googleのトップページを開いた状態でpostするとUserDefaultの部分まで行くのですがアプリ内のUserDefaultを確認すると値が保存されていません。
追記
** if itemProvider.hasItemConformingToTypeIdentifier("public.url")**の条件式をコメントアウトしてビルドしたところクラッシュはせず処理が進みました。
しかしUserDefaultへの保存はできていませんでした。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。