我正在运行Xcode 7.1,在9.1上使用iOS设备,以及最新版本的Alamofire,我相信它是3.1.2。
我见过其他有类似错误的人 - That和this one from SO - 我的,但这些决议对我不起作用。在这些情况下工作的分辨率似乎是删除DerivedData文件夹,但这在我的情况下不起作用。
问题是,当我在模拟器中运行时,我可以使用Alamofire发出Web请求,但是当我在设备上安装应用程序时,我得到以下错误(在图像中)。
this one from their Github issues page
我尝试过使用运行9.1,9.0.1和8.3的设备。当我尝试发出Web请求时,所有这些设备都崩溃了。我坚持这个,我没有取得进展。直到我在几天前更新了我的podfile和我的Xcode版本中的所有pod之后,这一直有效。
我是iOS开发的新手,所以如果你需要查看更多错误日志或那种性质的东西,请告诉我,我会尽我所能来帮助你。任何帮助表示赞赏。
编辑:根据请求添加Alamofire.request
方法的代码。还为引用的Manager.sharedInstance.request
方法添加代码。这些是Alamofire图书馆内的方法。
// Alamofire.request
public func request(
method: Method,
_ URLString: URLStringConvertible,
parameters: [String: AnyObject]? = nil,
encoding: ParameterEncoding = .URL,
headers: [String: String]? = nil)
-> Request
{
return Manager.sharedInstance.request(
method,
URLString,
parameters: parameters,
encoding: encoding,
headers: headers
)
}
// Manager.sharedInstance.request
public func request(
method: Method,
_ URLString: URLStringConvertible,
parameters: [String: AnyObject]? = nil,
encoding: ParameterEncoding = .URL,
headers: [String: String]? = nil)
-> Request
{
let mutableURLRequest = URLRequest(method, URLString, headers: headers)
let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0
return request(encodedURLRequest)
}
答案 0 :(得分:0)
一个问题是stringByAddingPercentEncodingWithAllowedCharacters
返回一个可选项,当你进行字符串插值时,你会在字符串中出现Optional(...)
。因此,当它试图从中创建一个URL时,它无疑会失败。打印uri
字符串,您就会看到问题所在。例如,如果searchTerm
为"foo bar"
,则uri
将成为:
https://api.spotify.com/v1/search&q=Optional("foo%20bar")&type=artist,album,track
但这不正确。在表达式的末尾添加!
以打开它:
let searchTermEncoded = searchTerm.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
然后URI将(很大程度上)正确。
-
我建议不要自己逃避这个百分比(因为你正在使用的字符集不正确,即使你正确地解开searchTermEncoded
)。让Alamofire为您做到这一点:
let urlString = "https://api.spotify.com/v1/search"
let parameters = ["q" : searchTerm, "type" : "artist,album,track"]
Alamofire.request(.GET, urlString, parameters: parameters)
.responseJSON { response in
guard response.result.error == nil else {
print(response.result.error)
return
}
print(response.result.value)
}