7

要求 -我正在构建一个超本地应用程序,它将根据用户的位置向用户提供优惠。在应用程序中,我可以获取他的当前位置并相应地显示优惠,但我现在需要的是根据他的位置向用户发送推送通知。所以我想找出用户的位置并根据他的位置发送报价。

我已经阅读了有关重大更改位置服务的Apple 文档,但是这个答案是说一旦应用程序被杀死,它将无法工作。

我还阅读了有关跟踪用户位置的信息,但这对我不起作用。我在后台收到的更新不超过 5 次。

我当前的代码在viewDidLoad-

if (self.locationManager == nil)
{
     self.locationManager = [[CLLocationManager alloc] init];
     self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
     self.locationManager.delegate = self;
     self.locationManager.allowsBackgroundLocationUpdates = true;
     self.locationManager.pausesLocationUpdatesAutomatically = false;
     if ([CLLocationManager authorizationStatus] != AVAuthorizationStatusAuthorized) {
         [self.locationManager requestAlwaysAuthorization];
     }
}
[self.locationManager startUpdatingLocation];

我的委托方法看起来像这样 -

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {   
   if (UIApplication.sharedApplication.applicationState == UIApplicationStateActive) {
       // Get updated data according to location
   } else {
       // Send location to server
   }
}

我的应用程序功能和我的 plist - 在此处输入图像描述 在此处输入图像描述

请提出一些合适的方法,我可以生活在1公里左右的精度。

另一种方法 -

  1. 我可以在“后台模式-后台获取”中获取用户的位置fetchNewDataWithCompletionHandler:吗?

  2. 我可以使用静默推送通知获取用户的位置application:didReceiveRemoteNotification:fetchCompletionHandler:吗?):根据这个答案不可能

4

2 回答 2

2

所以,你的问题基本上是“我怎样才能绕过 Apple 专门为想要让我的应用程序关闭的人设计的用户交互?” 答案是“如果你想遵守 AppStore 的规则,那就不行”。

听着,如果用户决定终止您的应用程序(即他们向上滑动并退出任务管理器),此设计的全部目的是让您的应用程序停止执行任何操作。Apple 设计了这一点,以便人们可以快速关闭您似乎想要实施的那种行为。我不太明白你为什么要规避这一点。我同意这种交互可能有点模糊(毕竟,用户也可以允许/禁止应用在设置应用的后台接收位置更新的权利),但这是 iOS 定义的交互。

如果我理解正确,您成功地正确设置了后台位置模式,因此即使您的应用程序不在前台(即在后台或暂停,在后一种情况下 iOS 会短暂唤醒它),您的应用程序也可以接收位置更新,所以您可以处理位置更新,例如发送本地通知以通知用户)。这是最好的。

哦,不要害怕设备重启。是的,重启后你的应用程序在技术上没有运行,但由于用户上次没有明确杀死它,iOS 将它视为处于暂停模式,IIRC,所以你仍然会得到重要的位置更新并且可以正确反应. (以更一般的方式:人们似乎经常认为实际的应用程序进程状态反映了文档中定义的应用程序状态和/或应用程序是否显示在任务管理器中与之相关联。两者都不是完全正确。)


在您的评论专门询问我有关背景获取的问题后进行编辑:

抱歉,这可能并不完全清楚。我没有具体回答这个子问题,因为在用户故意退出您的应用程序后,您不应该像解释的那样“欺骗”他们的意图。因此,静默推送通知将不起作用,是的。

我不知道后台获取是否会以类似的方式被抑制(可能是,但我没有尝试过),但我认为这对你也无济于事,即使它仍在工作(我怀疑,Apple 可能会对此采取强硬措施)。我也从未尝试过(重新)以这种方法开始位置更新,所以我不能说这是否有效(一旦调用完成处理程序,系统可能至少会再次暂停你的应用程序,我不确定这“重置”了系统似乎用于决定唤醒哪个应用程序并将位置更新传递到的“用户杀死应用程序标志”)。

application:performFetchWithCompletionHandler:(因为它被完全调用)将由操作系统基于启发式调用,它试图对此“聪明”。由于该方法旨在从不提供推送通知的后端获取一些数据,因此它被调用的时间可能会受到严格限制,如文档中所述。决定操作系统何时调用的实际机制是一个黑匣子,试图诱骗它在需要时被调用是一场赌博。这很可能会在数小时后发生。考虑以下场景:

  • 您的应用程序在后台定位模式下运行良好(我理解正确,因为您成功设置了它?请参见此处此处
  • 用户手动杀死您的应用程序。为了这个论点,让我们假设不会阻止系统稍后重新启动它来给它一个后台获取机会
  • 由于系统上正在运行其他应用程序并且用户目前只有边缘连接,因此操作系统认为现在是启动后台获取的不好时机(我在这里假设这些因素发挥了作用,正如所说的那样,它是一个黑匣子,但这些对我来说似乎是合理的)。您的用户会多走一些路,绕过您可能感兴趣的几个位置。
  • 两个小时后,用户现在处于一个完全不同的区域,您的应用程序再次由操作系统启动并接到application:performFetchWithCompletionHandler:电话。您再次开始位置更新(假设即使工作正常并且系统不会立即再次终止应用程序,即即使在虚假后台获取之后它也会在后台提供位置更新)。您错过了几个位置,但该应用程序现在可以处理新位置。你所有的逻辑基本上都搞砸了,因为你没有计划丢失这么多位置更新......
  • (可选:一段时间后,您的用户意识到您的应用显然做了一些事情,即使他们终止了它(例如他们注意到电池耗尽)。他们将删除您的应用并留下一个开始的评论......)
  • (可选的 2,最坏的情况:一旦苹果意识到可以在用户以这种方式杀死应用程序后重新启动后台位置更新,他们只需关闭 iOS 更新中的漏洞,您的应用程序就会回到我们开始的地方。 ..)

郑重声明:我不是为苹果做出的任何设计决定辩护,我知道这会让你感到困惑,就像一个人可以代表“在所有情况下保护电池和用户意图”一样,一个人可以为更好的背景跟踪。我只是指出他们在这里可以控制,并且试图绕过他们在平台上设置的任何特定交互范例可能不是一个好主意。

话虽如此,恐怕“用户终止了应用程序,现在我不会得到任何位置更新”只是您必须忍受的事情。考虑到您没有说背景定位模式对您来说不够用,为什么这对您来说甚至是个问题?我能想象的唯一(有问题的)场景是一种跟踪器应用程序,可能在分发给送货服务或其他东西的员工的设备上提供。如果是这样(抛开这些东西背后的道德规范,在某些国家甚至是非法的,请注意......),我不得不说 iOS 根本不是正确的平台。

于 2017-04-18T08:01:33.913 回答
-2

您好,只需使用您的详细信息创建一个集合,最重要的是在您输入添加属性UILocalNotification时触发通知,请参阅文档Regionregion

希望能帮助到你

于 2017-04-13T07:37:04.337 回答