在“不允许”位置获取后,sendSynchronousRequest 在 3.1.2 下失败
Posted
技术标签:
【中文标题】在“不允许”位置获取后,sendSynchronousRequest 在 3.1.2 下失败【英文标题】:sendSynchronousRequest fails under 3.1.2 after "Don't Allow" location fetch 【发布时间】:2009-11-03 19:06:35 【问题描述】:我在执行 sendSynchronousRequest
失败时遇到问题。只有在我尝试获取当前地理位置并且用户点击“不允许”后它才会失败。它只发生在 3.1.2 下。 (据我所知。它在 3.0.1 中运行良好。)
这是我的工作:
我设置了一个非常基本的测试应用程序,其中几乎没有任何内容。在applicationDidFinishLaunching
中,我添加了对我的函数 test 的调用:
- (void) test
CLLocationManager *mLM;
mLM = [[CLLocationManager alloc] init];
mLM.delegate = self;
if ( [mLM locationServicesEnabled] )
[mLM startUpdatingLocation];
我的委托方法也很简单:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
[manager stopUpdatingLocation];
[self sendRequest]; // succeeds
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
[manager stopUpdatingLocation];
[self sendRequest]; // fails
最后,这是我的 sendRequest:
- (void) sendRequest
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"https://theurl"]]; // this is actually a valid URL, changed here for privacy
[request setHTTPMethod:@"GET"];
[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
NSString *unpw = @"username:password";
NSString *base64 = [NSString base64StringFromString:unpw];
[request addValue:[NSString stringWithFormat:@"Basic %@", base64] forHTTPHeaderField:@"Authorization"];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *respdata = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
[request release];
对sendSynchronousRequest
的呼叫挂起。这非常令人沮丧。有人有什么想法吗?
【问题讨论】:
您获取的 URL 是否存在网络问题?通话是否无限期挂起? 如果用户允许获取地理位置,sendSynchronousRequest 就可以成功。它在其他任何地方都可以正常工作,除了现在用户对 3.1.2 中的地理位置获取说“不允许”之后。它似乎无限期地挂起,虽然我没有等待超过几分钟才能找到答案。 作为数据点,尝试在自己的线程中运行 sendRequest(只需使用 NSInvocationOperation)。 不知道如何使用 NSInvocationOperation,我尝试使用 performSelectorInBackground 代替,它似乎有效。虽然这对我没有太大帮助,因为我仍然想解决原来的问题。不过,值得注意的是。 糟糕。不小心点赞了这条评论。您可以在通过和失败的情况下从 sendRequest 发布堆栈跟踪吗?我的想法是,当您的委托方法被调用时,应用程序可能处于某种模式运行循环中,从而使网络连接无法正常工作。 【参考方案1】:这很神奇。确保 mLm 是您的类变量,因此您可以这样做:
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
[self.mLm release];
self.mLM = [[CLLocationManager alloc] init];
self.mLM.delegate = nil;
[self sendRequest]; // fails - This time it will work!!!
【讨论】:
谢谢你 - 它几乎修复了它,但不完全。 sendRequest 成功了,但后来我失败了。但我玩了一下,发现你的代码有一个小的变体:[mLM stopUpdatingLocation]; mLM.delegate = nil; [MLM 发布]; mLM = [[CLLocationManager alloc] init]; mLM.delegate = self;以上是关于在“不允许”位置获取后,sendSynchronousRequest 在 3.1.2 下失败的主要内容,如果未能解决你的问题,请参考以下文章
React JS 应用程序的浏览器中出现“用户不允许访问 Windows 位置”错误