У меня есть приложение для iOS, написанное на Swift 2.0, которое загружает изображения в хранилище больших двоичных объектов Microsoft Azure. Я использую Alamofire для запросов.
На устройстве с iOS 8 все работает нормально, но на iOS 9 выдает ошибки при загрузке:
let AlamofireManager = Alamofire.Manager.sharedInstance
AlamofireManager.session.configuration.HTTPAdditionalHeaders = [
"Content-Type": "image/jpg",
"x-ms-blob-type": "BlockBlob"
]
AlamofireManager.upload(.PUT, uploadURL, data: imageData)
.responseJSON { (request, response, result) in
print("Request=\(request)")
print("response=\(response)")
print("result=\(result)")
if (response) != nil {
let statusString = String(stringInterpolationSegment: response!.statusCode)
let statusCode = self.getStatusCodeFromStatusString(statusString)
if (statusCode == 201) {
// MY SUCCESS CODE IS HERE
}
else {
// STATUSCODE != 201
}
}
else {
// OTHER ERROR
}
}
Пример URL-адреса для загрузки (uploadURL
) может быть следующим:
https://mystorage.blob.core.windows.net:443/thumbs/7346e38a-eb54-48ea-b0fe-89357100dd18.jpg?sv=2013-08-15&sr=b&sig=GYwHvnUc52GsajFJCAu1v4W5qG0wSBpaXvxncD%2FAt34%3D&st=2015-10-01T11%3A25%3A57Z&se=2015-10-01T11%3A40%3A57Z&sp=w
Для Azure важно, чтобы: а) HTTP-глагол был PUT
б) параметры URL-адреса включались в URL-адрес, а не как составные данные (это токен доступа для загрузки).
Возможно, у Alamofire есть проблемы с созданием URL-адреса с параметрами в сочетании с PUT?
Это решение не работает, потому что оно основано на загрузке составных данных: Загрузить изображение с параметрами в Свифте
Поскольку я думаю о проблеме с параметром URL, я попробовал следующее:
let AlamofireManager = Alamofire.Manager.sharedInstance
AlamofireManager.session.configuration.HTTPAdditionalHeaders = [
"Content-Type": "image/jpg",
"x-ms-blob-type": "BlockBlob"
]
var URLRequest: NSMutableURLRequest {
let URL = NSURL(string: uploadURL)!
var mutableRequest = NSMutableURLRequest(URL: URL)
mutableRequest.HTTPMethod = Alamofire.Method.PUT.rawValue
return mutableRequest
}
AlamofireManager.upload(URLRequest, data: imageData)
:
: rest is same like above
:
Но это тоже не работает. В обоих случаях я всегда получаю ошибку 400 (в response.statusCode
) с сервера. result
содержит Failure
и информацию NSCocoaErrorDomain - code 3840
с описанием Invalid value around character 3
.
Но на iOS 8 решение работает как шарм :(
Есть идеи, в чем проблема и как ее решить?
Редактировать: Или проблема может быть в порте?