【问题标题】:Reducing memory size to ensure backgrounding in iOS减少内存大小以确保 iOS 中的后台
【发布时间】:2012-12-21 10:17:15
【问题描述】:

在开发使用蓝牙低功耗的应用时,iOS 设备有时会失去与外围设备的连接。 (有时几个小时。)

为了重新连接到现有外围设备,应用必须在一天中以特定速率在后台不断扫描,即使应用处于后台也是如此。

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

Information found in the iPhone OS Programming guide 声明:

使用蓝牙外围设备的应用可以在以下情况下要求唤醒 当应用程序暂停时,外围设备会提供更新。这 支持对于以 定期间隔,例如蓝牙心率带。当一个应用程序 包括带有 bluetooth-central 值的 UIBackgroundModes 键 它的 Info.plist 文件,核心蓝牙框架保持打开任何 相应外围设备的活动会话。此外,新 来自外围设备的数据导致系统唤醒应用程序 以便它可以处理数据。系统还会唤醒应用程序以 处理附件连接和断开通知。

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

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

我们已注意到此问题,并正在尝试提出解决方案。 目前,没有解决方法。”

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

例如,即时通讯应用 (IMO) 似乎在后台运行得非常好。在数日未使用后,该应用将唤醒并显示一条 gChat 消息。

我在质疑诸如

之类的事情
  • 强指针
  • 总内存大小
  • 在应用程序处于后台或最小化时减少内存大小
  • 降低后台操作频率

【问题讨论】:

    标签: objective-c ios background-process core-bluetooth bluetooth-lowenergy


    【解决方案1】:

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

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

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

    • 应用已暂停

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

    • 应用程序会在每次收到通知时被唤醒(从挂起状态唤醒或从“previous-killed”状态启动)

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

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

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

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

    简而言之,您必须设计您的应用来支持这种行为。

    【讨论】:

    • BLE 的行为与配对的 BT2.1 设备不同。您需要扫描广告数据包,然后发出连接。如果我在很长一段时间内与设备断开连接,然后进入它的接近范围,我将需要这样做。此时,扫描会发现设备的广告数据包,然后重新连接。如果应用程序本身已被杀死,则不会进行后台扫描,并且只有在您打开应用程序时才会重新连接。
    • @shred444:“BLE 的行为与配对的 BT2.1 设备不同。您需要扫描广告数据包,然后发出连接。”根据我对 iOS 的了解,可以随时终止后台应用程序的想法是非常基本的。我希望 Apple 通过让 iOS 自己扫描广告包,然后在找到它们时通知应用程序来解决这个问题。 (从你的问题来看,我认为他们还没有为低功耗蓝牙实现类似的东西。)
    • 我同意。在 Core Bluetooth Apple Dev Mailing List 上,其中一位开发人员提到:“我们已经意识到这个问题,并正在尝试提出解决方案。目前,没有解决方法。”所以希望他们实现的东西类似于你所描述的。在那之前,看起来减少强引用将有助于改善背景持续时间(见下面我的回答)
    • @shred444 ,即使应用程序没有被杀死,如果它没有运行,你将如何开始扫描?应用程序状态是:运行(不是这种情况)、后台任务(最多 10 分钟)、暂停、停止(杀死/关闭)。如果应用程序未处于已终止状态且未处于 10 分钟后台任务时间,则它已挂起 --> 您无法在挂起状态下启动任何任务。暂停状态只能由用户或由 iOS 唤醒应用程序“停止”。
    • 关于其他cmets,我不知道蓝牙低功耗的细节,我确认(AFAIK)现在没有机会,所以必须等待Apple的“补丁”:-(
    【解决方案2】:

    我在更多 Apple 文档中发现了这一点:

    后台应用程序的内存使用情况

    每个应用程序在进入时都应该释放尽可能多的内存 背景。系统尝试在内存中保留尽可能多的应用程序 尽可能同时,但当内存不足时,它终止挂起 应用程序来回收该内存。消耗大量内存的应用程序 而在后台是最先被终止的应用程序。

    实际上,您的应用应该删除强引用 不再需要的对象。去除强 引用使编译器能够正确释放对象 以便可以回收相应的内存。然而,如果 你想缓存一些对象以提高性能,你可以等待 直到应用程序在删除引用之前转换到后台 给他们。

    您应该删除强引用的一些对象示例 尽快包括:

    图像对象

    您可以从磁盘再次加载的大型媒体或数据文件 任何其他 您的应用不需要并且以后可以轻松重新创建的对象 帮助减少应用程序的内存占用,系统会自动 当您的应用移动时,清除代表您的应用分配的一些数据 到后台。

    系统清除所有核心动画层的后备存储。 这项工作不会从内存中删除应用程序的图层对象,也不会 它会改变当前图层的属性吗?它只是防止 这些图层的内容不会出现在屏幕上,因为 应用程序在后台无论如何都不应该发生。它删除任何 系统对缓存图像的引用。 (如果您的应用没有 对图像的强烈引用,随后将它们从 内存。)它删除了对其他一些系统管理的强引用 数据缓存。

    【讨论】:

    • 你可以用几句话来恢复它:如果你想有更多的机会让应用程序在挂起时不被 iOS 杀死,让它的内存占用尽可能低。需要明确的是,“减少强引用”并不意味着您需要在实例变量中避免“强”,您只需在应用程序进入后台之前将尽可能多的实例变量设置为 nil。 (以便该变量引用的内存不再有强引用-->可以释放内存)
    • (但是,请参阅我的其他 cmets,不幸的是,这对您没有帮助 :-( )
    【解决方案3】:

    从苹果文档中我一直假设如下:

    connectPeripheral:options:
    Establish a connection to the peripheral.
    
    - (void)connectPeripheral:(CBPeripheral *)peripheral options:(NSDictionary *)options;
    Parameters
    peripheral
    The peripheral to connect to.
    
    options
    A dictionary to customize the behavior of the connection. See CBConnectPeripheralOptionNotifyOnDisconnectionKey.
    
    Discussion
    **This never times out**. Use cancelPeripheralConnection: to cancel a pending connection.'
    

    重要的部分在于它永远不会超时。我认为这将移交给系统,以便它在进入范围时自动连接到外围设备,从而消除了对完整背景的需要。如果我错了,请有人纠正我!

    【讨论】:

    • This never time out 与前台应用程序有关。 iOS 杀死整个应用程序没有问题,包括后台的扫描过程
    • 你能发布一个链接或一些代码来显示问题吗?正如在另一个链接 (lists.apple.com/archives/bluetooth-dev/2011/Dec/msg00007.html) 和文档中发布的那样,scanForPeripheralsWithServices: 和 connectPeripheral: 方法由 CoreBluetooth 管理,而不是由应用程序管理,因此如果应用程序被终止,这不是问题 --> 它会在需要时唤醒,但扫描将继续(它由 iOs 管理,而不是应用程序)。重要的是:您使用的是什么设备?只有较新的设备(iPhone 4S - iPhone 5)支持 BLE。看看这个其他帖子:tmblr.co/Z0DVRya_lcSH
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多