elba
elba
  • 发布:2018-11-29 23:24
  • 更新:2018-11-29 23:24
  • 阅读:1394

【报Bug】iOS连接蓝牙打印,已用Object C实现 报错,转NativeJS遇到问题,求解?

分类:5+ SDK

第一步:

//

// PluginTest.m

// HBuilder-Hello

//

// Created by Mac Pro on 14-9-3.

// Copyright (c) 2014年 DCloud. All rights reserved.

//

import "BluePrinter.h"

import "PDRCoreAppFrame.h"

import "H5WEEngineExport.h"

import "PDRToolSystemEx.h"

import "WebViewForImage.h"

// 扩展插件中需要引入需要的系统库

import <LocalAuthentication/LocalAuthentication.h>

@implementation BluePrinter

// 扫描方法 返回对象包含索引 名称 uuid等

  • (void)Scanning:(PGMethod*)commands{

    if(commands){

    // 回调id  
    
    NSString* cbId = [commands.arguments objectAtIndex:0];  
    
    SEPrinterManager *_manager = [SEPrinterManager sharedInstance];  
    
    [_manager startScanPerpheralTimeout:10 Success:^(NSArray<CBPeripheral *> *perpherals,BOOL isTimeout) {  
    
        @try {  
    
            NSUInteger pcount = [perpherals count];  
    
            NSMutableArray *temp = [NSMutableArray array];  
    
            for (NSUInteger i = 0; i < pcount; i++) {  
    
                // 转化Integer为String  
    
                NSString *index = [[NSString alloc] initWithFormat:@"%lu",(unsigned long)i];  
    
                // 转化uuid为String  
    
                NSString *uuid = [[NSString alloc] initWithFormat:@"%@",perpherals[i].identifier];  
    
                // 组成字典结构  
    
                NSDictionary *device = @{@"index":index,@"name":perpherals[i].name,@"uuid":uuid};  
    
                // 放入数组  
    
                [temp addObject:device];  
    
            }  
    
            self.deviceArray = perpherals;  
    
            PDRPluginResult * result = [PDRPluginResult resultWithStatus:PDRCommandStatusOK messageAsArray:temp];  
    
            result.keepCallback = true;  
    
            NSLog(@"扫描中:");  
    
            [self toCallback:cbId withReslut:[result toJSONString]];  
    
        }  
    
        @catch (NSException *exception) {  
    
            // 异常停止搜索  
    
            [_manager stopScan];  
    
        }  
    
    } failure:^(SEScanError error) {  
    
        NSLog(@"error:%ld",(long)error);  
    
    }];  

    }

}

@end


第二步:

//

// SEPrinterManager.m

// SEBLEPrinter

//

// Created by Harvey on 16/5/5.

// Copyright © 2016年 Halley. All rights reserved.

//

import "SEPrinterManager.h"

define kSECharacter @"character"

define kSEType @"type"

// 发送数据时,需要分段的长度,部分打印机一次发送数据过长就会乱码,需要分段发送。这个长度值不同的打印机可能不一样,你需要调试设置一个合适的值(最好是偶数)

define kLimitLength 146

@interface SEPrinterManager ()<CBCentralManagerDelegate,CBPeripheralDelegate>

@property (copy,nonatomic) SEScanPerpheralSuccess scanPerpheralSuccess; /*< 扫描设备成功的回调 /

@property (copy, nonatomic) SEScanPerpheralFailure scanPerpheralFailure; /*< 扫描设备失败的回调 /

@property (copy, nonatomic) SEConnectCompletion connectCompletion; /*< 连接完成的回调 /

@property (copy, nonatomic) SEFullOptionCompletion optionCompletion; /*< 连接、扫描、搜索 /

@property (copy, nonatomic) SEDisconnect disconnectBlock; /*< 断开连接的回调 /

@property (strong, nonatomic) SEPrintResult printResult; /*< 打印结果的回调 /

@property (strong, nonatomic) CBCentralManager *centralManager; /*< 中心管理器 /

@property (strong, nonatomic) CBPeripheral *connectedPerpheral; /*< 当前连接的外设 /

@property (strong, nonatomic) NSMutableArray *perpherals; /*< 搜索到的蓝牙设备列表 /

@property (strong, nonatomic) NSMutableArray *writeChatacters; /*< 可写入数据的特性 /

@property (assign, nonatomic) NSTimeInterval timeout; /*< 默认超时时间 /

@property (strong, nonatomic) HLPrinter *printer; /*< 打印器 /

@property (assign, nonatomic) BOOL autoConnect; /*< 自动连接上次的外设 /

@property (assign, nonatomic) NSInteger writeCount; /*< 写入次数 /

@property (assign, nonatomic) NSInteger responseCount; /*< 返回次数 /

@end

static SEPrinterManager *instance = nil;

@implementation SEPrinterManager

  • (instancetype)sharedInstance

{

return [[self alloc] init];  

}

  • (NSString *)UUIDStringForLastPeripheral

{

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  

NSString *UUIDString = [userDefaults objectForKey:@"peripheral"];  

return UUIDString;  

}

  • (instancetype)init

{

static dispatch_once_t onceToken;  

dispatch_once(&onceToken, ^{  

    instance = [super init];  

    instance.perpherals = [[NSMutableArray alloc] init];  

    instance.writeChatacters = [[NSMutableArray alloc] init];  

    instance.timeout = 30;  

    [instance resetBLEModel];  

});  

return instance;  

}

  • (instancetype)allocWithZone:(struct _NSZone *)zone

{

static dispatch_once_t onceToken;  

dispatch_once(&onceToken, ^{  

    instance = [super allocWithZone:zone];  

});  

return instance;  

}

pragma mark - bluetooth method

  • (void)setTimeout:(NSTimeInterval)timeout

{

_timeout = timeout;  

if (_timeout > 0) {  

    [self performSelector:@selector(timeoutAction) withObject:nil afterDelay:timeout];  

}  

}

  • (void)timeoutAction

{

[_centralManager stopScan];  

if (_perpherals.count == 0) {  

    //分发错误信息  

    if (_delegate && [_delegate respondsToSelector:@selector(printerManager:scanError:)]) {  

        [_delegate printerManager:self scanError:SEScanErrorTimeout];  

    }  

    if (_scanPerpheralFailure) {  

        _scanPerpheralFailure(SEScanErrorTimeout);  

    }  

} else {  

    if (_delegate && [_delegate respondsToSelector:@selector(printerManager:perpherals:isTimeout:)]) {  

        [_delegate printerManager:self perpherals:_perpherals isTimeout:YES];  

    }  

    if (_scanPerpheralSuccess) {  

        _scanPerpheralSuccess(_perpherals,YES);  

    }  

}  

}

  • (BOOL)isConnected

{

if (!_connectedPerpheral) {  

    return NO;  

}  

if (_connectedPerpheral.state != CBPeripheralStateConnected && _connectedPerpheral.state != CBPeripheralStateConnecting) {  

    return NO;  

}  

return YES;  

}

  • (void)resetBLEModel

{

_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];  

[_perpherals removeAllObjects];  

_scanPerpheralSuccess = nil;  

_connectedPerpheral = nil;  

}

  • (void)startScanPerpheralTimeout:(NSTimeInterval)timeout

{

self.timeout = timeout;  

if (_centralManager.state == CBCentralManagerStatePoweredOn) {  

    [_centralManager scanForPeripheralsWithServices:nil options:nil];  

    return;  

}  

[self resetBLEModel];  

}

  • (void)startScanPerpheralTimeout:(NSTimeInterval)timeout Success:(SEScanPerpheralSuccess)success failure:(SEScanPerpheralFailure)failure

{

self.timeout = timeout;  

_scanPerpheralSuccess = success;  

_scanPerpheralFailure = failure;  

NSLog(@"_centralManager.state:%ld",_centralManager.state);  

if (_centralManager.state == CBCentralManagerStatePoweredOn) {  

    [_centralManager scanForPeripheralsWithServices:nil options:nil];  

    return;  

}  

[self resetBLEModel];  

}

pragma mark - CBCentralManagerDelegate

  • (void)centralManagerDidUpdateState:(CBCentralManager *)central

{

if (central.state != CBCentralManagerStatePoweredOn) {  

    if (_delegate && [_delegate respondsToSelector:@selector(printerManager:scanError:)]) {  

        [_delegate printerManager:self scanError:(SEScanError)central.state];  

    }  

    if (_scanPerpheralFailure) {  

        _scanPerpheralFailure((SEScanError)central.state);  

    }  

} else {  

    [central scanForPeripheralsWithServices:nil options:nil];  

}  

}

  • (void)centralManager:(CBCentralManager )central didDiscoverPeripheral:(CBPeripheral )peripheral advertisementData:(NSDictionary<NSString , id> )advertisementData RSSI:(NSNumber *)RSSI

{

if (peripheral.name.length <= 0) {  

    return ;  

}  

  NSLog(@"Discovered name:%@,identifier:%@,advertisementData:%@,RSSI:%@", peripheral.name, peripheral.identifier,advertisementData,RSSI);  

if(_perpherals.count==0){  

    [_perpherals addObject:peripheral];  

}else{  

    BOOL isExist = NO;  

    for (int i = 0; i < _perpherals.count; i++) {  

        CBPeripheral *per = [_perpherals objectAtIndex:i];  

        if ([per.identifier.UUIDString isEqualToString:peripheral.identifier.UUIDString]) {  

            isExist = YES;  

            [_perpherals replaceObjectAtIndex:i withObject:peripheral];  

        }  

    }  

    if (!isExist) {  

        [_perpherals addObject:peripheral];  

    }  

}  

if (_delegate && [_delegate respondsToSelector:@selector(printerManager:perpherals:isTimeout:)]) {  

    [_delegate printerManager:self perpherals:_perpherals isTimeout:NO];  

}  

if (_scanPerpheralSuccess) {  

    _scanPerpheralSuccess(_perpherals,NO); //这一步 报错,野指针,,不知道什么问题。求解???  

}  

if (_autoConnect) {  

    NSString *UUIDString = [SEPrinterManager UUIDStringForLastPeripheral];  

    if ([peripheral.identifier.UUIDString isEqualToString:UUIDString]) {  

        [_centralManager connectPeripheral:peripheral options:nil];  

        peripheral.delegate = self;  

    }  

}  

}

@end

2018-11-29 23:24 负责人:无 分享
已邀请:

该问题目前已经被锁定, 无法添加新回复