【问题标题】:Back to app button handler返回应用程序按钮处理程序
【发布时间】:2017-11-25 15:00:51
【问题描述】:

以编程方式将用户发送到设置屏幕后,左上角有一个返回应用按钮:

点击此按钮可让用户返回我的应用。但是,此时 Application 调用它的委托时使用的方法与我们从后台返回时所调用的方法相同:

applicationWillEnterForeground

applicationDidBecomeActive

同时,我需要区分用户是通过点击这个特定的“返回应用程序”按钮,还是通过以任何其他方式将应用程序发送到后台后简单地进入应用程序来区分用户是否返回应用程序。这有可能吗?

【问题讨论】:

  • 如果您“以编程方式将用户发送到设置屏幕”,您不能在此之前简单地在您的应用中设置一个标志吗?然后在applicationDidBecomeActive 中检查。
  • @dfd 用户可以离开设置并在以后随时返回应用程序。然后标志仍然设置为 true,而它不应该再设置了
  • 我认为你的要求应该用@dfd评论中提到的方式来满足。

标签: ios cocoa-touch uiapplicationdelegate


【解决方案1】:

我相信,默认是没有办法区分的。

我的建议是,如果您关注特定设置条目的更改,只需将新设置的值与 applicationDidBecomeActive 中的旧设置值进行比较。如果有变化,那么您可以区分流程。但是,如果没有变化,你就不能。

【讨论】:

  • 不幸的是,这个解决方案对我不起作用,因为我将用户发送到自动锁定设置,而据我所知,这些设置无法从代码中读取......
【解决方案2】:

您是否开发了两个想要以这种方式连接的应用程序?

离开应用的方式远比您描述的要多:

  1. 用户点击主页按钮一次
  2. 用户点击主页按钮两次
  3. 当应用仍在前台时,用户按下电源按钮
  4. 在支持 3D 触控的设备上,用户在前沿进行 3D 触控。
  5. 用户使用您描述的“返回应用程序”的东西
  6. 用户收到通知并选择弹出它
  7. 用户从通知转到其他应用
  8. 用户打开通知中心并在那里执行操作
  9. 用户打开控制中心并在那里执行一些操作
  10. 用户在您的应用中使用共享功能或超链接可以触发其他应用。

我可能会错过某事,但我创建的这个列表是为了表明,区分这个动作可能非常困难。即使您会处理其中一个动作,也不一定会处理所有其他动作。

如果您能详细说明您的用例或您要解决的问题,将会有所帮助。

【讨论】:

  • 我正在开发的应用程序的要求包括一个允许用户更改自动锁定时间的流程(它最初是在 Android 上开发的,显然您可以通过代码执行此操作)。显然,没有选项可以完全像在 Android 上那样执行此操作,所以我的想法是以编程方式将用户发送到设置屏幕。但是还有另一个要求——每次我们回到应用程序时,我们都应该回到开始屏幕,因为其他屏幕可能包含机密数据。但在上述场景中,我不想回到开始屏幕,而是回到应用设置屏幕。
  • 在这种情况下,您可以在用户移动到设置屏幕之前将用户移动到开始屏幕。这样你就可以实现你的目标。
  • +1 @JayeshSojitra 评论。 user381248 - Android ports 永远不会 100%。更糟糕的是,至少对我(可能还有其他人)而言,您从未在您的问题中提出此类细节。请,这属于你的问题的一部分! (不是 Android 部分 - 这可以提供帮助 - 但需要在 将 iOS 用户发送到“设置”后返回主屏幕。这非常重要。)
【解决方案3】:

我会建议一个通用的解决方案来解决检测不同启动选项的类似问题(我们的应用如何处于活动状态(运行))

斯威夫特 2.3

在 AppDelegate 中

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

if let options = launchOptions{

print(options.description)

//These options will give the difference between launching from background or from pressing the back button

if (launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] != nil) {

//this indicates the app is launched by pressing Push notifications
}else if (launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] != nil) {

//This indicates the app is launched on tapping the local notifications

}else if (launchOptions?[UIApplicationLaunchOptionsSourceApplicationKey] != nil){

//This indicates the App launched from a valid source e.g: on tap of Open App from App Store when your App is installed or directly from home screen

}
}

}

参考: Apple 文档提供了所有可以检测到的可用启动选项

https://developer.apple.com/documentation/uikit/uiapplicationdelegate/launch_options_keys

通过添加观察者来使用委托协议方法的力量

https://developer.apple.com/documentation/uikit/uiapplicationdelegate

Swift 3 等效项:

    //adding observer

        NotificationCenter.default.addObserver(self,
            selector: #selector(applicationDidBecomeActive),
            name: .UIApplicationDidBecomeActive,
            object: nil)

 //removing observer

        NotificationCenter.default.removeObserver(self,
            name: .UIApplicationDidBecomeActive,
            object: nil)

 // callback

         func applicationDidBecomeActive() {
            // handle event
        }

StackOverFlow 中的类似问题,我可以帮助您:

Detect when "back to app" is pressed

How to detect user returned to your app in iOS 9 new back link feature?

Detect if the app was launched/opened from a push notification

Checking launchOptions in Swift 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多