CaptureSDK 1.8.34

CaptureSDK 1.8.34

Cyrille DémareSocket MobileEric Glaenzer 维护。



CaptureSDK 1.8.34

  • Socket

CaptureSDK 版本 1.7.9 - Cocoapods

Socket Mobile 是增强生产力的数据采集和交付解决方案的创新领导者。

CaptureSDK 是将条形码扫描和 RFID/NFC 读取功能添加到 iOS 应用程序的最简单解决方案。

Socket Mobile 条形码扫描器和无线接触式读写器是各种数据录入场景下的人体工程学、快速和精确的解决方案。

此 SDK 无需遵循特定设计架构即可轻松集成到应用程序中。

在 10 分钟内,即可将条形码扫描或 RFID/NFC 读取功能集成到应用程序中。

CaptureSDK 提供了一个内置的条形码扫描器 SocketCam,允许在获得 Socket Mobile 扫描器之前测试和集成 SDK,使用完全相同的 API,这使从使用 SocketCam 切换到 Socket 扫描器完全无缝。

更多文档可以在这里找到。

设备和 CaptureSDK 版本兼容性

设备 < 1.4 1.4 1.5 1.6 1.7
SocketCam C820
S720/D720/S820
D600, S550 和所有其他条形码扫描器
S370
M930

目录

重大变更

我们对架构进行了一些改进和更改,以备将来使用。SDK仍然按您预期的那样工作。但是,我们进行了一些不需要您付出太多努力的更改。

  • SDK现在是一个框架,不再是静态库了。
  • 名称现在是CaptureSDK,存储库链接已更改为这里
  • cocoapods-capturecocoapods-capture-obj-c现在已弃用。但是,这个新的框架可以包含在Objective-C和/或Swift项目中。
  • 最小的目标版本现在是iOS 11.0。
  • SocketCam C820,以前称为SoftScan,已经改进,让您可以使用设备而不是扫描仪进行扫描。
  • Capture Helper现在包含在框架中 - CaptureHelper用于Swift,SKTCaptureHelper用于Objective-C。
  • 在版本1.5.5中启用了Bitcode,但在使用Xcode 14构建的版本1.5.7中已禁用。如果您需要启用Bitcode的版本,请使用1.5.5。

快速安装提示

CaptureSDK使用CocoaPods。

首先,您需要按照以下链接中的说明在您的机器上安装CocoaPods:https://guides.cocoapods.org.cn/using/getting-started.html

要将SDK安装到应用程序中,您需要在Xcode项目所在的同一路径下创建一个名为Podfile的文件。

该文件的内容应类似于以下内容,假设您的项目名称为myProject

target 'myProject'
    pod 'CaptureSDK', '~> 1.7'

将文件保存后,从终端命令提示符中输入命令 pod install,并确保当前目录是 Podfile 所在的位置。

这将创建一个工作空间文件。如果您在同一项目中打开了 Xcode,需要先将其关闭,然后使用工作空间文件重新打开项目。

从那里开始,您应该能够无错误地编译。

非常重要:在应用程序设置中支持的已安装外部配件协议数组和。为了能够使用 Socket Mobile 条码扫描仪,需要在应用程序项目中添加扫描仪的外部配件协议字符串到 支持的已安装外部配件协议数组 中。

协议字符串为 com.socketmobile.chs

如果应用程序使用了 Socket Mobile 条码扫描仪,则需要在将应用程序提交到 App Store 之前将其列入 MFi 白名单。Socket Mobile 将为您处理 MFi(即配件制造商计划)的申请过程,当您在 Socket Mobile 开发者账号中提交 MFi 应用时。对于支持条码扫描仪的第一个版本,需要这么做一次。

您还需要将以下键添加到您的 Info.plist 文件中: CFBundleAllowMixedLocalizations(《本地化资源可以混合使用》)设置为 YES)。这允许 SDK 显示本地化字符串。

为了使用 CaptureSDK,需要一个 AppKey。

AppKey 可以通过登录 Socket Mobile 开发者门户并注册您的应用程序来生成。

此注册需要 Socket Mobile 开发者 ID 和应用程序 Bundle ID(大小写敏感)。

现在,您可以在主控制器中添加 import CaptureSDK,并使其继承自您的应用程序需要的某一个 CaptureHelperDelegate

转到 CaptureHelperDelegate 源文件,并将您要重写的代理复制粘贴到其中,至少包括用于接收应用程序中解码条码数据的 onDecodedData 代理。

CaptureSDK 使用方法

CaptureSDK 的详细说明请参阅 文档

使用 CaptureSDK 的推荐方法是使用 CaptureHelper。现在,CaptureHelper 已经整合到框架中,不再是独立文件。Swift 的 CaptureHelper,Objective-C 的 SKTCaptureHelper

1. 获取 CaptureHelper 实例

CaptureHelper 可以通过其 CaptureHelper.sharedInstance 静态成员在您的应用程序中的一个控制器实例化。

2. CaptureHelper委托堆栈

选择的控制器必须实现CaptureHelper[xxxxx]Delegate协议之一,以便接收各种CaptureSDK的异步事件。

通过使用CaptureHelper pushDelegate方法,可以设置从派生自至少一个CaptureHelper[xxxxx]Delegate的控制器引用。

CaptureHelper维护一个委托堆栈。堆栈顶部的委托是接收来自CaptureSDK的通知的委托。因此,如果应用程序有多个视图需要扫描功能,可以将新的视图控制器引用推送到CaptureHelper的委托堆栈,并在视图不再活动时移除该引用。

3. 打开CaptureHelper

为了启动CaptureSDK,API使用包含应用信息的openWithAppInfo:withCompletionHandler方法。

该方法只能调用一次,例如在主视图控制器中,并且可以在应用程序代码的各个地方使用CaptureHelper.sharedInstance作为单例引用,而无需通过各种控制器传递。

应用程序信息可以通过Socket Mobile开发者门户检索,通过注册应用程序并提供其应用程序ID(开发人员ID)来注册应用程序。然后生成应用程序密钥,并使用所有三个初始化打开CaptureSDK所需的AppInfo。

应用程序ID由为设计在平台上运行的平台上标记的应用程序包ID组成。

以下是一个此类应用程序ID的示例:"ios:com.socketmobile.SingleEntry"。应用程序ID是区分大小写的

打开CaptureSDK后,一旦扫描仪连接到iOS设备,就会发生设备到达通知。

可以通过覆盖onDecodedData委托检索来自扫描仪的解码数据。

4. 在Xcode项目中集成CaptureSDK的总结

SingleEntry应用ViewController.m的示例

import UIKit
import CaptureSDK

class MasterViewController:
  UITableViewController,
  CaptureHelperDevicePresenceDelegate,
  CaptureHelperDeviceManagerPresenceDelegate,
  CaptureHelperDeviceDecodedDataDelegate,
  CaptureHelperErrorDelegate,
  CaptureHelperDevicePowerDelegate {


  // Capture Helper shareInstance allows to share
  // the same instance of Capture Helper with the
  // entire application. That static property can
  // be used in any views but it is recommended
  // to open only once Capture Helper (in the main
  // view controller) and pushDelegate, popDelegate
  // each time a new view requiring scanning capability
  // is loaded or unloaded respectively.
  var captureHelper = CaptureHelper.sharedInstance

  override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
      // fill out the App Info with the Bundle ID which should start by the
      // platform on which the application is running and followed with the
      // case sensitive application Bundle ID,
      // with the Socket Mobile Portal developer ID
      // and with the Application Key generated from the Socket Mobile Developer
      // portal
      let AppInfo = SKTAppInfo()
      AppInfo.appKey = "MC0CFQD1tdTpaABkppmG+iP3dB9kolYVtwIUY8c3UmEfaPoTI3AxbPOTpNgw+fo="
      AppInfo.appID = "ios:com.socketmobile.SingleEntrySwift"
      AppInfo.developerID = "bb57d8e1-f911-47ba-b510-693be162686a"

      // there is a stack of delegates the last push is the
      // delegate active, when a new view requiring notifications from the
      // scanner, then push its delegate and pop its delegate when the
      // view is done
      captureHelper.pushDelegate(self)

      // to make all the delegates able to update the UI without the app
      // having to dispatch the UI update code, set the dispatchQueue
      // property to the DispatchQueue.main
      captureHelper.dispatchQueue = DispatchQueue.main

      // open Capture Helper only once in the application
      captureHelper.openWithAppInfo(AppInfo, withCompletionHandler: { (_ result: SKTResult) in
          print("Result of Capture initialization: \(result.rawValue)")
      })
  }
}

CaptureHelper通过调用协议中的onDeviceArrival使应用了解新设备连接,同样的方式,当设备断开连接时,会调用onDeviceRemoval。可以使用表示已连接设备的CaptureHelper设备实例来获取或设置设备属性。

视图控制器了解扫描仪的示例

func didNotifyArrivalForDevice(_ device: CaptureHelperDevice, withResult result: SKTResult) {
    print("Main view device arrival:\(device.deviceInfo.name!)")
}

func didNotifyRemovalForDevice(_ device: CaptureHelperDevice, withResult result: SKTResult) {
    print("Main view device removal:\(device.deviceInfo.name!)")
}

对于像S370这样的组合设备,它有2个设备,将有2个didNotifyArrivalForDevice和2个didNotifyRemovalForDevice通知。

以下代码显示了如何区分和处理它们:

func didNotifyArrivalForDevice(_ device: CaptureHelperDevice, withResult result: SKTResult) {
    print("didNotifyArrivalForDevice: \(String(describing: device.deviceInfo.name))")
    if device.deviceInfo.deviceType == .NFCS370 {
    // handle the NFC reader of the S370
    } else if device.deviceInfo.deviceType == .scannerS370 {
    // handle the Barcode scanner of the S370
    }
}

如果扫描仪触发了扫描,可以在协议函数onDecodedData中检索解码数据。

检索扫描仪接收到的解码数据的示例

func didReceiveDecodedData(_ decodedData: SKTCaptureDecodedData?, fromDevice device: CaptureHelperDevice, withResult result: SKTResult) {
    if result == SKTCaptureErrors.E_NOERROR {
        let rawData = decodedData?.decodedData
        let rawDataSize = rawData?.count
        print("Size: \(String(describing: rawDataSize))")
        print("data: \(String(describing: decodedData?.decodedData))")
        let string = decodedData?.stringFromDecodedData()!
        print("Decoded Data \(String(describing: string))")
    }
}

通过调用各种CaptureHelperDevice get/set方法,应用程序可以检索或修改设备属性。例如,有一个用于检索设备友好名称的方法:getFriendlyNameWithCompletionHandler。该调用是异步的,将立即返回。最终结果和友好名称可以在完成处理函数块中检索。

重要:如果属性无法通过可用的CaptureHelper方法访问,非常容易添加新的,通过创建CaptureHelper扩展类,复制粘贴类似的get/set方法,并更改新方法中的属性设置来实现。

创建CaptureHelper扩展可以在更新到更近期的CaptureSDK CocoaPods时避免覆盖修改后的CaptureHelper版本。

示例代码

示例代码可以在GitHub / SocketMobile找到

SocketCam C820

我们将SocketCam C820纳入SDK中,之前称为SoftScan。

SocketCam功能指的是使用手机摄像头扫描条形码的能力。在CaptureSDK中集成该功能的主要目的是提供对条形码扫描器的一致性接口。

无论是Socket Mobile扫描仪还是手机摄像头,应用都依赖于相同的接口和API,这使得从使用SocketCam切换到物理Socket扫描仪的过渡毫无摩擦。

使用SocketCam功能的程序需要做两件事情不同,这是Socket Mobile扫描仪不需要的。

首先,需要将应用程序主UI视图注册到CaptureSDK,这样摄像头覆盖视图就可以通过传递UI应用程序引用到重叠属性kSktCapturePropIdOverlayViewDevice来正确显示。

其次,需要提供一种触发逻辑来启动SocketCam扫描操作。触发器是自CaptureSDK的第一个版本就存在的kSktCapturePropIdTriggerDevice属性,而重叠视图属性是添加来支持SocketCam功能的。

第三个属性kSktCapturePropIdSocketCamStatus允许启用或禁用SocketCam功能。这是一个在应用程序使用期间持续存在的CaptureSDK属性。

如果启用SocketCam功能,CaptureSDK将向应用程序发送设备到达通知,并引用一个应用程序可以控制的SocketCam设备。

一旦应用程序触发了一个读取操作,解码的数据将以相同的方式和相同的信息到达,就像其他由CaptureSDK支持的Socket Mobile设备一样。

有关更多信息,请参阅文档

配置和连接Socket Mobile设备

CaptureSDK设计用于在iOS平台上使用所有Socket Mobile设备。

作为应用程序开发者,CaptureSDK将为您提供对连接的Socket Mobile数据采集设备的完全程序性访问,以自定义数据源(条形码符号或RFID标签)、数据支持和管理设备反馈消息和功能。

可以在这里找到CaptureSDK的API文档链接这里

Socket Mobile设备默认为MFi模式发货,与CaptureSDK兼容。

可以使用Socket Mobile Companion应用程序将设备配置为应用模式

还可以参考无需使用Companion的说明这里

BLE设备

对于D600、S550和S370,BLE设备管理器必须将收藏夹设置为*,有关更多信息,请参阅文档

主题选择

主题选择功能允许选择在S550或S370设备上播放的LED序列。请参考文档

设备通知(电池等级)

可以配置设备通知,以便在发生一个或多个这些事件时接收通知

  • 电池等级变化
  • 电源状态变化
  • 按钮状态变化

默认情况下,设备通知是关闭的。建议首先检查特定通知是否已关闭或打开。根据读取结果,应用程序可以设置接收特定通知,如果尚未设置。该设置在Socket Mobile设备上保持持续,即使在扫描仪关机之后。不建议在不检查是否已正确设置后,系统地设置设备中的通知。

对于电池等级和电源状态,状态变化可能需要很长时间,所以通常使用相应的CaptureHelper Get方法读取初始值。

最后,某些设备不支持某些通知。如果情况如此,当尝试设置不支持的通知时,将返回错误ESKT_NOTSUPPORTED (-15)

有关更多信息,请参阅文档

关闭CaptureSDK

不建议关闭CaptureSDK,因为扫描仪在下一次CaptureSDK打开时将进行重新初始化,这会导致在能够使用扫描仪之前产生延迟。

关闭CaptureSDK不会影响功耗,因为扫描仪仍然连接到iOS主机。

还值得一提的是,当Socket Mobile设备连接时,功耗非常低,与建立连接相比。

如果关闭CaptureSDK的目的是不接收来自设备的解码数据,那么可以简单地移除应用代理,应用程序将不再接收来自扫描仪的任何事件,直到它再次设置其代理。

Objective-C 项目安装指南

从现在起,我们的框架包含 Swift 代码,因此要仅将 CaptureSDK 包含在 Objective-C 项目中,您需要添加一个 桥接头文件。这将建立 Objective-C 和 Swift 之间的桥梁。

要添加桥接头文件,请遵循以下步骤

  1. 在您的项目文件夹中创建一个名为 myProject-Bridging-Header.h 的文件,并将它添加到您的 Xcode 项目中,然后将 #import <CaptureSDK/CaptureSDK.h> 添加到该文件中

  2. 然后,在目标(s)的 构建设置 中,而不是项目,将桥接头文件的路径添加到 Objective-C 桥接头 字段中

Bridging Header file to set up

或者

  1. 将一个 Swift 文件添加到您的 Xcode 项目中,它会提示您添加桥接头文件,会自动为您添加

Bridging Header file to set up

  1. #import <CaptureSDK/CaptureSDK.h> 添加到该桥接头文件中

  2. 如果您愿意使用 Capture Helper,请使用针对 Objective-C 设计的 SKTCaptureHelper