我们可以检测用户是否通过主页button或lockingbutton而不听达尔文通知?

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

本质上,我的应用程序需要知道用户如何离开我的应用程序。 无论是按Home键,lockingbutton,通过另一个应用程序的通知,等离开应用程序。有没有办法实现这一目标? 我开始调查,看看我的应用程序是否在后台运行,也许我们可以检查应用程序的状态来弄清楚。 就我所知,我想知道是否有人对此有所了解

通过从苹果的文件search和挖掘了大量的线程,我想我可能会偶然发现解决scheme。

据我所知,这是目前唯一的方法来检测用户是否通过主页button或lockingbutton(我不相信这在模拟器上工作,你必须尝试在实际的电话)。

在这个委托内部(只有在这个委托中调用时才有效)

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

说明:

看来苹果公司只允许你在用户离开lockingbutton而不是主页button的时候改变applicationDidEnterBackground的屏幕亮度。 所以这个想法是用一个小小的量来改变屏幕的亮度,并检查它是否能被改变。 这似乎有点hacky,但我听说 ,这实际上按预期工作。 至于testing它似乎是100%的时间工作。 除了那些真正想要改变屏幕亮度的用户之外,我找不到任何问题。 我希望别人可以find一些不那么古怪,更具体的东西。

换句话说,苹果公司不会接受它,换句话说,没有被苹果明确logging的任何通知密钥都被认为是私有API。

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

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

applicationWillResignActive:

当应用程序即将从活动状态转移到非活动状态时发送。 对于某些types的临时中断(例如来电或SMS消息)或用户退出应用程序并开始转换到后台状态时,可能会发生这种情况。

applicationWillEnterForeground:

在转换出背景状态时调用

applicationDidEnterBackground:

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

这些function中没有一个告诉你用户如何离开应用程序,除了applicationWillResignActive ,它告诉你应用程序即将从某种types的临时中断处于活动状态变为非活动状态。