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

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

ただいまの
回答率

90.37%

  • Swift

    8214questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,412

daigakusei

score 12

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

override func didSelectPost() {

    let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
    let itemProvider = inputItem.attachments![0] as! NSItemProvider

    // shareExtension ではそのページの 画像 を取得
    if (itemProvider.hasItemConformingToTypeIdentifier("public.image")) {
        itemProvider.loadItem(forTypeIdentifier: "public.image", options: nil, completionHandler: {
            (item, error) in

            // item に画像 が入っている
            let itemImage: UIImage = item as! UIImage

            // itemImage を UserDefaultsで保存処理
        })
    }

    self.extensionContext!.completeRequestReturningItems([], completionHandler: nil)
}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

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/05 02:17

    Dbankさん、ありがとうございます。
    わざわざ実行結果やGithubまで載せていただき大変参考になります。
    また、loadItemではなく、loadPreviewImageを使用するのは知りませんでした!


    すぐに試してみたのですが、image変数を定義して中身があった際に保存処理を行うというところに処理がうまくいかず、urlの中がnilだったのでPostしても何も起きませんでした(^^;)

    実行結果はSafariの共有から行っているのがわかるのですが、私も同じようにSafariで適当なページ(Apple公式サイトやGoogle画像検索画面)から共有を押しているのですがうまくいきません。。

    ちなみにDropBoxから行ってみると
    if let image = url as? UIImage {
    のところまでは行くのですがこの中の処理まではいきませんでした。

    質問した際に参考にしたサイト内の手順とdidSelectPost()のコード以外に何か原因となるような変更を加えた点はありますでしょうか??

    キャンセル

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"のようにします。
イメージ説明

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/05 23:23

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

    キャンセル

  • 2017/01/05 23:31

    良かったです!

    キャンセル

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

  • ただいまの回答率 90.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    8214questions

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