Ios 可编程后台操作问题

Ios 可编程后台操作问题,ios,xcode,multithreading,bluetooth-lowenergy,background-process,Ios,Xcode,Multithreading,Bluetooth Lowenergy,Background Process,我正在尝试将固件文件从我的应用程序传输到可穿戴硬件。 这需要一些时间,当我的应用程序进入后台或按下锁定按钮时,固件传输过程中断 理想情况下,它应该继续传输固件。我使用这个方法在后台继续这个过程,并且还声明了对后台模式的支持 - (void)applicationDidEnterBackground:(UIApplication *)application { bgTask = 0; bgTask = [application beginBackgroundTaskWithN

我正在尝试将固件文件从我的应用程序传输到可穿戴硬件。 这需要一些时间,当我的应用程序进入后台或按下锁定按钮时,固件传输过程中断

理想情况下,它应该继续传输固件。我使用这个方法在后台继续这个过程,并且还声明了对后台模式的支持

  - (void)applicationDidEnterBackground:(UIApplication *)application {

    bgTask = 0;
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        // Clean up any unfinished task business by marking where you
        // stopped or ending the task outright.
        //[application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task, preferably in chunks.

        //[application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

此方法无法执行此任务

但是,如果我在Appdelegate-didFinishLaunchingWithOptions中使用此方法,它会起作用

但将这段代码放在上述方法中会有一个折衷,即如果我没有传输固件,应用程序进入后台,那么3分钟后,这段代码将删除应用程序,蓝牙连接中断

如果我根本不使用这种方法,那么连接将一直保持,直到手动断开,但后台传输不会发生

我必须同时进行两次手术。请提出一些建议,因为我已经在这个问题上做了很多天了


提前感谢。

尝试使用BackgroundModes运行应用程序
并从didEnterInbackground中删除所有代码

当准备好下一个块时,外围设备是否发送消息-即,您是否使用writeWithResponse?或者,如果此方法有效,为什么不在应用程序委托中设置一个布尔值,指示您是否正在更新固件,如果不需要,则不启动后台任务?@paulw:-是,当我向外围设备发送数据包时,外围设备将回发确认。此外,我似乎无法理解如何在启动固件升级时在-didfishlaunchingwithoptions方法中设置标志并将其设置为true。另外,如果我在一个单独的方法中编写该代码块,那么如何在-didFinish方法[application beginBackgroundTaskWithExpirationHandler]中获取可用的应用程序对象。请澄清疑问如果您的外设支持writeWithNotify,那么您应该能够使用标准蓝牙后台模式,并且不需要后台任务如何检查我的外设是否支持此方法?在我的代码中,每当我将数据写入外围设备时,我都使用此方法来接收响应。voidperipheral:CBPeripheral*外围设备didWriteValueForCharacteristic:CBCharacteristic*特征错误:NSError*错误{[peripheral setNotifyValue:TRUE forCharacteristic:];}还有此方法:-didUpdateValueForCharacteristic:CBCharacteristic*特征错误:NSError*错误只要您调用其中一种方法,您的蓝牙代码就可以在后台以蓝牙中央后台模式运行-您可以不需要特定的背景任务