質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Swift

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

Q&A

解決済

2回答

6145閲覧

Swiftでアプリから画像を取得したい

daigakusei

総合スコア18

Swift

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

0グッド

0クリップ

投稿2017/01/03 03:44

shareExtensionを使用して、他のアプリ(例えばDropbox, EverNoteなど)から
共有ボタン->自作アプリを選択->Post でその画像をUserDefaultsで
一時的に保存して自作アプリにもって来てその中で保存、UserDefaultsの中身は削除
としたいのですが、text形式のもの(URL, 書き込んだ文字)しか持ってくることができず
画像データを持ってくることができなくて困っています。

Swift

1override func didSelectPost() { 2 3 let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem 4 let itemProvider = inputItem.attachments![0] as! NSItemProvider 5 6 // shareExtension ではそのページの 画像 を取得 7 if (itemProvider.hasItemConformingToTypeIdentifier("public.image")) { 8 itemProvider.loadItem(forTypeIdentifier: "public.image", options: nil, completionHandler: { 9 (item, error) in 10 11 // item に画像 が入っている 12 let itemImage: UIImage = item as! UIImage 13 14 // itemImage を UserDefaultsで保存処理 15 }) 16 } 17 18 self.extensionContext!.completeRequestReturningItems([], completionHandler: nil) 19}

こちらのサイトを参考にしているのですが、中に出てくる
inputItem, itemProviderの変数の意味がいまいち理解できず、
応用を生かすことができません。

hasItemConformingToTypeIdentifierの中でデータを認識してそれがあるかどうかを
チェックするのですが、"public.image", "public.pdf" などがその部分を通らないためできません。
画像のURLや書き込んだ内容(self.contentText)などは保存可能ですが、その画像データ本体を保存することはやはりできないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。はじめに写真をPOSTする手順をお伝えします。
/**
1.BuildTargetをSampleExtensionにする。
理由は、SampleShare_Teratailのソースには保存したファイルを呼び出すコードしか記載しておりません。
初回起動では、保存された写真などはないので、nilになり。例外が起きます。
イメージ説明
2.共有ボタンを押すとアプリ名が記載されているので、SampleEXtensionをタップします。その後POSTを押すアラートが表示されるので、タップします。

イメージ説明
3.一旦、アプリを終了して、1.の写真のTargetを切り替えて、再度SampleShare_Teratilを起動します。
イメージ説明
/**
Q
image変数を定義して中身があった際に保存処理を行うというところに処理がうまくいかず、urlの中がnilだったのでPostしても何も起きないという事象について、

A
想像ですが、ご自身のプロジェクトファイルのBundleIdntifierをXcodeの設定とコードと紐付ける必要があると思います。

手順
1.
let defaults = UserDefaults(suiteName: "group.com.dbank.BLE.SampleShare-Teratail")
のcom.dbank.BLE.SampleShare-Teratailは、BundleIdntifierです。

ご自身のプロジェクトファイルのBundleIdntifierを設定します。
保存の場合は"group.com.dbank.BLE.SampleShare-Teratail"のようにします。
イメージ説明

キーチェーン、AppGroupsが有効になっているか再確認願います。
イメージ説明

この設定がうまく対応できればできると思います。
ちなみにTargetのSampleExtensionのExtensionを語尾につけないと共有ボタンを押す際に、アプリが現れません。そちらも合わせて、確認願います。よろしくお願いします。

投稿2017/01/04 18:04

編集2017/01/04 18:29
Dbank

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daigakusei

2017/01/05 14:23

Dbankさんのおかげでうまく動作しました! 大変わかりやすく画像付きで説明していただきありがとうございます。 解説していただいたようにキーチェーンとApp Groupsの設定を見直したのですがどうやら self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) を入れる位置がメソッドの一番外になっていたためPost処理->保存処理が行われませんでした。大変お手数をおかけしました(^^;) 本当にありがとうございました!
Dbank

2017/01/05 14:31

良かったです!
guest

0

ベストアンサー

1.保存方法はこちらです。
```//キーチェーンで紐付いている名前を記入
let defaults = UserDefaults(suiteName: "group.com.dbank.BLE.sampleShare")
let objects = defaults!.object(forKey: "ddd")

削除の方法は保存がわかれば、調べればすぐわかると思いますので、ネット検索願います。 2.写真の取り込み方法。 ```ここに言語を入力 override func didSelectPost() { let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem let itemProvider = inputItem.attachments![0] as! NSItemProvider // shareExtension ではそのページの 画像 を取得 if (itemProvider.hasItemConformingToTypeIdentifier("public.url")) { itemProvider.loadPreviewImage(options: nil, completionHandler: { (url, error) in if let image = url as? UIImage { //キーチェーンで紐付いている名前を記入 let defaults = UserDefaults(suiteName: "group.com.dbank.BLE.sampleShare") defaults?.setValue(UIImagePNGRepresentation(image), forKey: "ddd") let objects = defaults!.object(forKey: "ddd") print(objects!) } self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil) }) } }

3.こちらのGitHubにて対応ソースがあります。
SampleShare_Teratail

4.画像
イメージ説明
イメージ説明

投稿2017/01/03 17:59

Dbank

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daigakusei

2017/01/04 17:17

Dbankさん、ありがとうございます。 わざわざ実行結果やGithubまで載せていただき大変参考になります。 また、loadItemではなく、loadPreviewImageを使用するのは知りませんでした! すぐに試してみたのですが、image変数を定義して中身があった際に保存処理を行うというところに処理がうまくいかず、urlの中がnilだったのでPostしても何も起きませんでした(^^;) 実行結果はSafariの共有から行っているのがわかるのですが、私も同じようにSafariで適当なページ(Apple公式サイトやGoogle画像検索画面)から共有を押しているのですがうまくいきません。。 ちなみにDropBoxから行ってみると if let image = url as? UIImage { のところまでは行くのですがこの中の処理まではいきませんでした。 質問した際に参考にしたサイト内の手順とdidSelectPost()のコード以外に何か原因となるような変更を加えた点はありますでしょうか??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問