前提・実現したいこと
share extensionを利用して画像を共有したいと思っています.
webページで開いている画像等ではなく,iphoneの写真アプリ内の画像やスクリーンショットの画像を共有することを想定しております.
didSelectPostにおいて,postがクリックされた際にアタッチメントの画像をシェアしたいのですがうまくいきません.
発生している問題・エラーメッセージ
エラーは起こっていませんが,共有したい画像の取得ができません.
該当のソースコード
Swift
1 override func didSelectPost() { 2 3 let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem 4 let itemProvider = inputItem.attachments![0] 5 6 7 // 画像を取得 8 if (itemProvider.hasItemConformingToTypeIdentifier("public.url")) { 9 itemProvider.loadPreviewImage(options: nil, completionHandler: { (item, error) in 10 if let image = item as? UIImage { 11 //キーチェーンで紐付いている名前を記入 12 let sharedDefaults: UserDefaults = UserDefaults(suiteName: self.suiteName)! 13 //画像を保存 ※ここで画像の保存がうまくいきません 14 sharedDefaults.setValue(image.pngData(), forKey: "img") 15 //画像の名前を保存 16 var imgName = self.textView.text 17 imgName = ShareViewController.valueOfCell + "_" + imgName! 18 sharedDefaults.set(imgName, forKey: "name") 19 sharedDefaults.synchronize() 20 } 21 }) 22 } 23 24 self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil) 25 } 26
保存がうまくいったか確認するコード
Swift
1 class ImageViewController: UIViewController { 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 6 //確認 7 let suiteName: String = "group..." //group名は適当です 8 let imgkey: String = "img" 9 let namekey: String = "name" 10 let sharedDefaults: UserDefaults = UserDefaults(suiteName: suiteName)! 11 let img = sharedDefaults.object(forKey: imgkey) 12 let name = sharedDefaults.object(forKey: namekey) 13 print(name as! String) 14 print(img) 15 16 17 } 18 19 override func didReceiveMemoryWarning() { 20 super.didReceiveMemoryWarning() 21 } 22 23} 24
試したこと
didSelectPostを以下のように変えたところ,画像の名前(文字列)の保存のみできました.
以下のコードで保存ができてるかImageViewControllerで確認したところ,print(img)でOptional(teklra;)と出力されました.
ちなみに,「//画像を保存」と「画像の名前を保存」に該当するコードの順序を逆にして実行すると(画像を保存してから画像の名前を保存しようとすると),画像の名前すら保存されませんでした.
override func didSelectPost() { let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem let itemProvider = inputItem.attachments![0] //キーチェーンで紐付いている名前を記入 let sharedDefaults: UserDefaults = UserDefaults(suiteName: self.suiteName)! //画像の名前を保存 var imgName = self.textView.text sharedDefaults.set(imgName, forKey: self.namekey) //画像を保存 sharedDefaults.setValue(inputItem, forKey: "img") sharedDefaults.synchronize() self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil) }
どうぞよろしくお願い致します.
補足情報(FW/ツールのバージョンなど)
Swift4
Xcode10.1
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー