在越狱设备上使用后台程序时未调用 UIApplicationDelegate

Posted

技术标签:

【中文标题】在越狱设备上使用后台程序时未调用 UIApplicationDelegate【英文标题】:UIApplicationDelegate not called when using Backgrounder on a jailbroken device 【发布时间】:2012-06-06 13:21:43 【问题描述】:

我遇到了一些问题。 我的软件需要知道应用程序何时处于后台,以便与服务器断开连接,并开始接收推送通知。

为此,我使用 UIApplicationDelegate 的方法:

- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidEnterBackground:(UIApplication *)application
- (void)applicationWillEnterForeground:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application
- (void)applicationWillTerminate:(UIApplication *)application

问题是,当越狱设备使用称为后台程序的“调整”时,这将迫使您的应用程序保持活动状态而不进入后台,当我们单击 HOME 按钮时,不会调用 UIApplicationDelegate 的任何方法。

问题是,通过 SSL 连接的每个客户端都在服务器上花费了我很多内存。我真的不在乎设备是否越狱,或者事实上,应用程序将在设备上无限期地运行。但是当应用程序不再出现在屏幕上时,我希望他们与服务器断开连接,但我似乎找不到任何方法可以在安装后台程序时通知我此类操作。

解决方案查找:check my own answer on the post

【问题讨论】:

【参考方案1】:

最好的办法是消耗大量内存,这样越狱者将不得不退出您的应用程序!当然只是开玩笑。最好的选择是等待用户不活动。例如: 1. 检查设备是否越狱。 2.检查是否安装了后台程序(我不确定你是否可以这样做,但我很确定你可以)。 3. 如果用户是所有这些东西等待他们​​处于非活动状态,比如说 30 秒,然后断开与服务器的连接。

【讨论】:

我真的在考虑第一个想法 ;-) 但是,我认为您的第三个解决方案现在似乎更容易,只是如果应用程序在屏幕上,我想保持连接.用户可能有理由让应用程序在屏幕上打开,如果是这样,它应该保持连接。如果我设置了一个计时器,即使应用程序在屏幕上,它也会断开用户的连接,不幸的是,这不是一个选项! 好像没有其他解决办法了...如果一段时间没有交互(屏幕上的任何触摸),我会在一段时间后断开用户的连接... 【参考方案2】:

在安装 Backgrounder 时,或仅当您的应用程序转换到后台时,您的应用程序中根本不会调用这些方法吗?如果它们根本没有被调用,那么解决方案非常简单:设置一个定时器,例如 10 秒,当你的应用程序的 application:didFinishLaunchingWithOptions 方法被调用时,当该定时器到期时,如果 applicationDidBecomeActive: 没有被调用,那么你就知道用户正在使用Backgrounder。

如果他们确实在应用启动时被调用,那么事情就会变得更加棘手。我不知道有任何直接方法可以检测是否从沙箱中安装了像 Backgrounder 这样的调整。您可以简单地检查设备是否越狱(有很多方法可以做到这一点,它们应该很容易找到),如果是,则为您的服务器连接添加超时时间。

【讨论】:

不幸的是,它们确实在启动时被调用...仅在过渡到后台时,它们被捕获到某个地方并且没有分发到应用程序...关于第二部分,如果设备越狱,这并不意味着后台程序存在并配置为保持应用程序打开。 啊,太糟糕了。我知道越狱设备并不一定意味着他们安装了 Backgrounder,但我的观点是这可能是一个合适的折衷方案,至少可以将您的用户群过滤到可能实际安装了 Backgrounder 的那些人。或者,您可以尝试使用您的UIWindow 并收听UIWindowDidBecomeHiddenNotification 之类的通知-Backgrounder 可能会在转换到后台时隐式导致应用程序的窗口隐藏。 哦,哎呀,我看到你现在有了一个实际的解决方案。不错:) +1。感谢您的回答和跟进!是的,当我在寻找一种方法来检查应用程序中的触摸事件时,我找到了一个解决方案,我已经跟踪了这个通知。似乎这是一个很好的解决方案,即使现在我必须携带一个 BOOL 属性来知道应用程序是否在后台,但这是一个很小的代价,以便在服务器上获得大量内存;- )【参考方案3】:

奶茶让我走上了正轨……所以赏金给了他。

但实际上我有一个更好的解决方案... 我已经检查了退出应用程序时抛出的每一个通知...

我明白了,即使后台程序配置为保持应用程序打开,这些通知也会被抛出:

UIApplicationSuspendedEventsOnlyNotification -- When going into background
UIApplicationResumedEventsOnlyNotification   -- When going into foreground

这是有道理的,因为即使使用后台程序,让应用程序继续接收事件通知也是一个坏主意,例如,当在应用程序外部进行旋转(或摇晃)更改时。您是否想象每次移动 iPhone 时每个 App 都会在背景上旋转?

【讨论】:

以上是关于在越狱设备上使用后台程序时未调用 UIApplicationDelegate的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在后台时未触发 iOS 本地通知

Qt TextField 在 Android 设备上启动时未调用键盘

应用程序退出时未调用 FirebaseMessagingService onMessageReceived(不在后台)

后台任务运行时未调用 iOS applicationWillEnterForeground 和黑屏

使用 WatchOS 应用程序时未调用 viewDidLoad

苹果手机为啥越狱完就不能连接L2TP