CLLocationManager 是不是可以在没有互联网/蜂窝连接的情况下工作?

Posted

技术标签:

【中文标题】CLLocationManager 是不是可以在没有互联网/蜂窝连接的情况下工作?【英文标题】:Does CLLocationManager work without internet/cellular connection?CLLocationManager 是否可以在没有互联网/蜂窝连接的情况下工作? 【发布时间】:2011-09-08 10:44:56 【问题描述】:

愚蠢的问题!虽然我想知道 CLLocationManager 是否有可能在没有互联网的情况下工作?????

即iPhone 根本没有连接到互联网

【问题讨论】:

【参考方案1】:

iPhoneiPadDev 的回答有点错误:虽然位置管理器有时会失败,但它可以在没有网络连接的情况下工作。如果您想亲眼看看,请开车去蜂窝接收信号很差或根本不存在的地方开车:GPS 仍然可以工作。

这在很大程度上取决于您周围的环境条件以及您使用的设备。 iPod Touch 和一些 iPad 没有 GPS,并依靠 WiFi 热点来确定其位置数据。如果您没有网络访问权限,CLLocationManager 将返回无效位置。

iPhone 和 3G iPad确实有 GPS,因此您可能会得到一个合适的位置返回。 但是,他们使用 A-GPS(辅助 GPS),它使用来自网络的信息来实现更快的 GPS 锁定。如果您没有互联网连接,GPS 芯片可能需要一些时间才能获得信号并提供准确的位置:如果您在室内或看不到天空,准确度可能会大大降低。

重点CLLocationManager 可以并且将返回您的位置,即使没有可用的位置:但是坐标将无效。在使用它们之前测试返回的位置并确保它们是正确的,这一点很重要。

【讨论】:

所以你的意思是说它可能给出错误的位置,但它肯定会给出位置?...? 是的,我认为您必须检查该位置的时间戳,看看它是否已过时。 从其他问题来看,即使手机处于飞行模式也可以使用。即使无法获取新位置,CoreLocation 也会返回其上次保存的位置。【参考方案2】:

是的,如果在设备设置中启用了定位服务,它就可以工作。无需互联网连接。

【讨论】:

这在离线模式下对于数英里的旅行是否可靠? 什么是终端设置? @SamiulIslamSami 在设备的设置中,抱歉。我刚刚编辑了回复。【参考方案3】:

是的,但在开阔的天空中(指在路上、地面上)。

    如果您在线,您将从 wifi、移动数据获取位置坐标,然后如果您关闭互联网并更改您的位置(远离该位置),假设您现在在大楼(3 楼),那么您将不会获取正确的位置更新,而不是获取缓存坐标。

解决这个问题:

当您想要位置时,在离线模式下记录时间戳(比如“RecordDate”),然后比较 didUpdateToLocations: 方法给出的时间戳。

如果 didUpdateToLocations 的时间戳 > Recorded Timestamp 然后使用它

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations

    CLLocation *currentLocation = [locations lastObject];
    NSLog(@"didUpdateToLocation: %@", currentLocation);

    NSDate *eventDate=[[NSUserDefaults standardUserDefaults] objectForKey:@"RecordDate"];

    NSComparisonResult result = [currentLocation.timestamp compare:eventDate];
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss z"];
    switch (result)
    
        case NSOrderedAscending: 
            NSLog(@"Location%@ is greater than %@", [df stringFromDate:eventDate], [df stringFromDate:currentLocation.timestamp]);

        
            break;
        case NSOrderedDescending:
            NSLog(@"%@ is less %@", [df stringFromDate:eventDate], [df stringFromDate:currentLocation.timestamp]);
            if (currentLocation != nil)
            
                 //Use them
                //currentLocation.coordinate.latitude
                // currentLocation.coordinate.longitude
            
            break;
        case NSOrderedSame:
            //Use them
            break;
        default:
            NSLog(@"erorr dates %@, %@", [df stringFromDate:eventDate], [df stringFromDate:currentLocation.timestamp]);
            break;
    

【讨论】:

【参考方案4】:

Core Location 使用许多传感器来获取位置:蓝牙、Wi-Fi、GPS、气压计、磁力计,以及 Apple 所谓的“蜂窝硬件”。 GPS、BLE、气压计和磁力计都不需要数据连接。

【讨论】:

以上是关于CLLocationManager 是不是可以在没有互联网/蜂窝连接的情况下工作?的主要内容,如果未能解决你的问题,请参考以下文章

核心位置,是不是可以在没有 GPS 芯片的情况下向 iPad 提供 GPS/位置日期,以便在 CLLocationManager 类中使用?

有没有办法让 CLLocationManager 进入“空闲”而不是“停止”?

CLLocationManager 始终为 null -Delegate 实现是单例类(NSObject 的子类而不是 UIViewController 的子类)

带有 kCLLocationAccuracyBestForNavigation 的 CLLocationManager 不是很准确

CLLocationManager:有啥方法可以使用 requestAlwaysAuthorization 并且仍然有蓝条?

CLLocationManager 提供旧位置。如何获得新位置?