[iOS] Alamofireでdownloadしたらnilになる

2019/01/26

こんにちは。きんくまです。小ネタです。

Alamofireの使い方のチュートリアルをやっていました。

>> Alamofire/Documentation/Usage.md

だいたい一通りやってみたのですが、1箇所だけうまくいきませんでした。
download の部分です。レスポンスの中身がnilになってしまいました。

サンプルコード

let url = "https://httpbin.org/image/png"
Alamofire.download(url)
    .responseData { [weak self](res) in
        guard let myself = self else { return }
        print("status \(res.response?.statusCode)") //200で返ってくる
        print("value \(res.result.value)") //ここがnilになる
        if let data = res.result.value {
            //なので、この中は通らない
            let image = UIImage(data: data)
            myself.pictureImageView.image = image
        }

それで、最初どこが間違っているのかわからなかったのですけど、ドキュメントをよく見てみたら注釈にこう書いてありました。

This will only work on macOS as is. Other platforms don’t allow access to the filesystem outside of your app’s sandbox. To download files on other platforms, see the Download File Destination section.

上の場合がうまくいくのはmacOSの場合だけです。その他のプラットフォームはアプリ内サンドボックス以外ではアクセスの許可ができません。その他のプラットフォームの場合は、ダウンロード先の部分をみてね!

ということなので、ちゃんとダウンロード先を明示します。

修正したコード

let url = "https://httpbin.org/image/png"

let dest:DownloadRequest.DownloadFileDestination = { _, _ in
    let documentsURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0]
    let fileURL = documentsURL.appendingPathComponent("pig.png")
    return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}

Alamofire.download(url, to: dest)
    .responseData { [weak self](res) in
        guard let myself = self else { return }
        print("status \(res.response?.statusCode)") //200
        print("value \(res.result.value)") //nilじゃない
        if let data = res.result.value {
            let image = UIImage(data: data)
            myself.pictureImageView.image = image //表示される
        }
    }

無事にブタさんが表示されました。よかったです。ではでは。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

LINEスタンプ作りました!
毎日使える。とぼけたウサギ。LINEスタンプ販売中! 毎日使える。とぼけたウサギ

ページトップへ戻る