teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

文章の改善

2019/01/09 03:00

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -100,9 +100,10 @@
100
100
  更に追記:
101
101
 
102
102
  一応他の方法も試しました。
103
- loadItemを使うと画像のURLが取れましたが、どうも一時的なもので、このURLには確認用アプリの方からはアクセスできなさそうでした。
103
+ loadItemを使うと画像のURLが取れましたが、どうも一時的なもので、このURLには確認用アプリの方からはアクセスできなさそうでした(結局そのファイルの内容をバイナリのままUserDefaultsに保存する方法で試作)
104
- ただ、一個上のサンプルコードに比べて元のファイルデータ(のコピー)をそのまま保存するので、多少無駄が減ったかなと思います。
105
104
 
105
+ 一個上のサンプルコードは一旦UIImageに変換がかかっているので、それに比べればこちらのサンプルコードは元のファイルデータ(のコピー)をそのまま保存するので、多少無駄が減ったかなと思います。
106
+
106
107
  ※本当は写真のアドレスだけ他のアプリに渡して、読み取れれば容量的にもスマートなんですが、ちょっとやり方がわからなかったです。
107
108
 
108
109
  ```swift

3

他の方法も試した

2019/01/09 03:00

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -96,4 +96,38 @@
96
96
  }
97
97
  ```
98
98
 
99
+ ----
100
+ 更に追記:
101
+
99
- うちょっと調べ
102
+ 一応他の方法試しした
103
+ loadItemを使うと画像のURLが取れましたが、どうも一時的なもので、このURLには確認用アプリの方からはアクセスできなさそうでした。
104
+ ただ、一個上のサンプルコードに比べて元のファイルデータ(のコピー)をそのまま保存するので、多少無駄が減ったかなと思います。
105
+
106
+ ※本当は写真のアドレスだけ他のアプリに渡して、読み取れれば容量的にもスマートなんですが、ちょっとやり方がわからなかったです。
107
+
108
+ ```swift
109
+ override func didSelectPost() {
110
+
111
+ let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
112
+ let itemProvider = inputItem.attachments![0]
113
+
114
+ let itemIdentifier = kUTTypeImage as String
115
+ if itemProvider.hasItemConformingToTypeIdentifier(itemIdentifier) {
116
+ itemProvider.loadItem(forTypeIdentifier: itemIdentifier, options: nil) { item, error in
117
+ if let url = item as? URL {
118
+ print(url)
119
+ if let data = try? Data(contentsOf: url) {
120
+ let sharedDefaults = UserDefaults(suiteName: self.suiteName)!
121
+ sharedDefaults.set(data, forKey: "img")
122
+ sharedDefaults.synchronize()
123
+ }
124
+ }
125
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
126
+ }
127
+ } else {
128
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
129
+ }
130
+ }
131
+ ```
132
+
133
+ なお、`itemProvider.loadDataRepresentation`ではDataが取れなかったので諦めました。

2

更に追記

2019/01/09 02:58

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -64,4 +64,36 @@
64
64
  }
65
65
 
66
66
  }
67
- ```
67
+ ```
68
+
69
+ ----
70
+ 更に追記:
71
+
72
+ どうもXcode10とシミュレーターの組み合わせだと実行できないバグがあるようでして(ドメインのエラーが出る)
73
+ https://stackoverflow.com/questions/52462456/sharing-pdf-file-from-safari-with-action-extension-failing-in-swift-4-2-xcode-10?rq=1
74
+
75
+ > It looks like it is a bug in Xcode 10 iOS 12 Simulator only.
76
+
77
+ 実機で試したところ、うまく動きましたので、一度報告します。
78
+
79
+ ```swift
80
+ override func didSelectPost() {
81
+
82
+ let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
83
+ let itemProvider = inputItem.attachments![0]
84
+
85
+ if itemProvider.canLoadObject(ofClass: UIImage.self) {
86
+ itemProvider.loadObject(ofClass: UIImage.self) { image, error in
87
+ if let image = image as? UIImage {
88
+ let sharedDefaults = UserDefaults(suiteName: self.suiteName)!
89
+ sharedDefaults.setValue(image.pngData(), forKey: "img")
90
+ }
91
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
92
+ }
93
+ } else {
94
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
95
+ }
96
+ }
97
+ ```
98
+
99
+ もうちょっと調べます。

1

自分で検証した結果を追記

2019/01/09 02:36

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -10,4 +10,58 @@
10
10
  本来であればすべて画像なりなんなりを保存した上で`self.extensionContext?.completeRequest`を呼び出さないといけないはずが、
11
11
  何も保存できていない段階で`self.extensionContext?.completeRequest`を呼び出していて処理が正常に動作していないのかな?と感じました。
12
12
 
13
- 失敗した時には`self.extensionContext!.cancelRequest`を呼び出した方が良いのかなと思いましたが、そのへんは調べてみてください。
13
+ 失敗した時には`self.extensionContext!.cancelRequest`を呼び出した方が良いのかなと思いましたが、そのへんは調べてみてください。
14
+
15
+ ----
16
+ 追記:
17
+ 自分でプロジェクト作ってみましたがシミュレーター上では保存コードまで到達しています。
18
+ (googleのトップページをpostしているだけです)
19
+
20
+ ![イメージ説明](764157dfd8f951441ff298a96c64d021.png)
21
+
22
+ ちゃんとブレークしていますし、OKもprintされています。
23
+
24
+ ```swift
25
+ class ShareViewController: SLComposeServiceViewController {
26
+
27
+ let suiteName = "group..."
28
+
29
+ override func isContentValid() -> Bool {
30
+ // Do validation of contentText and/or NSExtensionContext attachments here
31
+ return true
32
+ }
33
+
34
+ override func didSelectPost() {
35
+ let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
36
+ let itemProvider = inputItem.attachments![0]
37
+
38
+
39
+ // 画像を取得
40
+ if (itemProvider.hasItemConformingToTypeIdentifier("public.url")) {
41
+ itemProvider.loadPreviewImage(options: nil, completionHandler: { (item, error) in
42
+ if let image = item as? UIImage {
43
+ print("OK")
44
+ //キーチェーンで紐付いている名前を記入
45
+ let sharedDefaults: UserDefaults = UserDefaults(suiteName: self.suiteName)!
46
+ //画像を保存 ※ここで画像の保存がうまくいきません
47
+ sharedDefaults.setValue(image.pngData(), forKey: "img")
48
+ //画像の名前を保存
49
+ var imgName = self.textView.text
50
+ imgName = "_" + imgName!
51
+ sharedDefaults.set(imgName, forKey: "name")
52
+ sharedDefaults.synchronize()
53
+ }
54
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
55
+ })
56
+ }
57
+
58
+
59
+ }
60
+
61
+ override func configurationItems() -> [Any]! {
62
+ // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
63
+ return []
64
+ }
65
+
66
+ }
67
+ ```