减小内存大小以确保在iOS中进行后台处理

Jon*_*han 7 objective-c background-process ios core-bluetooth bluetooth-lowenergy

在开发使用蓝牙低功耗的应用程序时,有一段时间iOS设备失去与外围设备的连接.(有时几个小时.)

为了重新连接到现有的外围设备,应用程序必须在一天中以特定的速率在后台持续扫描,即使应用程序背景也是如此.

问题是,由于内存限制等原因,iOS不保证您的应用不会被杀死.

"iPhone OS编程指南"中的信息表明:

如果外围设备在应用程序暂停时提供更新,则可以要求使用蓝牙外围设备的应用程序被唤醒.这种支持对于定期提供数据的蓝牙配件非常重要,例如蓝牙心率带.当应用程序在其Info.plist文件中包含带有蓝牙中心值的UIBackgroundModes键时,Core Bluetooth框架将保持打开相应外围设备的所有活动会话.此外,从外围设备到达的新数据会导致系统唤醒应用程序,以便它可以处理数据.系统还会唤醒应用程序以处理附件连接和断开连接通知.

当手机连接到设备且应用程序为后台时,不会出现此问题.但是,当设备断开连接并且应用程序处于后台时,确实会发生这种情况.在这种特定情况下,手机不再连接到外围设备,因此不再收到通知.

许多人之前已经在Stack Overflow或Apple论坛上讨论过这个问题,我相信其中一位Apple开发者已回复说:

我们已经意识到这个问题,正在努力想出一个解决方案.目前,还没有解决方法."

我的问题是,有没有办法至少提高你因内存限制而不被iOS杀死的机会?

例如,即时消息应用程序(IMO)似乎在后台运行得非常好.在没有使用数天和数天之后,应用程序将唤醒并显示gChat消息.

我在质疑诸如此类的事情

  • 强烈的指针
  • 总体内存大小
  • 应用程序后台或最小化时减小内存大小
  • 减少后台操作的频率
  • 等等.

Lom*_*baX 1

为什么即使蓝牙硬件断开连接也需要后台执行?我不认为你需要“不断重新扫描”来重新连接,如果硬件与iPhone/iPad“配对”,它会自行重新连接。就像蓝牙耳机一样。或不?

AFAIK 你没有机会完成你所要求的。当用户回到家时,普通的应用程序总是会暂停。该应用程序有大约。5 秒后台时间停止定时器,保存状态 ecc ecc。有一些特殊的后台模式可以让您有更多的后台时间,并且每种模式(在您链接的页面中进行了说明)都有不同的行为。

关于蓝牙模式:所描述的行为不是问题,但这是设计使然:

  • 该应用程序已暂停

  • 当应用程序暂停时,操作系统可以杀死它以释放内存(没有技巧可以避免这种情况),但如果需要,系统会唤醒。

  • 然后,每次收到通知时都会唤醒应用程序(从挂起状态唤醒或从“先前杀死”状态启动)

  • 该应用程序有 10 秒的时间来执行任务(保存信息、ecc ecc)。此外,可以要求+10分钟。特定任务的后台时间

  • 10 秒(或 10 分钟)后,应用程序再次暂停

您写的有关聊天应用程序的示例是不正确的:聊天应用程序通常不使用任何后台模式,只是使用推送通知向您转发消息。当您打开应用程序时,该应用程序会连接到存储所有消息的服务器并下载它。

您可以使用位置后台模式(路由应用程序可以在后台工作)或使用显着位置更改(应用程序被唤醒)和 10 分钟后台时间的组合来获得“更多正常运行时间”,但我认为 Apple 会拒绝应用程序那个“滥用”这个。

很快,您必须设计您的应用程序来支持此行为。