[英]AFNetworking 2.0 requests hanging in Today Extension and Watch app in iOS 9 / WatchOS 2
使用Xcode 7(GM)和Xcode 7.1(测试版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!
之后Called!
两个块之一Called!
被记录。 但是,都没有人执行过。
但是,奇怪的是,如果我调用以下行:
[op cancel];
我得到了预期的failure
块的日志输出。 我没有尝试过的其他任何事情(关闭计算机上的Internet连接,创建废话URL等)都无法使failure
块执行。
在这一点上,我不确定我是否一直在尝试调试到深夜,是否是Xcode 7.x的错误,还是在某个地方出错。 任何帮助表示赞赏!
看来这个问题源于几件不同的事情。
问题的根源是iOS 9的新App Transport Security规则。 可以使用应用程序的info.plist
文件中的某些键来覆盖这些规则。 但是,我很难在扩展中使用Xcode 7.0(GM)来使覆盖键正确保存,因为在尝试运行项目时会抛出错误 。
步骤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
}
}];
希望这里有帮助将来的人。 这真是一场完整的噩梦,好了一天半才弄清楚!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.