最近在做蓝牙相关的项目,中间遇到的坑此处暂掠过不表,今天主要写一下通过iOSDFULibrary库,对蓝牙设备的固件进行升级的过程。
现在市面上主要的支持蓝牙4.0的芯片都是由NORDIC SEMICONDUCTOR生产的,因此进行固件OTA升级也基本上都是用的他们自家写的库。其中ios版本和android版本的固件升级的库分别为IOS-Pods-DFU-Library
和Android-DFU-Library。其中最新的ios的库是使用swift写的,但是我们自己的工程主要是由oc写的,集成起来相对就波折一些。可以有两种方式将swift库集成进oc工程中。
1.通过cocoaPod 集成。
如果你本身的工程就有使用cocoaPod,那整个的集成过程就容易很多。
- 首先,更新你工程中的Podfile文件,在其中添件如下代码:
use_frameworks!
pod 'iOSDFULibrary'
- 其次,运行pod install。
如果比较幸运的话,你就可以编译通过了。但是由于在我们自己的工程中,设定了swift语言的版本是3.3,而iOSDFULibrary和他依赖的Zip库都用的是swift4.1,这样就会导致编译不通过。这样就必须要在podfile中再设置一下这两个库所使用的swift版本,具体代码如下:
post_install do |installer|
swift4_1Targets = ['iOSDFULibrary', 'Zip']
installer.pods_project.targets.each do |target|
if swift4_1Targets.include? target.name
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.1'
end
end
end
end
- 再次,就可以在模块中直接使用oc调用iOSDFULibrary的方法了。
#import "ViewController.h"
@import iOSDFULibrary;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
DFUFirmware *selectedFirmware = [[DFUFirmware alloc] initWithUrlToZipFile:firmWarePath];
DFUServiceInitiator * dfuInitiator = [[DFUServiceInitiator alloc]initWithQueue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
[dfuInitiator withFirmware:selectedFirmware];
dfuInitiator.delegate = self;
dfuInitiator.progressDelegate = self;
dfuInitiator.logger = self;
dfuInitiator.enableUnsafeExperimentalButtonlessServiceInSecureDfu = YES;
self.dfuController = [[dfuInitiator withFirmware:selectedFirmware] startWithTarget:self.discoveredPeripheral];
}
@end
2.通过源代码集成。
我们可以将iOSDFULibrary库中的swift文件提取出来直接添加到工程中。这样做的好处就是可以在调试的时候更加方便,但是缺点就是没有办法很方便的跟随着iOSDFULibrary库的更新而随时更新。由于我们在调试过程中遇到了一些问题,所以一开始是采用的第一种方式集成,后来又改为第二种方式。
- 首先,clone iOSDFULibrary的库。找到其中的文件夹iOSDFULibrary/Classes下的所有文件,我们将这其中的所有文件添加到工程中。
- 其次,由于iOSDFULibrary库中的swift文件引用了其中的部分oc文件,因此,需要将#import "IntelHex2BinConverter.h"添加到 项目名-Bridging-Header.h文件中,以便swift库调用。
- 再次,由于iOSDFULibrary库依赖Zip库,因此我们需要在podfile中添加对Zip库的引用。
pod 'Zip'
- 最后,在需要使用iOSDFULibrary库中的方法的文件中,导入头文件#import "项目名-Swift.h",这个文件是xcode帮我们生成的,并且在工程中是无法看到的,编译通过以后,直接通过Jump to Defination可以跳转到这个文查看他其中的具体内容。这个文件会把所有的可供oc调用的swift方法声明放到其中。只要导入了这个文件,oc就可以调用swift中的方法了。
至此,你的工程中应该就可以通过以上两种方式的任意一种,使用iOSDFULibrary来对你的蓝牙设备进行固件升级了。但是,实际操作过程中,不同的工程的配置会产生各种坑,需要我们自己克服。当然,将库集成进代码只是第一步,后续的调试过程仍然会是步步惊心,下一篇会对整个流程做一个详细的描述。