在越狱设备上使用后台程序时未调用 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的主要内容,如果未能解决你的问题,请参考以下文章
Qt TextField 在 Android 设备上启动时未调用键盘
应用程序退出时未调用 FirebaseMessagingService onMessageReceived(不在后台)
后台任务运行时未调用 iOS applicationWillEnterForeground 和黑屏