Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么我的CLLocationmanager代表没有接到电话?_Iphone_Cllocationmanager - Fatal编程技术网

Iphone 为什么我的CLLocationmanager代表没有接到电话?

Iphone 为什么我的CLLocationmanager代表没有接到电话?,iphone,cllocationmanager,Iphone,Cllocationmanager,我在sim卡或设备上都没有收到任何位置回调。我把这个代码叫做: - (void)startLocationCallbacks: (NSObject*) ignore { locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; locationManager.distanceFilter = MINIMUM_METERS; [l

我在sim卡或设备上都没有收到任何位置回调。我把这个代码叫做:

- (void)startLocationCallbacks: (NSObject*) ignore
{
  locationManager.delegate = self;
  locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
  locationManager.distanceFilter = MINIMUM_METERS;

  [locationManager startUpdatingLocation];
  NSLog(@"[DEBUG] [locationManager startUpdatingLocation] (%@, %@)", locationManager, locationManager.delegate);
}
并在两者的顶部记录语句

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

但这两条log语句都没有被调用过。为我的应用程序启用位置通知(如设置中所示,加上我说的“允许”)

我没有得到位置更新的可能原因有哪些

配置/其他信息:

  • 我已分配locationManager,并将其保存在retain属性中
  • 我打电话给startUpdatingLocation
  • 我正在使用4.1 SDK
  • 问题在于Sim卡和iPodtouch(第二代)以及iPhone-3都运行4.1
  • 我的应用程序中允许位置通知(如设置中所示,并且因为我在警报中单击了“允许”。)
  • 我以前成功地使用过CLLocationManager(在许多装运应用程序中!),这对我来说真是个大麻烦
谢谢

呼!好的,我找到了

事实证明,使
CLLocationManager
不触发位置回调的方法之一是在非主线程中进行所有设置。当我将我的设置例程移动到一个
performselectornmainthread
时,所有的工作都完全按照预期进行

真是一场噩梦

希望这个答案能帮助其他人

编辑/澄清:

最初,我有这样的想法:

- (BOOL) appDidFinishLaunchingWithOptions: (NSDictionary*) options
{
     // ...[app setup, snip]
    [NSThread detachNewThreadSelector: @selector(postLaunchSetupThread) toTarget: self withObject: nil];
}

- (void)postLaunchSetupThread
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    // ...[other setup, snip]
    [self setupLocationManager];
    [pool release];
}

- (void)setupLocationManager
{
     self.myLocationManager = [[[CLLocationManager alloc] init] autorelease];
     [myLocationManager startLocationUpdates];
}
但是在线程中调用
setupLocationManager
会阻止回调。所以我的解决办法是移动线路

[self setupLocationManager];

退出线程并返回到
appDidFinishLaunchingWithOptions

实际上,您也可以从另一个线程运行它。 来自Apple文档:

位置管理器对象的配置必须始终在 具有活动运行循环(如应用程序的主循环)的线程 线

只需确保运行循环正在该线程上运行,并且CLLocationManager事件已调度。 有关运行循环的更多信息:

//查看此文件 //…CLLocationManager未正确调用委托方法

//…经过大量的研发,我正在使用它调用的看门狗方法”

适用于iOS 8

1) 我在初始化位置管理器之后就放置了这些行

if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}
2) 我在plist中添加了NSLocationAlwaysUsageDescription,并将其设置为字符串并添加了一条消息。 3) 在我的目标中,我单击了“功能”选项卡,然后打开后台模式,并选中了“位置更新”和“使用蓝牙LE附件”


这对我来说很有效

在我的情况下,这是因为我的设备无法确定位置-在呆在室内时,GPS信号不可用,wi-fi也断开连接,因此位置管理器无法接收任何位置数据,并且从未呼叫过代表


一旦我连接了wi-fi,它就起作用了(我想在这种情况下,搬到户外也应该起作用,但有时这不是一种非常方便的方式:)

注意:我见过其他几个类似的问题,它们都没有帮助。整个“打开你的wifi”,“不要使用sim卡”“等等,这里不适用。反正我也说不出来。我希望能找到一份清单,列出我可能无法收到回电的所有原因,这样我就可以核对一下。谢谢另一个线索:我关闭了设置中的位置通知,试图让它再次询问我。不问。此外,没有“用户拒绝”错误(didFailWithError:…),这就好像我的位置管理器没有触发一样。或者不承认我是代表。当我检查locationManager.delegate时,它是正确的。咕噜,咕噜,咕噜@vfn:尝试了你的技巧(将代码挂接到测试按钮上),我的回调被调用&做了预期的事情。所以现在最大的问题是:什么会触发我的位置管理器不向我发送有效位置或错误?(即,既不调用my didUpdateLocation也不调用my didFailWithError例程。)将精度更改为最佳并删除距离过滤器。@MaxMacLeod:类似症状,但有不同的根本原因。这个问题更恰当地说是“为什么我发布的变量不能继续工作?”而这个问题更像是“为什么我的操作放在一个永远不会有时间的线程上,永远不会有时间?”:)谢谢这一点——这让我省去了数小时的疯狂思考。CLLocationManager确实不喜欢脱离主线程创建。我想弄明白这一点简直是疯了!非常感谢你!你是个救生员!我花了一整天的时间在这件事上。。。谢谢主线!!作品谢谢我的头撞了这个30分钟。这也解决了我的问题。是的(+1),我应该在回答中提到这一点——但问题是:您不能设置位置管理器是一个不运行的线程,并期望它执行回调。解决方案包括(a)不要在单独的线程中设置它,以及(b)确保单独线程的runloop正在运行。我已尝试在具有正在运行的runloop的线程上使用它,但仍然没有调用委托方法。您能提供一个工作示例实现吗?这是另一种情况,问题是代理根本没有被调用。提供的链接u是关于计时的。奥利有正确的答案
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}