是否可以从
获取位置- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
像YO一样吗?
或者我应该使用位置注册背景,定期获取位置,将其保存在首选项中,然后通过上述方法发送?
答案 0 :(得分:0)
您无法从handleActionWithIdentifier
方法获取该位置。该方法的目的是处理用户点击推送通知的选项菜单中的按钮的情况。
如果您想获得用户的位置,您需要获得许可,这就是您在plist中放入其中一个位置键的原因。可以注册推送通知但不启用位置服务,这就是您无法获得上述位置的原因。
如果您的应用有必要,您可以遇到3种可能的情况:
用户会在应用程序外部(即在后台)收到推送通知,点按选项,然后点按不打开应用程序的按钮。如果您需要在这种情况下获取位置,那么您需要注册后台获取。否则,在下次打开应用程序(谁知道何时)之前,操作将不会运行,并且位置可能已更改。推送通知包需要包含必要的指示符,以便让应用知道有可用的内容。即使不存在可用内容的情况,它仍然会让您有机会在后台运行代码,例如获取位置并使用它执行某些操作。这是您需要在后台注册位置更新的唯一情况(使用NSLocationAlwaysUsageDescription作为plist中的键)。
用户在应用程序外部(即在后台)接收推送通知,点击打开或点击选项,然后点击打开应用程序的按钮。在这种情况下,您不需要后台获取。如果用户点击了选项菜单中的按钮,则会在App Delegate中调用handleActionWithIdentifier
,这样您就有机会从位置管理器获取该位置。如果用户点击了“打开”按钮,将在App Delegate中调用didReceiveRemoteNotification
,您将再次有机会。
用户在应用处于活动状态时收到推送通知。在这种情况下,将在App Delegate中调用didReceiveRemoteNotification
,您再次有机会从位置管理器获取位置。
注意:这假定用户至少下载并打开了一次应用程序。这将使您有机会设置位置管理器(并要求用户许可)。
另请注意:如果您需要在应用处于后台时处理第一种情况,则需要考虑一些挑战。当用户强制关闭应用程序时(由于有些人认为这会降低电池使用量,这是非常常见的),在终止之前没有机会运行任何代码。当用户收到推送通知时,它仍会显示。但是,如果用户点击选项然后点击不打开应用程序的按钮,即使您注册了后台提取,也不会运行任何代码。这是一个非常非常烦人的案例,似乎没有一个好的答案。
希望这有帮助!