iOS 9 / WatchOS 2 中的 Today Extension 和 Watch 应用程序中挂起的 AFNetworking 2.0 请求
AFNetworking 2.0 requests hanging in Today Extension and Watch app in iOS 9 / WatchOS 2
我在使用 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
块日志输出。我尝试过的任何其他方法(关闭我计算机上的 Internet 连接、创建一个废话 URL 等)都无法让 failure
块执行。
在这一点上,我不确定我是否一直在尝试调试它到深夜,如果这是 Xcode 7.x 的错误,或者我是否在某处犯错。感谢您的帮助!
看起来这个问题是由几件不同的事情引起的。
问题的根源是 iOS 9 的新应用程序传输安全规则。尝试 运行 项目时,这些规则可以是 in the app's info.plist
file. However, I was having difficulty getting the override keys to save properly using Xcode 7.0 (GM) in the extensions because it would throw 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
}
}];
希望这里的内容对以后的人有所帮助。花了一天半的时间来弄清楚这完全是一场噩梦!
我在使用 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
块日志输出。我尝试过的任何其他方法(关闭我计算机上的 Internet 连接、创建一个废话 URL 等)都无法让 failure
块执行。
在这一点上,我不确定我是否一直在尝试调试它到深夜,如果这是 Xcode 7.x 的错误,或者我是否在某处犯错。感谢您的帮助!
看起来这个问题是由几件不同的事情引起的。
问题的根源是 iOS 9 的新应用程序传输安全规则。尝试 运行 项目时,这些规则可以是 info.plist
file. However, I was having difficulty getting the override keys to save properly using Xcode 7.0 (GM) in the extensions because it would throw 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
}
}];
希望这里的内容对以后的人有所帮助。花了一天半的时间来弄清楚这完全是一场噩梦!