我们可以检测用户是否通过主页按钮或锁定按钮而没有收听达尔文通知吗?

时间:2017-05-19 13:09:52

标签: ios swift xcode

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

基本上,我的应用需要知道用户如何离开我的应用。无论是按下主页按钮,锁定按钮,通过点击另一个应用程序的通知等离开应用程序,有没有办法实现这一目标?我开始调查,看看我的应用程序是否在后台运行,也许我们可以检查应用程序状态来弄清楚。就我而言,我想知道是否有人对此有更深入的了解

2 个答案:

答案 0 :(得分:14)

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

据我所知,目前这是检测用户是否通过主页按钮或锁定按钮的唯一方法(我不相信这可以在模拟器上运行,你必须在实际的手机上试试)。 / p>

此委托内部(并且仅在此委托中调用时才有效)

func applicationDidEnterBackground(_ application: UIApplication) {

}

您可以在此处调用此小片段:

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
    }
}

<强>说明

当用户离开锁定按钮而不是主页按钮时,Apple似乎只允许您从applicationDidEnterBackground更改屏幕亮度。因此,我们的想法是以微不足道的数量更改屏幕亮度,并检查它是否能够更改。这看起来有点像hacky但我听到这实际上是按预期工作的。至于测试它似乎100%的时间都在工作。除了真正想要改变屏幕亮度的用户之外,我找不到任何问题。我希望别人能找到一些不那么笨拙,更具体的东西。

答案 1 :(得分:1)

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

这是真的com.apple.springboard.lockstate不能再使用了,被认为是私密的。

您可以通过几种方法检测用户是否已离开应用程序:

applicationWillResignActive:

  

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

<强> applicationWillEnterForeground:

  

转换出背景状态时调用

<强> applicationDidEnterBackground:

  

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

这些功能都没有告诉您用户如何离开应用程序,但applicationWillResignActive除了告诉您应用程序即将从某些类型的临时中断从活动状态变为非活动状态。