【问题标题】:Can we detect whether a user left through the home button or lock button without listening to darwin notifications?我们是否可以检测用户是否在不听 darwin 通知的情况下通过主页按钮或锁定按钮离开?
【发布时间】:2017-05-19 13:09:51
【问题描述】:

我最近向应用商店提交了一个新的二进制文件并将其发送以供审核,但立即被拒绝并显示以下消息。 “不支持的操作 - 不允许应用收听设备锁定通知。”。经过一番挖掘,我发现我们不能使用“com.apple.springboard.lockstate”来确定锁定状态。

本质上,我的应用需要知道用户是如何离开我的应用的。无论是按下主页按钮,锁定按钮,通过点击另一个应用程序的通知离开应用程序等等。有没有办法实现这一点?我开始调查我的应用程序是否要在后台运行,也许我们可以检查应用程序状态以找出答案。据我所知,我想知道是否有人对此有更多见解

【问题讨论】:

  • 我怀疑这是否可能以合法的方式(您可以通过多种不同的方式离开应用程序......)我会回顾您的需求来源。用户如何从中受益,您如何以另一种方式将其提供给用户?你能解释一下你正在解决的潜在用户问题吗?我们也许可以帮助解决这个问题。
  • 该应用程序是一款生产力应用程序,它挑战用户留在我们的应用程序上。因此,能够知道用户如何离开我们的应用程序至关重要,因为如果用户留在我们的应用程序上并且只按下锁定按钮,那么从技术上讲,该人仍在我们的应用程序上。但是,如果按下主页按钮或不按什么,他们将离开我们的应用程序,这将结束挑战或其他什么。
  • 我相信(并且很长时间没有测试过,但我认为这是真的)在锁定按钮的情况下不会调用applicationDidEnterBackground。实际上,我希望您认为无效的所有情况都会调用applicationDidEnterBackground,而您认为非无效的情况(例如接听电话)只会调用applicationWillResignActive。你将不得不测试;我已经好几年没有探索过它的细节了。
  • @RobNapier 不幸的是,即使按下锁定按钮也会调用 applicationDidEnterBackground。
  • @TPN1994 知道这一点并不能解决您的问题。用户可以从锁定屏幕导航到应用(通过通知、相机、今日小部件等),您的应用将永远不会被重新激活。

标签: ios swift xcode


【解决方案1】:

在搜索了苹果的文档并挖掘了大量线程之后,我想我可能偶然发现了解决方案。

据我所知,这是目前检测用户是通过主页按钮还是锁定按钮离开的唯一方法(我不相信这在模拟器上有效,您必须在实际手机上尝试)。

在这个委托内部(并且只有在这个委托中调用它才会起作用)

func applicationDidEnterBackground(_ application: UIApplication) {

}

你可以在这里调用这个小sn-p:

func DidUserPressLockButton() -> Bool {
    let oldBrightness = UIScreen.main.brightness
    UIScreen.main.brightness = oldBrightness + (oldBrightness <= 0.01 ? (0.01) : (-0.01))
    return oldBrightness != UIScreen.main.brightness
}

用法:

func applicationDidEnterBackground(_ application: UIApplication) {
    if (DidUserPressLockButton()) {
        //User pressed lock button
    } else {
        //user pressed home button
    }
}

解释:

当用户通过锁定按钮而不是主页按钮离开时,苹果似乎只允许您从applicationDidEnterBackground 更改屏幕亮度。所以这个想法是用微乎其微的量改变屏幕亮度并检查它是否能够改变。这看起来有点老套,但我听说这实际上是按预期工作的。就测试而言,它似乎 100% 的时间都在工作。除了确实想要更改屏幕亮度的用户之外,我找不到任何问题。我希望其他人能找到一些不那么老套和更具体的东西。

【讨论】:

  • 如果用户通过接听电话离开应用程序会怎样?
  • @Andrej 您可以导入 CoreTelephony 并查看电话是否已接听/接听/拒绝......等
  • 我在将亮度设置为 0.0099 时遇到问题,所以我想出了自己的版本。只需在AppDelegate 的课堂上调用didEnterBackgrounddidBecomeActive,它应该可以工作:gist.github.com/andrewcampoli/2b1f748fecf42288cc09f10a72485b36
  • 当我在我的应用程序中使用它时,它可以完美运行,但是如果按下锁定按钮然后用户回到他们的手机,当他们解锁它时亮度几乎设置为 0。解锁后亮度恢复正常。不是大问题,但有点烦人。
  • 这似乎不再是检测按下哪个按钮的有效解决方案。亮度是从 0 到 1 的范围,因此条件检查将不正确。这将导致永远不知道是否按下了锁定按钮。
【解决方案2】:

这不能以 Apple 接受的方式完成,换句话说,Apple 未明确记录的任何通知密钥都被视为私有 API。

确实,com.apple.springboard.lockstate 不能再使用,并且被视为私有。

您有几种方法可以检测用户是否离开了应用程序:

applicationWillResignActive:

当应用程序即将从活动状态变为非活动状态时发送 状态。某些类型的临时中断可能会发生这种情况 (例如来电或短信)或用户退出时 应用程序并开始转换到后台状态。

applicationWillEnterForeground:

退出后台状态时调用

applicationDidEnterBackground:

使用该方法释放共享资源,保存用户数据, 使计时器无效,并存储足够的应用程序状态信息以 将您的应用程序恢复到当前状态,以防它被终止 稍后。

除了applicationWillResignActive 之外,这些函数都不会告诉您用户是如何离开应用程序的,它会告诉您应用程序即将从活动状态变为非活动状态以应对某些类型的临时中断。

【讨论】:

  • 我不得不不同意,我实际上已经在应用商店中看到了一些能够做到这一点的应用(并且是在苹果开始拒绝收听达尔文通知的应用之后发布的) .
  • @TPN1994 - 你能提供几个这样的应用程序的例子吗?
  • @BonanzaDriver 当然!我不确定它是否允许在 SO 上链接应用程序,但在我脑海中完成此任务的应用程序的名称将是 Seekrtech 的“Forest”
  • @TPN1994,当然可能有,但如果您使用未记录的通知字符串,您的申请将被拒绝。当然,可能有一些黑客可以检查这一点,但如果苹果会让你这样做,那么就会有一些内置功能。希望他们不会因为您在答案中添加的黑客而拒绝您的应用程序。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多