Quikkly是实现智能扫描仪的 easiest 方法。
功能
- 使用摄像头扫描
- 生成可扫描代码
- 将数据链接到可扫描代码
- 用Swift 4编写,支持Objective-C
要求
- iOS 8.0+
- Swift 4.1+ 或 Objective-C
安装
要使用此SDK,需要一个Quikkly应用密钥。有关更多信息,请访问此处。
CocoaPods
使用SDK与CocoaPods结合,请在您的podfile目标中添加以下行
use_frameworks!
pod 'Quikkly', :git => 'https://github.com/quikkly/ios-sdk.git'
手动
下载并将Quikkly.framework
作为嵌入的二进制文件添加到您的项目中。
使用
Objective-C 支持
Objective C类使用QK前缀。例如,Scannable变为QKScannable。
将@import Quikkly;
添加到Objective C文件,并在“构建设置” > “构建选项”中将“始终嵌入Swift标准库”标志设置为“是”。
设置
为了使用我们的SDK,在设置项目时,需要遵循一些先决条件步骤。
- 在您的 AppDelegate 中设置 Quikkly API 密钥。密钥的值将是您从 Quikkly 获得的 App 密钥(此处)。API 密钥必须有效,否则 SDK 的某些功能将无法使用。
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
// Quikkly framework setup
Quikkly.apiKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
return true
}
-
在 iOS 10+ 中,必须在
Info.plist
文件中设置 NSCameraUsageDescription 密钥,否则在请求访问相机时,应用程序将崩溃。 -
请确保在您的目标的
构建设置
>构建选项
>启用 Bitcode
中关闭 bitcode。不幸的是,我们目前无法提供 bitcode 支持。然而,我们正在努力使其在将来可用。
这不是一个通用框架。模拟器将无法工作,所以请确保选择了设备,否则 Swift 中的类甚至不可用。
可扫描模板
扫描和创建都有许多不同的格式。默认情况下,SDK 提供一组将在任何进一步设置下正常工作的模板,并且可以在 开发人员门户 上找到更多可用选项。包含这些受支持的模板的 blueprint 文件可以添加到应用程序包的 assets 中,并且需要在 AppDelegate 中指定文件名。
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
// Quikkly framework setup
Quikkly.apiKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Quikkly.blueprintFilename = "myBlueprintFilename"
return true
}
扫描
带有扫描视图相机流扫描器
ScanView 类显示相机流并提供一个委托模式来通知其父视图控制器有关检测到的可扫描内容。
func scanView(_ scanView: ScanView, didDetectScannables scannables: [Scannable]) {
// Handle detected scannables
if let scannable = scannables.first {
//do something with the scannable
self.statusLabel.text = "Scannable found: \(scannable.value)"
}
}
然后可以将检测到的 Scannable 对象链接起来,并基于其值触发任何操作。
当 ScanView 不在屏幕上时,应该暂停其检测器,当它可见时,应该使用这些方法恢复
self.scanView.start()
self.scanView.stop()
相机流不会暂停,只有检测器。
相机权限
为了使ScanView功能正常,用户必须接受相机权限对话框。如果拒绝权限,将显示默认提示,其中包含一个链接到应用设置页面的按钮。
ScanViewDelegate有一个方法用于通知其父对象关于权限请求的结果。通过返回false,不会显示用户的默认提示,并且可以其他方式处理。
import AVFoundation
func scanViewDidRequestCamera(status: AVAuthorizationStatus) -> Bool {
if status == .denied {
// show user hint
} else {
// hide user hint
}
return false // hide default
}
带有默认UI的扫描仪
为了简单和集成,提供了一种包含相机馈送和中性默认UI的视图控制器。必须将ScanViewController类子类化,并实现其ScanView的代理方法。
处理扫描事件的方式与ScanView相机馈送相同。以下是一个示例
func scanView(_ scanView: ScanView, didDetectScannables scannables: [Scannable]) {
// Handle detected scannables
if let scannable = scannables.first {
//execute action linked to the scannable's value property
self.performAction(forScannable: scannable)
//display activity indicator
self.showActivityIndicator()
}
}
请注意,它旨在不使用NavigationController使用,不应推送到导航堆栈中,而应该以模态方式呈现。
要显示和隐藏活动指示器,请调用self.showActivityIndicator()
和self.hideActivityIndicator()
。状态标签也可以修改,并且可以更改其可见性。
无UI检测
Scannable类也有一些静态方法用于在CGImage中检测可扫描对象。
Scannable.detect(inImage: cgImage) { (scannables) in
if let scannable = scannable.first {
//do something with this object
}
}
生成可扫描对象
扫描条码可以在本地生成,无需任何后端集成。实例化需要一个值、一个模板标识符以及一个用于视觉表示的Skin对象,与ScannableView(下文解释)一起使用。
let skin = ScannableSkin()
//set the skin object's properties (colour hex codes, image url, etc)
...
let scannable = Scannable(withValue: 42587309, template: "template0002style1" skin: skin)
如果模板标识符为nil,将使用默认模板。请注意,某些模板可能不支持完整的64位整数范围。
显示扫描条码
只需设置ScannableView实例的scannable属性。
self.scannableView = ScannableView()
self.scannableView.scannable = scannable
映射数据
Quikkly后端可用于将扫描条码映射到数据。
Scannable类提供了一个初始化器用于实例化。
let dict:[String:Any] = ["actionId":1,
"actionData":"This string could be displayed when the scannable gets detected"]
Scannable(withMappedData: dict, template: nil, skin: nil, completion: { (success, scannable) in
if success {
//handle successfully created scannable
} else {
//handle failure
}
})
以下是如何查询扫描条码对象中映射数据的示例
scannable.getMappedData({ (data) in
if let mappedData = data {
//use data to perform action
} else {
//no mapped data available for this scannable
}
})
示例应用
有关示例应用,请参阅此处。