gpt4 book ai didi

ios - 在使用 Amazon iOS SDK 的 swift iOS 应用程序中,如何为 AWSS3TransferUtility 下载操作设置自定义超时?

转载 作者:行者123 更新时间:2023-11-28 07:28:03 24 4
gpt4 key购买 nike

我正在使用 AWS SDK for iOS在 iOS 12 的快速应用程序中。我的应用程序必须列出 AWS S3 存储桶中的文件并下载其中的一些文件。列表文件操作运行良好,我成功地控制了它的超时。我没有成功完成下载任务。我的代码如下:

let credentialProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "<pool-id>")
let configuration = AWSServiceConfiguration(region: AWSRegionType.APSoutheast2, credentialsProvider: credentialProvider)

configuration?.timeoutIntervalForRequest = 30.0
configuration?.timeoutIntervalForResource = 86400


let transferUtilityConfiguration = AWSS3TransferUtilityConfiguration.init()

transferUtilityConfiguration.timeoutIntervalForResource = 86400
transferUtilityConfiguration.retryLimit = 1

AWSS3TransferUtility.register(with: configuration!, transferUtilityConfiguration: transferUtilityConfiguration, forKey: "com.mykey")

transferUtility = AWSS3TransferUtility.s3TransferUtility(forKey: "com.mykey")


let bucket = "com.mybucket"


transferUtility.configuration.maxRetryCount = 1

let urlForSavingFile = URL.init(fileURLWithPath: "")


transferUtility.download(to: urlForSavingFile, bucket: bucket, key: self.latestFileOnServer.key, expression: expression, completionHandler: self.completionHandler).continueWith { (task) -> AnyObject? in
if let error = task.error {
NSLog("Error: %@",error.localizedDescription);
DispatchQueue.main.async(execute: {
statusLabel.text = "Failed"
})
}

if let _ = task.result {

self.refDownloadTask = task.result
self.refDownloadTask?.setCompletionHandler(self.completionHandler!)
methodStart = Date.init()

let formatter = DateFormatter.init()

formatter.dateFormat = "dd' 'MMM' 'YYYY' - 'HH:mm:ss"
formatter.locale = Locale.init(identifier: "Europe / Rome")
let italyDate = formatter.string(from: methodStart)

print("Download started at \(italyDate)")
DispatchQueue.main.async(execute: {
//statusLabel.text = "Downloading..."
})
NSLog("Download Starting!")
// Do something with uploadTask.
}
return nil;
}

如果我等待文件完成下载,完成处理程序会被正确调用,但如果我使用网络链接调节器关闭网络,传输将永远挂起并且永远不会调用完成处理程序。任何帮助深表感谢。谢谢

最佳答案

经过多次测试,我成功找到了解决方案,让SDK尊重超时。在我的测试中,最初,我对命名约定有点困惑:

timeoutIntervalForResource 是传输可以花费的最长时间,无论任何成功/失败。这与 AWS SDK 开箱即用。

timeoutIntervalForRequest是我们感兴趣的值,它是网络丢失后任务等待附加数据的时间间隔。它的定时器是从最后一个数据包接收到的开始安排的。正如您在问题和评论中看到的那样,AWS SDK 似乎没有遵守它。

此命名约定与 Apple Cocoa USURLSession 系列类相同。在我的研究过程中,我遇到了这个 answer .对于将其配置实例化为后台配置的 URLSession,这种行为似乎一直存在。这不是不当行为,它只是自 iOS 8 以来后台下载的新标准。

现在,解决方案。通过在 AWS SDK Objective-C 代码中调试(是的,他们提供了完整的代码)我找到了位置。如果你打开 AWSS3TransferUtility.m 文件,在第 400 行左右,你会发现,在这个方法中:

- (instancetype)initWithConfiguration:(AWSServiceConfiguration *)serviceConfiguration
transferUtilityConfiguration:(AWSS3TransferUtilityConfiguration *)transferUtilityConfiguration
identifier:(NSString *)identifier
completionHandler: (void (^)(NSError *_Nullable error)) completionHandler {}

那些声明:

//Create the NS URL session
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:_sessionIdentifier];
configuration.allowsCellularAccess = serviceConfiguration.allowsCellularAccess;
configuration.timeoutIntervalForResource = transferUtilityConfiguration.timeoutIntervalForResource;

为了让它工作,将第一条语句替换为:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

现在,在您的代码中:

let credentialProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "<pool-id>")
let configuration = AWSServiceConfiguration(region: AWSRegionType.APSoutheast2, credentialsProvider: credentialProvider)

configuration?.timeoutIntervalForRequest = 30.0
configuration?.timeoutIntervalForResource = 86400

SDK 将在网络丢失 30 秒后触发完成处理程序并返回 -1001 错误。

我只测试了 transferutilitydownloadtask,但它应该也适用于上传。我知道这个解决方案不是防弹的,因为它没有考虑 session 配置标识符,但我会继续努力。此外,该解决方案意味着更改 AWS SDK 代码,但只需要一行代码。更改只是使 AWSS3TransferUtility 创建标准 URLSessionConfigurations 而不是后台配置。这可能还有其他副作用需要考虑。

关于ios - 在使用 Amazon iOS SDK 的 swift iOS 应用程序中,如何为 AWSS3TransferUtility 下载操作设置自定义超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55856944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com