在开发使用低功耗蓝牙的应用程序时,iOS 设备有时会失去与外围设备的连接。 (有时几个小时。)
为了重新连接到现有外围设备,应用程序必须全天以特定速率在后台不断扫描,即使应用程序处于后台也是如此。
问题是,由于内存限制等原因,iOS 无法保证您的应用不会被杀死。
Information found in the iPhone OS Programming guide指出:
Apps that work with Bluetooth peripherals can ask to be woken up if the peripheral delivers an update when the app is suspended. This support is important for Bluetooth-le accessories that deliver data at regular intervals, such as a Bluetooth heart rate belt. When an app includes the UIBackgroundModes key with the bluetooth-central value in its Info.plist file, the Core Bluetooth framework keeps open any active sessions for the corresponding peripheral. In addition, new data arriving from the peripheral causes the system to wake up the app so that it can process the data. The system also wakes up the app to process accessory connection and disconnection notifications.
当手机连接到设备且应用程序处于后台时,不会出现此问题。但是,当设备断开连接并且应用程序处于后台时,它确实会发生。在这种特定情况下,手机不再连接到外围设备,因此不再收到通知。
许多人之前在 Stack Overflow 或 Apple 论坛上讨论过这个问题,我相信其中一位 Apple 开发人员已经回应说:
We're aware of this issue and are trying to come up with a solution. Currently, there is no workaround."
我的问题是,有没有办法至少提高你不会因为内存限制而被 iOS 杀死的几率?
例如,即时通讯应用程序 (IMO) 似乎在后台运行得非常好。在几天没有被使用后,该应用程序将唤醒并显示一条 gChat 消息。
我在质疑诸如
最佳答案
为什么即使蓝牙硬件断开连接也需要后台执行? 我不认为你需要“连续重新扫描”才能再次重新连接,如果硬件与 iPhone/iPad“配对”,它会自行重新连接。比如蓝牙耳机。还是不行?
据我所知,您没有机会完成您的要求。 当用户回到家时,一个普通的应用程序总是被挂起。该应用程序有大约。 5 秒的背景时间停止计时器,保存状态 ecc ecc。 有一些特殊的后台模式可以让您有更多的后台时间,并且每种模式(在您链接的页面中解释)都有不同的行为。
关于蓝牙模式: 描述的行为不是问题,但它是设计使然:
应用已暂停
当应用挂起时,它可以被操作系统杀死以释放内存(并且没有避免这种情况的技巧),但系统会在需要时唤醒。
然后每次收到通知时都会唤醒应用(从挂起状态唤醒或从“先前终止”状态启动)
应用程序有 10 秒的时间来执行任务(保存信息、ecc ecc)。此外,可以要求+10 分钟。特定任务的后台时间
10 秒(或 10 分钟)后应用再次挂起
您写的关于聊天应用程序的示例不正确:聊天应用程序通常不使用任何后台模式,它们只是使用推送通知向您转发消息。当您打开该应用程序时,该应用程序会连接到存储您所有消息的服务器并下载它。
您可以使用位置后台模式(路由应用程序可以在后台运行)或结合使用显着位置变化(应用程序被唤醒)和 10 分钟后台时间来获得“更多正常运行时间”,但我认为 Apple 会拒绝“滥用”此功能的应用。
很快,您必须设计您的应用以支持此行为。
关于objective-c - 减少内存大小以确保 iOS 中的后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14200123/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除