🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

Xcode

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

Swift

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

Q&A

解決済

1回答

2301閲覧

iOSネイティブアプリ開発(swift) URLからgifアニメーション画像のダウンロード機能を実装したい

MataSema

総合スコア15

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/01/21 03:41

前提・実現したいこと

URLからgif画像を取得して、ダウンロードしカメラロールに保存する機能を実装したいです。
iOS(xcode 12.2) swift5にて iphoneアプリの開発を行っています。

経緯を説明させていただくと、
もともとALAssetsLibraryを使って以下のコードで実装していました。
これは、現状、実装がうまくいっており、URLからgif画像を取得、正常にカメラロールに保存でき、gifアニメーションも動いています。

以下のコード
let gifurl = NSURL(string: "https://media3.giphy.com/media/X7s4uckfyihGJDrSpo/giphy.gif?cid=ecf05e470tbbc5baw8papsbrxogo1t3tfqfunrbt6aug51hb&rid=giphy.gif");

let lib = ALAssetsLibrary() let data2 = NSData(contentsOf: gifurl! as URL) lib.writeImageData(toSavedPhotosAlbum: data2 as Data?, metadata: nil) { (gifurl, err) in }

ただ、xcode的には、
ALAssetsLibraryのライブラリが廃止する方向のようで、
そのうち使えなくなることが予想されます。
ALAssetsLibraryを使用しないで、別の方法で実装したいと考えています。

■■機能を実装中に以下のエラーメッセージが発生しました。

xcodeの警告で PHPhotoLibrary を使いましょうと出ています。

そのため、 PHPhotoLibraryを使ったサンプルを検索して試したところ、

PHPhotoLibrary.shared().performChanges ({ let url = URL(fileURLWithPath: "your file path") PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: gifurl as! URL) }) { saved, error in if saved { print("Your image was successfully saved") } }

ダウンロードが成功しません。

取得エラー(上記error)は
Optional(Error Domain=PHPhotosErrorDomain Code=-1 "(null)")
restrictWeb = 1;
です。

エラー内容調べてみました、詳しく記載しているサイトを見つけるに至りませんでした。

■■備考

UIImageWriteToSavedPhotosAlbumライブラリをつかうと
DL、保存は成功しますが、静止画として保存されます。

■■ご協力のお願い

英語サイト、いろいろ探してますが、 サンプル自体が多くなく、うまく見つけることができません。

PHPhotoLibraryを使わない方法でも
大丈夫なので、

どなたか、実装がうまくいった方、おりましたら、ご教授いただければ幸いでございます。

何卒、宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • [アニメーションGIFを写真に保存する

](https://qiita.com/arthur87/items/25eb604745cdf9e39aca)

多分これが近いと思いますが、メソッド名などが変更になっているので、Swift5 でやるのでればこんな感じになると思います。

エラー処理や一時ファイルの削除などは行っていませんので、その辺りは適切に処理していただければと思います。

Swift

1import UIKit 2import Photos 3 4class ViewController: UIViewController { 5 6 @IBOutlet weak var kImageView: UIImageView! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 let url = URL(string: "https://media3.giphy.com/media/X7s4uckfyihGJDrSpo/giphy.gif?cid=ecf05e470tbbc5baw8papsbrxogo1t3tfqfunrbt6aug51hb&rid=giphy.gif")! 12 let task = URLSession.shared.dataTask(with: url, completionHandler: {data, response, error in 13 guard let data = data else { 14 fatalError() 15 } 16 17 // 表示させているだけなので本質的ではない 18 DispatchQueue.main.async { 19 self.kImageView.image = UIImage(data: data) 20 } 21 22 let url = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent("tmp.gif") 23 try! data.write(to: url, options: .atomic) 24 25 PHPhotoLibrary.shared().performChanges({ 26 PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: url) 27 }, completionHandler: nil) 28 }) 29 task.resume() 30 } 31}

投稿2021/01/21 07:29

TsukubaDepot

総合スコア5086

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

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

MataSema

2021/01/21 10:24

大変ありがとうございます。 素晴らしいです! 以下処理を加えたところ、 DispatchQueue.main.async { if self.kImageView != nil { self.kImageView.image = UIImage(data: data) } else { print("Doesn’t contain a value.") } } ダウンロード、保存、アニメーションGIF再生 が成功しました。 本当に感謝しております。 またなにかあれば、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問