我正在开发一个用于旅行的iOS快速应用程序,该应用程序的概念是在与用户验证行程后,而在旅途中,该应用程序会保持蓝牙信标的范围,我正在使用此lib来执行此https://github.com/AltBeacon/ios-beacon-tools
如我所见,此lib使用CoreBluetooth,并且在后台运行良好。问题在于,由于进行了一次旅行,因此旅行甚至可能持续1到2个小时,而且我需要在此期间扫描信标(例如,每15秒扫描一次),以注册用户选择的路线。
现在是每当我使用我的应用程序进入后台时,我只有30秒的信标范围,然后iOS杀死了我的应用程序(也许是因为我没有在论坛上看到的过期处理程序),但仍然需要使信标范围无限期地持续,持续时间从10分钟到2个小时不等。
我怎样才能做到这一点?我没有iOS方面的经验,所以请帮助我。
您可能想要做什么。 。但这很棘手。
几点:
在后台,您永远无法使用CoreBluetooth检测到AltBeacon或其他制造商广告,因为iOS阻止了制造商广告在后台传递。 (当您使用CoreLocation时,iBeacon广告在后台遵循不同的规则。)在后台,可以检测到诸如Eddystone之类的服务广告。 通常,您的应用程序在发送到后台后只能运行几秒钟,然后检测将停止。但是,您可以根据要求使用here描述的技术将此时间最多延长180秒。虽然我的博客文章是关于CoreLocation的,但相同的技术也适用于CoreBluetooth。 如上述文章所述,还可以通过执行以下操作将180秒永久延长:
在Info.plist中设置BackgroundModes以包括位置。 除了“蓝牙”权限外,还获得“位置始终”权限。 使用CoreLocation开始主要位置更新。 (您不必使用由此产生的位置结果,但是需要使用它来使应用程序在后台保持 Activity 状态。)按照上面链接的博客文章中所述启动后台任务。 这将使您的应用永远在后台扫描蓝牙服务信标(例如Eddyatone),但有以下三个问题:
如果要使您的应用获得App Store的批准,则必须说服Apple审阅者,使您的应用为用户提供特定于位置的好处,这对用户来说是显而易见的。 iOS将每隔三天向您的用户显示一个可怕的对话框,以警告他们该应用程序在后台使用您的位置,并在 map 上显示该应用程序运行时用户所处的所有位置。该对话框将允许用户禁用后台位置权限,如果用户这样做,则后台信标更新将停止。有关更多信息,请参见我的博客文章here。 您的应用程序不断进行蓝牙扫描时,会消耗大量电池。