回答編集履歴

4

文章の改善

2019/01/09 03:00

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -202,9 +202,11 @@
202
202
 
203
203
  一応他の方法も試しました。
204
204
 
205
- loadItemを使うと画像のURLが取れましたが、どうも一時的なもので、このURLには確認用アプリの方からはアクセスできなさそうでした。
205
+ loadItemを使うと画像のURLが取れましたが、どうも一時的なもので、このURLには確認用アプリの方からはアクセスできなさそうでした(結局そのファイルの内容をバイナリのままUserDefaultsに保存する方法で試作)
206
-
206
+
207
+
208
+
207
- ただ、一個上のサンプルコードに比べ元のファイルデータ(のコピー)をそのまま保存するので、多少無駄が減ったかなと思います。
209
+ 一個上のサンプルコードは一旦UIImage変換がかかっているので、それに比べればこちらのサンプルコードは元のファイルデータ(のコピー)をそのまま保存するので、多少無駄が減ったかなと思います。
208
210
 
209
211
 
210
212
 

3

他の方法も試した

2019/01/09 03:00

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -194,4 +194,72 @@
194
194
 
195
195
 
196
196
 
197
+ ----
198
+
199
+ 更に追記:
200
+
201
+
202
+
197
- うちょっと調べ
203
+ 一応他の方法試しした
204
+
205
+ loadItemを使うと画像のURLが取れましたが、どうも一時的なもので、このURLには確認用アプリの方からはアクセスできなさそうでした。
206
+
207
+ ただ、一個上のサンプルコードに比べて元のファイルデータ(のコピー)をそのまま保存するので、多少無駄が減ったかなと思います。
208
+
209
+
210
+
211
+ ※本当は写真のアドレスだけ他のアプリに渡して、読み取れれば容量的にもスマートなんですが、ちょっとやり方がわからなかったです。
212
+
213
+
214
+
215
+ ```swift
216
+
217
+ override func didSelectPost() {
218
+
219
+
220
+
221
+ let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
222
+
223
+ let itemProvider = inputItem.attachments![0]
224
+
225
+
226
+
227
+ let itemIdentifier = kUTTypeImage as String
228
+
229
+ if itemProvider.hasItemConformingToTypeIdentifier(itemIdentifier) {
230
+
231
+ itemProvider.loadItem(forTypeIdentifier: itemIdentifier, options: nil) { item, error in
232
+
233
+ if let url = item as? URL {
234
+
235
+ print(url)
236
+
237
+ if let data = try? Data(contentsOf: url) {
238
+
239
+ let sharedDefaults = UserDefaults(suiteName: self.suiteName)!
240
+
241
+ sharedDefaults.set(data, forKey: "img")
242
+
243
+ sharedDefaults.synchronize()
244
+
245
+ }
246
+
247
+ }
248
+
249
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
250
+
251
+ }
252
+
253
+ } else {
254
+
255
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
256
+
257
+ }
258
+
259
+ }
260
+
261
+ ```
262
+
263
+
264
+
265
+ なお、`itemProvider.loadDataRepresentation`ではDataが取れなかったので諦めました。

2

更に追記

2019/01/09 02:58

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -131,3 +131,67 @@
131
131
  }
132
132
 
133
133
  ```
134
+
135
+
136
+
137
+ ----
138
+
139
+ 更に追記:
140
+
141
+
142
+
143
+ どうもXcode10とシミュレーターの組み合わせだと実行できないバグがあるようでして(ドメインのエラーが出る)
144
+
145
+ https://stackoverflow.com/questions/52462456/sharing-pdf-file-from-safari-with-action-extension-failing-in-swift-4-2-xcode-10?rq=1
146
+
147
+
148
+
149
+ > It looks like it is a bug in Xcode 10 iOS 12 Simulator only.
150
+
151
+
152
+
153
+ 実機で試したところ、うまく動きましたので、一度報告します。
154
+
155
+
156
+
157
+ ```swift
158
+
159
+ override func didSelectPost() {
160
+
161
+
162
+
163
+ let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
164
+
165
+ let itemProvider = inputItem.attachments![0]
166
+
167
+
168
+
169
+ if itemProvider.canLoadObject(ofClass: UIImage.self) {
170
+
171
+ itemProvider.loadObject(ofClass: UIImage.self) { image, error in
172
+
173
+ if let image = image as? UIImage {
174
+
175
+ let sharedDefaults = UserDefaults(suiteName: self.suiteName)!
176
+
177
+ sharedDefaults.setValue(image.pngData(), forKey: "img")
178
+
179
+ }
180
+
181
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
182
+
183
+ }
184
+
185
+ } else {
186
+
187
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
188
+
189
+ }
190
+
191
+ }
192
+
193
+ ```
194
+
195
+
196
+
197
+ もうちょっと調べます。

1

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

2019/01/09 02:36

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -23,3 +23,111 @@
23
23
 
24
24
 
25
25
  失敗した時には`self.extensionContext!.cancelRequest`を呼び出した方が良いのかなと思いましたが、そのへんは調べてみてください。
26
+
27
+
28
+
29
+ ----
30
+
31
+ 追記:
32
+
33
+ 自分でプロジェクト作ってみましたがシミュレーター上では保存コードまで到達しています。
34
+
35
+ (googleのトップページをpostしているだけです)
36
+
37
+
38
+
39
+ ![イメージ説明](764157dfd8f951441ff298a96c64d021.png)
40
+
41
+
42
+
43
+ ちゃんとブレークしていますし、OKもprintされています。
44
+
45
+
46
+
47
+ ```swift
48
+
49
+ class ShareViewController: SLComposeServiceViewController {
50
+
51
+
52
+
53
+ let suiteName = "group..."
54
+
55
+
56
+
57
+ override func isContentValid() -> Bool {
58
+
59
+ // Do validation of contentText and/or NSExtensionContext attachments here
60
+
61
+ return true
62
+
63
+ }
64
+
65
+
66
+
67
+ override func didSelectPost() {
68
+
69
+ let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
70
+
71
+ let itemProvider = inputItem.attachments![0]
72
+
73
+
74
+
75
+
76
+
77
+ // 画像を取得
78
+
79
+ if (itemProvider.hasItemConformingToTypeIdentifier("public.url")) {
80
+
81
+ itemProvider.loadPreviewImage(options: nil, completionHandler: { (item, error) in
82
+
83
+ if let image = item as? UIImage {
84
+
85
+ print("OK")
86
+
87
+ //キーチェーンで紐付いている名前を記入
88
+
89
+ let sharedDefaults: UserDefaults = UserDefaults(suiteName: self.suiteName)!
90
+
91
+ //画像を保存 ※ここで画像の保存がうまくいきません
92
+
93
+ sharedDefaults.setValue(image.pngData(), forKey: "img")
94
+
95
+ //画像の名前を保存
96
+
97
+ var imgName = self.textView.text
98
+
99
+ imgName = "_" + imgName!
100
+
101
+ sharedDefaults.set(imgName, forKey: "name")
102
+
103
+ sharedDefaults.synchronize()
104
+
105
+ }
106
+
107
+ self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
108
+
109
+ })
110
+
111
+ }
112
+
113
+
114
+
115
+
116
+
117
+ }
118
+
119
+
120
+
121
+ override func configurationItems() -> [Any]! {
122
+
123
+ // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
124
+
125
+ return []
126
+
127
+ }
128
+
129
+
130
+
131
+ }
132
+
133
+ ```