質問編集履歴

2 「前提・実現したいこと」を誤解を生まないよう修正しました.

kj8

kj8 score 16

2019/01/08 18:40  投稿

share extensionのdidSelectPostにおいて,画像の取得ができません
### 前提・実現したいこと
share extensionを利用して画像(写真フォルダの写真やスクショ)を共有したいと思っています.
share extensionを利用して画像を共有したいと思っています.
webページで開いている画像等ではなく,iphoneの写真アプリ内の画像やスクリーンショットの画像を共有することを想定しております.
didSelectPostにおいて,postがクリックされた際にアタッチメントの画像をシェアしたいのですがうまくいきません.
### 発生している問題・エラーメッセージ
エラーは起こっていませんが,共有したい画像の取得ができません.
### 該当のソースコード
```Swift
   override func didSelectPost() {
       
       let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
       let itemProvider = inputItem.attachments![0]
       // 画像を取得
       if (itemProvider.hasItemConformingToTypeIdentifier("public.url")) {
           itemProvider.loadPreviewImage(options: nil, completionHandler: { (item, error) in
               if let image = item as? UIImage {
                   //キーチェーンで紐付いている名前を記入
                   let sharedDefaults: UserDefaults = UserDefaults(suiteName: self.suiteName)!
                   //画像を保存 ※ここで画像の保存がうまくいきません
                   sharedDefaults.setValue(image.pngData(), forKey: "img")
                   //画像の名前を保存
                   var imgName = self.textView.text
                   imgName = ShareViewController.valueOfCell + "_" + imgName!
                   sharedDefaults.set(imgName, forKey: "name")
                   sharedDefaults.synchronize()
               }
           })
       }
       
       self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
   }
   
```
### 保存がうまくいったか確認するコード
```Swift
   class ImageViewController: UIViewController {
   
   override func viewDidLoad() {
       super.viewDidLoad()
     
       //確認
       let suiteName: String = "group..." //group名は適当です
       let imgkey: String = "img"
       let namekey: String = "name"
       let sharedDefaults: UserDefaults = UserDefaults(suiteName: suiteName)!
       let img = sharedDefaults.object(forKey: imgkey)
       let name = sharedDefaults.object(forKey: namekey)
       print(name as! String)
       print(img) 
   }
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
   }
   
}
   
```
### 試したこと
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
ここにより詳細な情報を記載してください。
  • iOS

    7358 questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    8435 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Swift

    14561 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1 保存がうまくいっているかどうかを確認するコードを追加しました.userDefaultsがうまく使えるかどうかを試したコードを追記しました.

kj8

kj8 score 16

2019/01/08 14:57  投稿

share extensionのdidSelectPostにおいて,画像の取得ができません
### 前提・実現したいこと
share extensionを利用して画像(写真フォルダの写真やスクショ)を共有したいと思っています.
didSelectPostにおいて,postがクリックされた際にアタッチメントの画像をシェアしたいのですがうまくいきません.
### 発生している問題・エラーメッセージ
エラーは起こっていませんが,共有したい画像の取得ができません.
### 該当のソースコード
```Swift
   override func didSelectPost() {
       
       let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
       let itemProvider = inputItem.attachments![0]
       // 画像を取得
       if (itemProvider.hasItemConformingToTypeIdentifier("public.url")) {
           itemProvider.loadPreviewImage(options: nil, completionHandler: { (item, error) in
               if let image = item as? UIImage {
                   //キーチェーンで紐付いている名前を記入
                   let sharedDefaults: UserDefaults = UserDefaults(suiteName: self.suiteName)!
                   //画像を保存 ※ここで画像の保存がうまくいきません
                   sharedDefaults.setValue(image.pngData(), forKey: "img")
                   //画像の名前を保存
                   var imgName = self.textView.text
                   imgName = ShareViewController.valueOfCell + "_" + imgName!
                   sharedDefaults.set(imgName, forKey: self.namekey)
                   sharedDefaults.set(imgName, forKey: "name")
                   sharedDefaults.synchronize()
               }
           })
       }
       
       self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
   }
   
```
### 保存がうまくいったか確認するコード  
```Swift  
   class ImageViewController: UIViewController {  
     
   override func viewDidLoad() {  
       super.viewDidLoad()  
       
       //確認  
       let suiteName: String = "group..." //group名は適当です  
       let imgkey: String = "img"  
       let namekey: String = "name"  
       let sharedDefaults: UserDefaults = UserDefaults(suiteName: suiteName)!  
       let img = sharedDefaults.object(forKey: imgkey)  
       let name = sharedDefaults.object(forKey: namekey)  
       print(name as! String)  
       print(img)   
 
 
   }  
 
   override func didReceiveMemoryWarning() {  
       super.didReceiveMemoryWarning()  
   }  
     
}  
     
```  
### 試したこと
試しにif文等をとっぱらい,以下のようにして文字列のみを保存しようとしたところうまくいったので,share extension自体の問題はないと思います.
let sharedDefaults: UserDefaults = UserDefaults(suiteName: self.suiteName)!
haredDefaults.set("test", forKey: self.namekey)
sharedDefaults.synchronize()
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
ここにより詳細な情報を記載してください。
  • iOS

    7358 questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    8435 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Swift

    14561 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る