在使用Xcode 7(GM)以及Xcode 7.1(beta 1)构建WatchKit和Today扩展时遇到了一个非常奇怪和令人沮丧的问题。使用AFNetworking 2.0(截止日期为止),我从以下任何扩展中调用以下代码:
AFHTTPRequestOperation *op = [manager GET:endpoint parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Response: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"ERROR: %@", error);
}];
NSLog(@"Called!");
这里的期望是在记录Called!
之后将调用两个块中的一个。但是,任何人都没有被执行过。
然而,奇怪的是,如果我打电话给以下一行:
[op cancel];
我输出了预期的failure
块的日志。我没有尝试过任何其他事情(在我的计算机上关闭互联网连接,创建一个无意义的URL等)已经能够执行failure
块。
此时我不确定我是否一直试图将这个调试到深夜,如果这是Xcode 7.x的错误,或者我在某个地方犯了错误。任何帮助表示赞赏!
答案 0 :(得分:0)
看起来这个问题源于几个不同的事情。
问题的根源是iOS 9的新App Transport Security规则。应用的info.plist
文件中的这些规则可以是overridden using certain keys。但是,我很难在扩展中使用Xcode 7.0(GM)正确保存覆盖键,因为在尝试运行项目时会抛出an error。
第1步:
在Xcode 7.1 beta 1中,Xcode实际支持上述键(甚至自动完成),因此我能够将这些键添加到我的WatchKit和今天的扩展info.plist
文件中:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
第2步:此时,AFNetworking仍然悬而未决,并且不允许连接通过。即便在现在,我也不确定为什么会这样。相反,我使用标准的iOS类进行网络调用,最终解决了我的问题并能够像往常一样运行请求:
NSMutableURLRequest *connection = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://myurl.com/xyz"]];
[connection setValue:"Bearer myAuthorization" forHTTPHeaderField:@"Authorization"];
[NSURLConnection sendAsynchronousRequest:connection queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (error == nil) {
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//Do stuff with data
} else {
//Error handling
}
}];
希望这里的某些东西可以帮助将来的某个人。这是一个完美的噩梦,需要好好的一天半才能搞清楚!