已停用 iOS 应用程序上的地理位置

Posted

技术标签:

【中文标题】已停用 iOS 应用程序上的地理位置【英文标题】:Geolocation on deactivated iOS application 【发布时间】:2012-07-30 20:24:45 【问题描述】:

是否可以在应用程序关闭时为其添加位置感知功能?

例如,我想创建一个接近服务,该服务在我的应用程序关闭时工作,并在用户到达某个区域时向用户推送本地通知。

我读到使用 CLRegion 可以实现类似的结果,但只有在应用程序处于活动状态(或在后台)时才能实现。

我需要类似于由用户位置激活的远程通知服务。但这听起来真的很奇怪。是否有可能在 ios 中提供类似的服务?

【问题讨论】:

【参考方案1】:

有两种选择:

其中一个是 John 上面提到的重大位置变更服务。 另一个是startRegionMonitoring

两者都包含在来自 Apple 的 Location Awarness Documentation 中

两者都可以在短时间内打开已终止(关闭)的应用程序,并且您可以发送本地推送通知以提醒用户。 应用无法进入正常状态,但如果用户点击通知,应用就会打开,这样就可以达到你的目的。

这里是拦截 didFinishLaunchingWithOptions 委托中的事件并触发本地通知的示例代码。 通常,您不应在此处触发通知,而是重新初始化您的位置管理器,获取新位置并显示用户输入区域的消息(本地通知)...

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    //see if application was launched from a location event!
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) 
        //if so, we need to reinitialize our location manager!
        [[LocationManager sharedLocationManager] startSignificantLocationMonitoring];
        //fire a notification

        UILocalNotification *notification = [[UILocalNotification alloc] init]; 
        notification.fireDate = [NSDate date]; 
        NSTimeZone* timezone = [NSTimeZone defaultTimeZone]; 
        notification.timeZone = timezone; 
        notification.alertBody = @"app did wake up"; 
        notification.alertAction = @"OK"; 
        notification.soundName = @"yes.caf"; 
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];

    

【讨论】:

您确定“终止”状态吗?我的意思是,在文档中我只能找到对“暂停”状态的引用(这并不意味着“关闭”应用程序。你能添加一个链接吗? 是的。事实上,我已经测试了两者。我认为 startMonitoringSignificantLocationChanges 更好,因为它没有区域监控选项的限制(跨 iOS 共享位置,您可以监控的区域的最大限制未知但可用。 iOS 7.0 似乎有这个问题,在 iOS 7.1 上解决了 macrumors.com/2014/02/11/ios-71-fixes-location-apps 您能否澄清一下您的示例中的 [LocationManager sharedLocationManager] 是什么?此外,我的 didFinishLaunchingWithOptions 方法包含其他代码来激活窗口和视图。我应该在位置激活时跳过它吗?【参考方案2】:

我相信您可以使用重要更改 API 来唤醒已被系统关闭(或崩溃)的应用。但是您仍然应该研究区域监控,因为它可能更接近您真正想要的。

这是链接: http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW25

及相关部分:

如果应用程序在发生更新时暂停,系统会在后台将其唤醒以处理更新。如果应用程序启动此服务然后终止,系统会在新位置可用时自动重新启动应用程序。此服务在 iOS 4 及更高版本中可用,并且仅在包含蜂窝无线电的设备上可用。

当您设置您的 CLLocationManager 时,只需调用

- (void)startMonitoringSignificantLocationChanges

并以典型方式作为委托回调处理任何事件

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

请注意,如果应用程序被终止,您还将收到对应用程序委托完成启动方法的回调。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

我也很确定,在这种情况下,回调将包含一个标志,通知您它是由于位置更新而启动的。

【讨论】:

【参考方案3】:

我认为您无法通过 iOS 中的封闭应用程序执行任何操作。您可以从后台(非活动状态)做非常有限的事情,但我不知道您可以从关闭的应用程序中做任何事情。我真的不知道一个应用程序在不运行时可以做什么;-)。

【讨论】:

我希望有一种基于位置服务的远程推送通知(我知道……这听起来很奇怪:P) 并不奇怪,只是不可能。每个人都愿意做你所说的事情,但在我们有生之年不会发生在苹果产品上。对不起。

以上是关于已停用 iOS 应用程序上的地理位置的主要内容,如果未能解决你的问题,请参考以下文章

用户在Android应用中停用位置权限时的广播接收器?

应用内购买“创建”按钮已停用 iOS 应用内购买创建

iPhone - iOS5:phonegap 上的地理位置

如果 iOS 注册了 UIBackgroundModes 的位置,iOS 会唤醒已终止的应用程序吗?

Django JWT 令牌停用

带有地理位置网站的 Flutter iOS webview 应用程序不会询问位置权限,即使 info.plist 已调整