• iOS 蓝牙进入后台仍保活 2019-09-29 10:43:43
    相信大家在开发蓝牙应用的过程中会遇到需要连接蓝牙获取实时数据,然而我们不可能让应用一直保持在前台运行,所以需要设置权限让APP进入后台还继续运行蓝牙模块。 1、首先我们会想到xcode的设置,如下图 2、然而...

    相信大家在开发蓝牙应用的过程中会遇到需要连接蓝牙获取实时数据,然而我们不可能让应用一直保持在前台运行,所以需要设置权限让APP进入后台还继续运行蓝牙模块。

    1、首先我们会想到xcode的设置,如下图

    2、然而这样设置了,APP进入后台后,如果蓝牙连接着就会一直通讯,如果没有通讯,系统也会将进程挂起,所以需要进行心跳包,保证数据通讯不断。

    但假如进入后台后蓝牙断开了,APP就被挂起来了,所以需要申请一段时间让蓝牙有重新连接的机会。

    我们可以申请短暂的时间(300秒左右),让定时器不停跑搜索蓝牙的方法。为了保证app不会被系统回收,超过时间就把定时器关闭,APP将进入悬挂状态,直至下次重新进入app,之前收集的数据则可以操作保存。

        var backTask :UIBackgroundTaskIdentifier?
        var backTimer: Timer?
        var backCounter: Int = 0
        var isenterBackground = false
        
        //APP进入后台
        func applicationDidEnterBackground(_ application: UIApplication) {
           backTask = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
            self.isenterBackground = true
            if connectedPeripheral?.state == .disconnected && isOnForBLE{
                self.scanTimerStart()
            }
        }
        //普通申请后台时间
        func scanTimerStart(){
            if backTimer != nil {
                backTimer?.invalidate()
            }
            backCounter = 0
            backTimer = Timer(timeInterval: 2, target: self, selector: #selector(backgroundScan), userInfo: nil, repeats: true)
            RunLoop.current.add(self.backTimer!, forMode: RunLoop.Mode.default)
        }
    
    
        //蓝牙扫描
        @objc func backgroundScan(){
            discoveredPeripherals.removeAll(keepingCapacity: false)
            AppCache.shared.deviceArray.removeAll()
            LWBluetoothManager.sharedInstance.startScanPeripherals()
            if connectedPeripheral != nil && connectedPeripheral?.state != .connected && AppCache.shared.ishandleDisconnect == false{
                LWBluetoothManager.sharedInstance.connectPeripheral(connectedPeripheral!, valuableUUID: [kServiceUUID: [kCCharacteristicUUID]])
            }
            backCounter += 2
            
            if #available(iOS 10.0, *) {
                
                if backCounter >= 298 {
                    backCounter = 0
                    backTimer?.invalidate()
                }
            }else{
                if backCounter >= 180 {
                    backCounter = 0
                    backTimer?.invalidate()
                }
                if backTask != nil {
                    UIApplication.shared.endBackgroundTask(backTask!)
                }
            }
        }

    3.关于定时器分298秒和180秒,是针对iOS版本不同设定的,由于公司有部iOS9的iPad,测试中发现蓝牙断开时间超过了3分钟,APP就被系统回收了,所以设置成180秒。

    以下是蓝牙断开时启动定时器:

    4.上面所述的情况只是适合公司的项目开发,如果发现有什么不妥,请留言讨论。

     

     

     

     

    展开全文
  • ...
  • 最近在做一个蓝牙相关的项目, 需要在应用进入后台, 或者手机属于锁屏状态的情况下, 仍然保持蓝牙连接, 并且能正常接收数据。 本来以后会很麻烦, 但是学习了下..发现就2步而已。简单的不能再简单了。 好了。...
  • 1.允许蓝牙后台常驻,appDelegate向系统申请后台时间 2.如果iOS 经过1步骤,能扫描到其他外设,目标外设扫描不到,基本可以确定是目标外设的广播包有问题, 可以和嵌入式工程师沟通,让广播服务放到广播包里面,别...
  • ...
  • 苹果在关于后台模式的文档中称:“这个配置项应该尽可能少的使用,而且最好只给那些提供通知服务的应用使用。如果有在后台运行的替代方法,就应该使用替代方法。比如,如果应用能使用显著位置变化接口来接受位置变动...
  • 苹果蓝牙后台的限制,原本广播会有两个段分别是localName和serviceUUID这两块,但现在后台广播时,是不发送在这两段的   手机app可以作为一个蓝牙外设端来模拟外设硬件,但广播包里的数据只能包含localName和...
  • 蓝牙4.0 For IOS 2015-07-17 10:27:31
    蓝牙4.0 For IOS用于IOS,更多说的是开发有关目录 [隐藏] 1 更多研究2 发现3 调试用APP4 困扰5 NRF80026 一些研究6.1 官方Demo7 CC2540官方源码8 经验9 IOS蓝牙4.0支持10 IOS库支持11 官方文档说法12...
  • Delphi IOS 后台运行 同样的程序,编译成android,锁屏后继续运行正常,蓝牙通讯正常,但在IOS下锁屏后程序的蓝牙就中断通讯了? IOS的机制就是这样,锁屏就关闭了。 音乐播放器是怎么做到的?锁屏还能继续工作?...
  • 在这一节,主要是 iOS APP 关于蓝牙后台处理方面的知识和经验。 对于 iOS APP 来说,知道你的 APP 是运行在前台还是运行在后台很重要。一个 APP 在后台运行状态下的行为表现必须不同于前台,因为 iOS 设备的系统...
  • iOS后台模式教程 (一) 2019-04-22 00:36:15
    iOS后台模式教程 (一) 原文 使用场景 在iOS7之前的系统中,当应用被挂起,拥有连续的10分钟时间来处理之前的任务,然后才会被系统终止。 所以,后台模式有一些特殊的使用场景。例如,更新位置,播放视频音频,和...
  • 打开后台模式中的使用蓝牙功能(手机为中心模式):TARGET→Capabilities→Background Modes→Uses Bluetooth LE accessories(勾选) 在AppDelegate.m中添加下面代码: #pragma mark APP进入后台触发的方法 - (void)...
  • [蓝牙]蓝牙4.0 for iOS 2016-04-06 22:46:13
    用于IOS,更多说的是开发有关 目录  [隐藏]  1 更多研究2 发现3 调试用APP4 困扰5 NRF80026 一些研究 6.1 官方Demo 7 CC2540官方源码8 经验9 IOS蓝牙4.0支持10 IOS库支持11 官方文档...
  • 由于接到iphone需要和第三方蓝牙设备交互的任务,便开始了蓝牙开发这件事。 在探索了一段时间后,iOS蓝牙开发相关Apple大致有以下几种方式。 1 GameKit.framework 【只能存在于iOS设备之间,多用于游戏 能...
  • iOS13在使用蓝牙发送广播时,会额外携带0x0A也就是TXPowerLevel字段,会导致数据中多出2位(type和value),中心设备按位解析就会提前两位,导致解析失败。 代码和配图如下: [self.peripheralManager ...
  • 原文:...Core Bluetooth Background Processing for iOS Apps iOS蓝牙应用的后台处理 对于ios应用,你必须要清楚它是在前台运行,还是在后台运行。因为资源有限,你要对这两种模式区别处...
  • ios蓝牙应用的后台处理 对于ios应用,你必须要清楚它是在前台运行,还是在后台运行。因为资源有限,你要对这两种模式区别处理
  • 官方网站: ...一、iOS 应用程序5个状态 1、停止运行-应用程序已经终止,或者还未启动。 2、不活动-应用程...
  • 原文 ... 一、服务端(也叫周边设备吧。。脑残的翻译) ...1.实现类必须遵守协议 CBPeripheralManagerDelegate ...@property ( strong , nonatomic ) CBPeripheralManager *perip
1 2 3 4 5 ... 20
收藏数 2,739
精华内容 1,095