ios - Swift:URLSession.shared.downloadTask 仅在模拟器中工作

标签 ios swift url

我已经为这个错误苦苦挣扎了几天...... 所以我有一个函数应该从在线 txt 文件下载一些数据然后返回它。奇怪的是,当我在模拟器中尝试或者连接我的 iPhone 并在那里下载时,它完全有效。但是一旦我开始在 TestFlight 中测试它,这个功能就根本不起作用了。

这是函数代码:

public static func loadSomeData() -> String {
    let url = URL(string: "https://myurl.com/file.txt")!
    var input = ""

    let task = URLSession.shared.downloadTask(with: url) { localURL, urlResponse, error in
        if let localURL = localURL {
            if let string = try? String(contentsOf: localURL) {
                input = string
            }
        }
    }

    task.resume()

    while !input.isEmpty {
        // Waits until the data is loaded
    }

    return input
}

此外,虽然地址是 HTTPS,但我仍然允许在 plist 文件中任意加载。

非常感谢您的宝贵时间和正手可能的答案!

最佳答案

正如 David S 所说,你不想做这样的繁忙循环。您需要做的是传入一个完成处理程序并让网络请求异步运行。像这样的事情应该可以解决问题。

class Loader {

    enum Error: Swift.Error {
        case badURL
        case badData
        case other(Swift.Error)
    }

    public func loadSomeData(then block: @escaping(Result<String, Error>) -> Void) {
        let url = URL(string: "https://www.w3.org/TR/PNG/iso_8859-1.txt")!

        let task = URLSession.shared.downloadTask(with: url) { localURL, urlResponse, error in

            guard error == nil else {
                block(.failure(.other(error!)))
                return
            }

            guard let localURL = localURL else {
                block(.failure(.badURL))
                return
            }

            guard let string = try? String(contentsOf: localURL) else {
                block(.failure(.badData))
                return
            }

            block(.success(string))
        }

        task.resume()
    }
}

然后你就可以这样做来获取你需要的任何数据。

let loader = Loader()
loader.loadSomeData { result in
    switch result {
    case .success(let string):
        print("SUCCESS: \(string)")
    case .failure(let error):
        print("ERROR: \(error)")
    }
}

关于ios - Swift:URLSession.shared.downloadTask 仅在模拟器中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59146156/

相关文章:

android - 我可以为现有应用程序添加新的 AdWhirl 广告网络吗?

ios - 如何以编程方式检索 UIScrollView? (iOS 5 Storyboard)

ios - 当设备被锁定或应用程序处于后台时,App Store 上的应用程序是否可以访问钥匙串(keychain)?

swift - Xcode 6 Beta/Swift - Playground 不更新

javax.net.ssl.SSLException : java. lang.RuntimeException:无法生成 DH key 对

ios - 根据 URL 前缀执行不同的操作

iphone - 在 UICollectionView/UICollectionViewLayout 旋转或边界更改时禁用淡入淡出的最佳方法是什么?

ios - 在我正在创建的框架中的 XCTest 期间无法加载自定义字体

ios - 在 Swift 中使用 Glimpse 时指定文档目录作为文件输出 URL

css - Rails 应用程序中 CSS "background:url"属性的正确语法是什么?