7

我的 Iphone 应用程序有 2 种模式,在线模式和离线模式。如果用户在在线模式下使用应用程序,请求会立即提交到服务器。如果用户在离线模式下使用应用程序,我会将请求存储在本地,以便在互联网可用时上传。我正在使用可达性类来检查互联网可用性。可达性适用于应用程序。我无法实现以下场景。当用户在离线模式下工作时,我已经存储了请求,这意味着用户将通过单击 iPhone 中的主页按钮在后台推送应用程序。一段时间后,用户将激活其设备中的 wifi 或蜂窝连接。当用户启用互联网连接时,我在后台的应用程序应该得到通知并应该开始向服务器提交请求。我怎样才能实现这个功能?许多 ios 应用程序可能具有相同的此要求。他们是怎么做的?任何想法?

我尝试了以下步骤来实现这一目标,但没有成功。我在这里做错了什么,帮助我。

1) 我在 applicationDidEnterBackground 委托方法中添加了 kReachabilityChangedNotification 的观察者。但我的应用程序无法通过这种方法收听 Kreachabilychagednotification。

2) 如果我在 applicationdidbecomeActive 中添加 kReachabilityChangedNotification 的观察者,那么我的应用程序能够监听 Kreachabiliychagednotification。

为什么 IOS 不允许在应用程序处于后台时侦听 Kreachabilychagednotification?

4

2 回答 2

4

答案是你不能,除非你的应用程序将具有这些特定用途之一(引用 Apple doc):

对某些类型的后台执行的支持必须由使用它们的应用程序提前声明。应用程序使用其 Info.plist 文件声明对服务的支持。将 UIBackgroundModes 键添加到 Info.plist 文件中,并将其值设置为包含以下一个或多个字符串的数组:

*音频——应用程序在后台向用户播放有声内容。(此内容包括使用 AirPlay 的流式音频或视频内容。)
*位置 - 该应用程序让用户随时了解他们的位置,即使它在后台运行时也是如此。
*voip——该应用程序使用户能够使用互联网连接拨打电话。
*newsstand-content - 该应用程序是一个 Newsstand 应用程序,可在后台下载和处理杂志或报纸内容。
*external-accessory - 该应用程序与需要通过外部附件框架定期提供更新的硬件附件配合使用。
*bluetooth-central——该应用程序与需要通过核心蓝牙框架定期提供更新的蓝牙配件配合使用。
*bluetooth-peripheral - 该应用程序通过 Core Bluetooth 框架支持外围模式下的蓝牙通信。

您只能再次重新进入前台检查可达性。

于 2013-08-07T06:46:46.457 回答
1

当我在一个项目中时,我开始处理相同的场景,但我开始知道默认情况下,在后台状态应用程序只停留很短的时间,大多数应用程序很快就会进入暂停状态。这意味着应用程序在后台,但没有执行代码。因此,您的自定义实施通知不起作用。必须在应用委托方法中的唤醒时间重新查询 NetworkReachability:

applicationWillEnterForeground:
applicationDidBecomeActive 

这是我为解决这个问题所做的最好的事情,希望它有所帮助

于 2013-08-07T06:45:06.260 回答