从应用程序获取位置:handleActionWithIdentifier:forRemoteNotification:completionHandler:

时间:2014-12-11 16:53:00

标签: ios geolocation apple-push-notifications

是否可以从

获取位置
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler 
像YO一样吗?

或者我应该使用位置注册背景,定期获取位置,将其保存在首选项中,然后通过上述方法发送?

1 个答案:

答案 0 :(得分:0)

您无法从handleActionWithIdentifier方法获取该位置。该方法的目的是处理用户点击推送通知的选项菜单中的按钮的情况。

如果您想获得用户的位置,您需要获得许可,这就是您在plist中放入其中一个位置键的原因。可以注册推送通知但不启用位置服务,这就是您无法获得上述位置的原因。

如果您的应用有必要,您可以遇到3种可能的情况:

  1. 用户会在应用程序外部(即在后台)收到推送通知,点按选项,然后点按打开应用程序的按钮。如果您需要在这种情况下获取位置,那么您需要注册后台获取。否则,在下次打开应用程序(谁知道何时)之前,操作将不会运行,并且位置可能已更改。推送通知包需要包含必要的指示符,以便让应用知道有可用的内容。即使不存在可用内容的情况,它仍然会让您有机会在后台运行代码,例如获取位置并使用它执行某些操作。这是您需要在后台注册位置更新的唯一情况(使用NSLocationAlwaysUsageDescription作为plist中的键)。

  2. 用户在应用程序外部(即在后台)接收推送通知,点击打开或点击选项,然后点击打开应用程序的按钮。在这种情况下,您不需要后台获取。如果用户点击了选项菜单中的按钮,则会在App Delegate中调用handleActionWithIdentifier,这样您就有机会从位置管理器获取该位置。如果用户点击了“打开”按钮,将在App Delegate中调用didReceiveRemoteNotification,您将再次有机会。

  3. 用户在应用处于活动状态时收到推送通知。在这种情况下,将在App Delegate中调用didReceiveRemoteNotification,您再次有机会从位置管理器获取位置。

  4. 注意:这假定用户至少下载并打开了一次应用程序。这将使您有机会设置位置管理器(并要求用户许可)。

    另请注意:如果您需要在应用处于后台时处理第一种情况,则需要考虑一些挑战。当用户强制关闭应用程序时(由于有些人认为这会降低电池使用量,这是非常常见的),在终止之前没有机会运行任何代码。当用户收到推送通知时,它仍会显示。但是,如果用户点击选项然后点击不打开应用程序的按钮,即使您注册了后台提取,也不会运行任何代码。这是一个非常非常烦人的案例,似乎没有一个好的答案。

    希望这有帮助!