在“不允许”位置获取后,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 位置”错误

为啥 xcode 4.2 位置模拟不允许输入纬度和经度的浮点值?

在 Kotlin 中获取新用户位置不起作用