1

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

为此,我使用 UIApplicationDelegate 的方法:

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

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

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

解决方案查找在帖子上查看我自己的答案

4

3 回答 3

2

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

于 2012-06-06T14:27:16.247 回答
1

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

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

于 2012-06-14T06:50:02.187 回答
0

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

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

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

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

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

于 2012-06-14T14:04:16.203 回答