GPS应用程序停止在iOS 5上运行 - 位置管理器未更新

时间:2011-10-22 04:43:39

标签: objective-c ios5 gps cllocationmanager

我开发了针对iOS 4.3的应用。它工作正常。但是自从我迁移到iOS 5.0后,该应用程序开始出现奇怪的行为。位置管理员未显示位置变化的更新。有人遇到过这种问题吗?

感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

我与CLLocation经理分享了奇怪的更新问题 从iOS 4.x移动到5:

  1. 您是否已将CLLocationManager对象子类化?

    • 问题: 在那种情况下某个时候委托方法 不要被叫(例如didUpdateLocation)。

    • 修复:不要继承CLLocationManager

  2. CLLocationManager是否来自Singleton?
    • 问题:使用CLLocationManager对象作为属性 单个对象在4.x中工作正常但在iOS5中不一致
    • 修复:将对象移动到非单件对象
  3. 如果上述任何一种情况有所帮助,或者您已尝试过它而失败了
    • 问题:由于某种原因,CLLocationManager仍然无法运行 来自主线程,因此您会遇到奇怪的行为。
    • 修复#1 :在appDelegate中创建CLLocationManager对象作为属性 没有子类化它。 (这个解决方案证明效果最好,即使在越狱的iphone上) 。如果你的设计类似于情况2,你仍然可以使用指向它的单例实例的动态属性。
    • 修复#2 :一个更脏的解决方案是确保它使用 performSelectorOnMainThread 或其他方式从主runloop运行
  4. 希望这有帮助:)

答案 1 :(得分:1)

iOS 5处理内存管理的方式可能是一种方式。如果您在.h文件中声明变量而没有正确或隐式地引用它[self.myVar doSomething];如果你不知道它,它可能会倾倒在你身上。它仍然可以正常编译,但主要会被忽略并传递。

如果没有看到代码,则不是100%,但是当iOS 5调用时,我已经注意到了这个问题以及我们公司的一些旧程序。祝你好运。

答案 2 :(得分:0)

  

核心位置框架中包含的关键类是   CLLocationManager和CLLocation。 CLLocationManager的一个实例   class在应用程序中创建,属性设置为指示   应用程序所需的位置准确性级别。   然后指示位置管理器开始跟踪位置   信息:

CLLocationManager *locationMgr = 
      [[CLLocationManager alloc] init];
locationMgr.desiredAccuracy = kCLLocationAccuracyBest;
locationMgr.delegate = self;

[locationMgr startUpdatingLocation];
  

每次更新位置时,都会命名一个应用程序委托方法   didUpdateToLocation由位置管理器调用并传递   有关当前位置的信息。上面的代码也是,   因此,将当前类指定为位置管理器   委派。

如果您感兴趣我从这里获得此信息,它是专门为iOS 5制作的:http://www.techotopia.com/index.php/Getting_iPhone_Location_Information_using_the_iOS_5_Core_Location_Framework

答案 3 :(得分:0)

在缓存位置的应用中遇到间歇性问题。有时,位置服务需要比预期更长的时间来返回位置,而是返回最后一个缓存位置。请参阅this iOS documentation示例,该示例使用howRecent变量过滤掉可能已缓存的位置。

为了防止Apple更改其URL,此处列出了相关的委托方法:

// Delegate method from the CLLocationManagerDelegate protocol.
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
  // If it's a relatively recent event, turn off updates to save power
  NSDate* eventDate = newLocation.timestamp;
  NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
  if (abs(howRecent) < 15.0)
  {
    NSLog(@"latitude %+.6f, longitude %+.6f\n",
          newLocation.coordinate.latitude,
          newLocation.coordinate.longitude);
  }
  // else skip the event and process the next one.
}

这实际上忽略了超过15秒的任何位置。我们在应用中将时间间隔设置为5.0,但您必须尝试查看适合您的时间段。