PDF417.mobi SDK for iOS
PDF417.mobi SDK for iOS 允许您在您的应用程序中执行各种条码扫描。您可以通过以下说明将 SDK 集成到您的应用程序中,并使您的应用程序能够扫描和处理以下条码标准的数据
要在您的应用程序中使用 PDF417.mobi,需要有效的许可证密钥。您可以通过注册 Microblink 控制台 来获取演示许可证密钥。注册后,您将为您的应用程序生成许可证密钥。许可证密钥绑定到您的应用程序的 bundle identifier,因此请在询问时确保输入正确的 bundle identifier。
有关如何将 PDF417.mobi SDK 集成到您的应用程序中的更多信息,请参阅以下说明。请确保阅读 发行说明 了解最新更改和改进。
目录
需求
SDK 包含 Microblink 框架和一个或多个示例应用程序,这些示例应用程序展示了框架的集成。该框架可在 iOS 8.0 或更高版本、iPhone 4S 或更高版本和 iPad 2 或更高版本上部署。
当从摄像头获得的图像对焦时,SDK 的性能显著提高。因此,iPad 2 和第四代 iPod Touch 设备(没有自动对焦摄像头的设备)上的 SDK 性能可能会较低。
快速入门
使用 PDF417.mobi SDK 入门
本快速入门指南将帮助您尽快设置扫描。本指南中描述的所有步骤均为集成步骤所必需。
本指南设置了基本的 PDF417 和 QR 码扫描功能,并且与 pdf417-sample 应用程序紧密相关。我们强烈建议您尝试运行样品应用程序。样品应用程序应能在您的设备上编译和运行,并可在 iOS 模拟器上运行。
样品应用程序的源代码可以在集成过程中作为参考。
1. 初始集成步骤
使用 CocoaPods
-
CocoaPods 是一款 Objective-C 的依赖管理器,它可以自动简化使用第三方库的过程。
-
如果您想使用 v1.4.0 或更高版本,您需要通过运行以下命令安装 Git Large File Storage:
brew install git-lfs
git lfs install
-
请确保在安装 Git LFS 后重新启动您的控制台。
-
将由 CocoaPods 管理的项目的依赖关系在名为
Podfile
的文件中指定。在与您的 Xcode 项目(.xcodeproj
)文件相同的目录中创建此文件。 -
将以下行复制并粘贴到 TextEdit 窗口中:
platform :ios, '9.0'
pod 'PPpdf417', '~> 7.1.0'
- 安装项目中的依赖项
$ pod install
- 从现在开始,请确保在构建项目时始终打开生成的 Xcode 工作空间(
.xcworkspace
),而不是项目文件。
open <YourProjectName>.xcworkspace
不使用 CocoaPods 的集成
- 下载 Pdf417.mobi SDK 至您的文件系统,或通过运行以下命令克隆此 git 仓库。
git clone [email protected]:PDF417/pdf417-ios.git
-
将 MicroBlink.framework 和 MicroBlink.bundle 拷贝到您的项目文件夹中。
-
在您的 Xcode 项目中,打开项目导航器。将 MicroBlink.framework 和 MicroBlink.bundle 文件拖动到项目中,最好在 Frameworks 组中,与其他您所使用的框架一起。当被要求时,选择 "创建组",而不是 "创建文件夹引用" 选项。
- 由于 Microblink.framework 是一个动态框架,您还需要将其添加到目标的 "一般" 设置中的 "嵌入的二进制" 部分。
-
将额外的框架和库包括到您的目标设置中的 "链接框架和库" 部分。
- libc++.tbd
- libz.tbd
- libiconv.tbd
- AudioToolbox.framework
- CoreMedia.framework
- AssetsLibrary.framework
2. 引用头文件
在您想要使用扫描功能的文件中放置导入指令。
Swift
import MicroBlink
Objective-C
#import <MicroBlink/MicroBlink.h>
3. 启动扫描过程
-
在开始识别过程之前,您需要从 Microblink 仪表板 获取许可证。注册后,您将为您的应用程序生成一个试用许可证。许可证绑定到您的应用程序的 Bundle ID,所以请确保在要求时输入正确的 Bundle ID。
您必须确保在实例化 SDK 中的任何其他类之前设置许可证密钥,否则您会在运行时获得异常。
Swift
/** First, set license key as soon as possible */ MBMicroblinkSDK.sharedInstance().setLicenseResource("<license_name>", withExtension: "<extension>", inSubdirectory: "<subdirectory-name>", for: <bundle>)
Objective-C
/** First, set license key as soon as possible */ [[MBMicroblinkSDK sharedInstance] setLicenseResource:@"<license_name>" withExtension:@"t<extension>" inSubdirectory:@"<subdirectory-name>" forBundle:<bundle>];
-
要启动扫描过程,首先决定在哪里添加扫描功能。通常,扫描库的用户有一个按钮,当点击该按钮时,将启动扫描过程。然后,在该按钮的触摸处理器中放置初始化代码。以下我们列出了在触摸处理器方法中查看的初始化代码。保留您希望使用的识别器的引用非常重要。
Swift
@IBAction func didTapScan(_ sender: AnyObject) { /** Create barcode recognizer */ self.barcodeRecognizer = MBBarcodeRecognizer() self.barcodeRecognizer?.scanQrCode = true self.pdf417Recognizer = MBPdf417Recognizer() /** Create barcode settings */ let settings : MBBarcodeOverlaySettings = MBBarcodeOverlaySettings() /** Crate recognizer collection */ let recognizerList = [self.barcodeRecognizer!, self.pdf417Recognizer!] let recognizerCollection : MBRecognizerCollection = MBRecognizerCollection(recognizers: recognizerList) /** Create your overlay view controller */ let barcodeOverlayViewController : MBBarcodeOverlayViewController = MBBarcodeOverlayViewController(settings: settings, recognizerCollection: recognizerCollection, delegate: self) /** Create recognizer view controller with wanted overlay view controller */ let recognizerRunneViewController : UIViewController = MBViewControllerFactory.recognizerRunnerViewController(withOverlayViewController: barcodeOverlayViewController) /** Present the recognizer runner view controller. You can use other presentation methods as well (instead of presentViewController) */ self.present(recognizerRunneViewController, animated: true, completion: nil) }
Objective-C
- (IBAction)didTapScan:(id)sender { /** Create recognizers */ self.barcodeRecognizer = [[MBBarcodeRecognizer alloc] init]; self.barcodeRecognizer.scanQR = YES; self.pdf417Recognizer = [[MBPdf417Recognizer alloc] init]; MBBarcodeOverlaySettings* settings = [[MBBarcodeOverlaySettings alloc] init]; NSMutableArray<MBRecognizer *> *recognizers = [[NSMutableArray alloc] init]; [recognizers addObject:self.barcodeRecognizer]; [recognizers addObject:self.pdf417Recognizer]; /** Create recognizer collection */ MBRecognizerCollection *recognizerCollection = [[MBRecognizerCollection alloc] initWithRecognizers:recognizers]; MBBarcodeOverlayViewController *overlayVC = [[MBBarcodeOverlayViewController alloc] initWithSettings:settings recognizerCollection:recognizerCollection delegate:self]; UIViewController<MBRecognizerRunnerViewController>* recognizerRunnerViewController = [MBViewControllerFactory recognizerRunnerViewControllerWithOverlayViewController:overlayVC]; /** Present the recognizer runner view controller. You can use other presentation methods as well (instead of presentViewController) */ [self presentViewController:recognizerRunnerViewController animated:YES completion:nil]; }
-
在这个例子中,我们使用具有
MBBarcodeOverlayViewControllerDelegate
的MBBarcodeOverlayViewController
。必须遵守该协议。我们将在 高级集成部分 详细讨论协议。您可以通过MBBarcodeOverlayViewControllerDelegate
协议中的方法之一获取扫描结果。Swift
// MARK: MBBarcodeOverlayViewControllerDelegate extension ViewController : MBBarcodeOverlayViewControllerDelegate { func barcodeOverlayViewControllerDidFinishScanning(_ barcodeOverlayViewController: MBBarcodeOverlayViewController, state: MBRecognizerResultState) { let recognizerRunnerViewController = barcodeOverlayViewController.recognizerRunnerViewController as MBRecognizerRunnerViewController /** This callback is done on background thread and you need to be careful to not do any UI operations on it */ recognizerRunnerViewController.pauseScanning() var message: String = "" var title: String = "" if (self.barcodeRecognizer!.result.resultState == MBRecognizerResultState.valid) { // Result handling } /** Needs to be called on main thread beacuse everything prior is on background thread */ DispatchQueue.main.async { // UI actions } } func barcodeOverlayViewControllerDidTapClose(_ barcodeOverlayViewController: MBBarcodeOverlayViewController) { // Close button tapped on overlay view controller } }
Objective-C
#pragma mark - MBBarcodeOverlayViewControllerDelegate - (void)barcodeOverlayViewControllerDidFinishScanning:(MBBarcodeOverlayViewController *)barcodeOverlayViewController state:(MBRecognizerResultState)state { /** This callback is done on background thread and you need to be careful to not do any UI operations on it */ [barcodeOverlayViewController.recognizerRunnerViewController pauseScanning]; if (self.barcodeRecognizer.result.resultState == MBRecognizerResultStateValid) { } /** Needs to be called on main thread beacuse everything prior is on background thread */ dispatch_async(dispatch_get_main_queue(), ^{ // UI actions }); } - (void)barcodeOverlayViewControllerDidFinishScanning:(MBBarcodeOverlayViewController *)barcodeOverlayViewController { // Close button tapped on overlay view controller }
高级PDF417.mobi集成说明
本节涵盖了PDF417.mobi集成的更详细高级内容。
- 第一部分 将涉及使用SDK提供的UI时可能进行的自定义。
- 第二部分 将描述如何将
MBRecognizerRunnerViewController的代理
嵌入到您的UIViewController
中,目的是创建自定义的扫描UI,同时仍然使用SDK的摄像机管理功能。 - 第三部分 将描述如何使用
MBRecognizerRunner
(直接API)从UIImage
直接进行识别,无需摄像机或识别由自定义摄像机管理获得的摄像机帧。 - 第四部分 将描述识别器概念和可用的识别器。
内置 MBOverlayViewControllers
和 MBOverlaySubviews
的UI自定义
内置覆盖视图控制器和覆盖子视图
PDF417.mobi SDK中有几个内置的覆盖视图控制器和扫描子视图覆盖,您可以使用它们来进行扫描。
MBBarcodeOverlayViewController
MBBarcodeOverlayViewController
是专门用于执行多种条形码扫描的叠加视图控制器。它有一个 MBBarcodeOverlayViewControllerDelegate
代理,可以开箱即用地用于执行默认 UI 的扫描。
使用 MBBarcodeOverlayViewController
MBBarcodeOverlayViewController
是一个内置的叠加视图控制器,非常适合在扫描多种条形码时使用。正如你在 快速入门 中看到的,MBBarcodeOverlayViewController
有一个 MBBarcodeOverlaySettings
。以下是如何使用和初始化 MBBarcodeOverlayViewController
的示例
Swift
/** Create your overlay view controller */
let barcodeOverlayViewController : MBBarcodeOverlayViewController = MBBarcodeOverlayViewController(settings: barcodeSettings, andDelegate: self)
/** Create recognizer view controller with wanted overlay view controller */
let recognizerRunneViewController : UIViewController = MBViewControllerFactory.recognizerRunnerViewController(withOverlayViewController: barcodeOverlayViewController)
/** Present the recognizer runner view controller. You can use other presentation methods as well (instead of presentViewController) */
self.present(recognizerRunneViewController, animated: true, completion: nil)
Objective-C
MBBarcodeOverlayViewController *overlayVC = [[MBBarcodeOverlayViewController alloc] initWithSettings:settings andDelegate:self];
UIViewController<MBRecognizerRunnerViewController>* recognizerRunnerViewController = [MBViewControllerFactory recognizerRunnerViewControllerWithOverlayViewController:overlayVC];
/** Present the recognizer runner view controller. You can use other presentation methods as well (instead of presentViewController) */
[self presentViewController:recognizerRunnerViewController animated:YES completion:nil];
如你所见,当初始化 MBBarcodeOverlayViewController
时,我们将代理属性作为 self
发送。为了获取结果,我们需要符合 MBBarcodeOverlayViewControllerDelegate
协议。
自定义叠加视图控制器
叠加视图控制器是所有叠加视图的抽象类。
其责任是提供有意义的用户交互界面。
用户需要允许执行的动作包括
- 直观且具有意义的方式引导用户完成扫描过程。这通常是通过显示“视场”来完成的,用户需要将扫描对象放置在视场中
- 一个取消扫描的方式,通常使用“取消”或“后退”按钮
- 一个开关灯(即“手电筒”)按钮的方式
PDF417.mobi SDK 为每种特定用途都提供了自己的默认叠加视图控制器实现。你的实现应尽可能模仿默认实现,因为它已经过与最终用户的彻底测试。同时,它与底层扫描技术紧密匹配。
例如,扫描技术通常在用户将设备的相机正确放置在扫描物体上方后,能非常快地给出结果。这意味着扫描进度条对用户来说并不特别有用。用户大部分时间都在调整设备的相机位置。这是一个例子,它展示了默认相机叠加视图背后的谨慎决策。
1. 初始化
要使用MicroBlink的相机视图与自定义叠加视图,您必须首先继承MBOverlayViewController
并实现符合条件的叠加视图行为。
2. 协议
一共有五个MBRecognizerRunnerViewController
协议。
五个RecognizerRunnerView
协议:
MBScanningRecognizerRunnerViewDelegate
MBDetectionRecognizerRunnerViewDelegate
MBOcrRecognizerRunnerViewDelegate
MBDebugRecognizerRunnerViewDelegate
MBRecognizerRunnerViewControllerDelegate
MBCustomOverlayViewController
类需要被自定义视图控制器继承,并且需要遵守MBScanningRecognizerRunnerViewControllerDelegate
。它包含您自定义视图控制器所需的所有属性。
在viewDidLoad
中,必须在super
属性上设置scanningRecognizerRunnerViewControllerDelegate
。
Swift和Objective-C
super.scanningRecognizerRunnerViewControllerDelegate = self;
3. 叠加子视图
开发者需要知道需要哪些子视图来自定义视图控制器。如果您想使用内置实现,建议使用MBModernViewfinderOverlaySubview
。可以在viewDidLoad
方法中初始化。
Swift
viewfinderSubview = MBModernViewfinderOverlaySubview()
viewfinderSubview.moveable = true
view.addSubview(viewfinderSubview)
Objective-C
self.viewfinderSubview = [[MBModernViewfinderOverlaySubview alloc] init];
self.viewfinderSubview.delegate = self.overlaySubviewsDelegate;
self.viewfinderSubview.moveable = YES;
[self.view addSubview:self.viewfinderSubview];
4. 初始化
在《快速入门》指南中,展示了如何使用MBBarcodeOverlayViewController
。现在您可以将MBBarcodeOverlayViewController
与CustomOverlayViewController
交换使用。
Swift
let recognizerRunnerViewController : UIViewController = MBViewControllerFactory.recognizerRunnerViewController(withOverlayViewController: CustomOverlayViewController)
Objective-C
UIViewController<MBRecognizerRunnerViewController>* recognizerRunnerViewController = [MBViewControllerFactory recognizerRunnerViewControllerWithOverlayViewController:CustomOverlayViewController];
直接处理API
本指南将简要介绍如何使用PDF417.mobi SDK处理UIImage对象,而不启动相机视频捕获。
使用此功能可以解决各种用例,如:-识别相册中的图像文本 -拍摄全分辨率照片并发送给处理 -扫描电子邮件中的图像中的条形码等。
DirectAPI示例演示应用将呈现UIImagePickerController用于拍摄全分辨率照片,然后使用MicroBlink SDK通过直接处理API进行处理以获取扫描结果。
Direct处理API由MBRecognizerRunner
处理。这是一个处理图像的类。它还包括诸如MBRecognizerRunnerViewController
协议。开发者可以选择遵守哪个协议。
MBScanningRecognizerRunnerDelegate
MBDetectionRecognizerRunnerDelegate
MBDebugRecognizerRunnerDelegate
MBOcrRecognizerRunnerDelegate
在示例中,我们遵守了MBScanningRecognizerRunnerDelegate
协议。
要启动扫描过程,首先决定在您的应用中添加扫描功能的哪个位置。通常,扫描库的用户有一个按钮,当点击时,开始扫描过程。然后在该按钮的触摸处理程序中放置初始化代码。以下是我们将初始化代码列出的方式,它看起来像是一个触摸处理程序方法。
Swift
func setupRecognizerRunner() {
var recognizers = [AnyHashable]() as? [MBRecognizer]
pdf417Recognizer = MBPdf417Recognizer()
recognizers.append(pdf417Recognizer)
let settings = MBSettings()
settings.uiSettings.recognizerCollection = MBRecognizerCollection(recognizers: recognizers)
recognizerRunner = MBRecognizerRunner(settings: settings as? [String : Any] ?? [String : Any]())
recognizerRunner.scanningRecognizerRunnerDelegate = self
}
func processImageRunner(_ originalImage: UIImage) {
let image = MBImage(uiImage: originalImage)
image.cameraFrame = true
image.orientation = PPProcessingOrientationLeft
let _serialQueue = DispatchQueue(label: "com.microblink.DirectAPI-sample")
_serialQueue.async(execute: {() -> Void in
self.recognizerRunner.processImage(image)
})
}
func recognizerRunnerDidFinish(_ recognizerRunner: MBRecognizerRunner, state: MBRecognizerResultState) {
if pdf417Recognizer.result.resultState == MBRecognizerResultStateValid {
// Handle result
}
}
Objective-C
- (void)setupRecognizerRunner {
NSMutableArray<MBRecognizer *> *recognizers = [[NSMutableArray alloc] init];
NSError *error;
self.pdf417Recognizer = [[MBPdf417Recognizer alloc] init];
[recognizers addObject:self.pdf417Recognizer];
MBSettings* settings = [[MBSettings alloc] init];
settings.uiSettings.recognizerCollection = [[MBRecognizerCollection alloc] initWithRecognizers:recognizers];
self.recognizerRunner = [[MBRecognizerRunner alloc] initWithSettings:settings];
self.recognizerRunner.scanningRecognizerRunnerDelegate = self;
}
- (void)processImageRunner:(UIImage *)originalImage {
MBImage *image = [MBImage imageWithUIImage:originalImage];
image.cameraFrame = YES;
image.orientation = PPProcessingOrientationLeft;
dispatch_queue_t _serialQueue = dispatch_queue_create("com.microblink.DirectAPI-sample", DISPATCH_QUEUE_SERIAL);
dispatch_async(_serialQueue, ^{
[self.recognizerRunner processImage:image];
});
}
#pragma mark - MBScanningRecognizerRunnerDelegate
- (void)recognizerRunnerDidFinish:(MBRecognizerRunner *)recognizerRunner state:(MBRecognizerResultState)state {
if (self.pdf417Recognizer.result.resultState == MBRecognizerResultStateValid) {
// Handle result
}
}
现在您已经了解了如何实现直接处理API。
本质上,此API由两个步骤组成
- 扫描器初始化。
- 对每个UIImage或CMSampleBufferRef调用processImage:方法。
MBRecognizer
和可用的识别器
MBRecognizer
的概念
MBRecognizer
是SDK中的基本处理单元。其主要功能是处理图像并从中提取有价值的信息。正如您将在稍后所看到的,SDK有很多不同的MBRecognizer
对象,具有各种作用。
每个MBRecognizer
都有一个包含从图片中提取出的数据的MBRecognizerResult
对象。这个MBRecognizerResult
对象是相应MBRecognizer
对象的成员,其生命周期与其父MBRecognizer
对象绑定。如果您希望您的MBRecognizerRecognizer
对象在其父MBRecognizer
对象生命周期之外仍然存在,您必须通过调用其方法copy
来创建它的副本。
当MBRecognizer
对象工作时,它会改变其内部状态及其结果。MBRecognizer
对象的MBRecognizerResult
总是从Empty
状态开始。当相应的MBRecognizer
对象执行给定图像的识别时,其MBRecognizerResult
可以保持Empty
状态(如果在MBRecognizer
未执行识别的情况下),移动到Uncertain
状态(如果在MBRecognizer
执行了识别,但没有提取所有必需信息),或者移动到Valid
状态(如果在MBRecognizer
执行了识别并且成功从图像中提取了所有必需信息的情况下)。
一旦在给定的MBRecognizerCollection
中的MBRecognizer
对象的MBRecognizerResult
变为Valid
状态,就会在执行后台处理的相同线程上调用onScanningFinished
回调,您将有机会检查每个MBRecognizer
对象的MBRecognizerResult
对象,看看哪个已移动到Valid
状态。
一旦onScanningFinished
方法完成,MBRecognizerRunnerViewController
将继续以相同的MBRecognizer
对象处理新的相机帧,除非已“暂停”。处理续续或重置识别将修改或重置所有MBRecognizer
对象的MBRecognizerResult
。当使用内置活动时,一调用onScanningFinished
,内置活动就会暂停MBRecognizerRunnerViewController
并开始完成活动,同时保存带有活动MBRecognizer
的MBRecognizerCollection
。
MBRecognizerCollection
概念
MBRecognizerCollection
是围绕 MBRecognizer
对象的包装器,它包含一个 MBRecognizer
对象数组,可用作将 MBRecognizer
对象提供给 MBRecognizerRunner
或 MBRecognizerRunnerViewController
以进行处理。
MBRecognizerCollection
总是通过带有初始化器 [[MBRecognizerCollection alloc] initWithRecognizers:recognizers]
的 MBRecognizer
对象数组的构造,这些对象需要进行识别(即它们的属性必须已经调整)。
MBRecognizerCollection
管理识别过程中MBRecognizer
对象链。当有新图像到达时,它由链中的第一个MBRecognizer
处理,然后是第二个,依此类推,直到一个MBRecognizer
对象的结果状态变为Valid
,或者链中的全部MBRecognizer
对象都被调用(没有获取到Valid
结果状态)。
你不能更改链中MBRecognizer
对象的顺序 - 无论你如何将MBRecognizer
对象提供给MBRecognizerCollection
,它们都内部排序以提供最佳性能和准确性。此外,为了使 SDK 能够以最佳方式对识别链中的MBRecognizer
对象进行排序,不允许链中有多个相同类型的MBRecognizer
对象实例。尝试这样做会导致应用程序崩溃。
可用识别器列表
本节将列出 PDF417.mobi SDK 中所有可用的 MBRecognizer
对象,它们的目的,以及如何使用它们以获得最佳性能和用户体验的建议。
帧抓取识别器
MBFrameGrabberRecognizer
是 SDK 中最简单的识别器,因为它不对给定的图像进行任何处理,而是直接将其返回到 onFrameAvailable
。它的结果永远不会从空状态改变。
此识别器最适合与 MBRecognizerRunnerViewController
一起捕获相机帧。请注意,发送到 onFrameAvailable
的 MBImage
是临时的,它们的内部缓冲区仅在 onFrameAvailable
方法执行期间有效 - 一旦方法结束,MBImage
对象的所有内部缓冲区都将被丢弃。如果您需要存储 MBImage
对象以供以后使用,您必须通过调用 copy
来创建其副本。
成功帧捕获识别器
MBSuccessFrameGrabberRecognizer
是一个特殊的 MBecognizer
,它封装另一个 MBRecognizer
并在处理图像时假装成它。然而,当被假装的 MBRecognizer
将其 MBRecognizerResult
改变为 Valid
状态时,MBSuccessFrameGrabberRecognizer
将捕获图像并将其保存在其自己的 MBSuccessFrameGrabberRecognizerResult
对象中。
由于 MBSuccessFrameGrabberRecognizer
假装其奴隶 MBRecognizer
对象,因此无法将具体的 MBRecognizer
对象和封装它的 MBSuccessFrameGrabberRecognizer
同时放入同一个 MBRecognizerCollection
- 这样做会产生与在 MBRecognizerCollection
中提供相同类型的两个 MBRecognizer
实例相同的结果 - 它会导致您的应用程序崩溃。
此识别器最适合于需要捕获在某个 MBRecognizer
对象在其 MBRecognizerResult
变为 Valid
时正在处理的确切图像的情况。当发生这种情况时,MBSuccessFrameGrabberRecognizer
的 MBSuccessFrameGrabberRecognizerResult
也将变为 Valid
并包含所描述的图像。
PDF417 识别器
《MBPdf417Recognizer》是一个专门识别PDF417 2D条码
的识别器。PDF417 2D条码仅供识别PDF417 2D条码 - 如需识别其他条码,请参考BarcodeRecognizer。
该识别器可以在任何覆盖视图控制器中使用,但与针对条码扫描进行优化的MBBarcodeOverlayViewController
配合使用效果最佳。
条码识别器
MBBarcodeRecognizer
是一个专门用于扫描各种类型条码的识别器。当扫描条码时,这是您的首选识别器,因为它支持许多条码类型,包括PDF417 2D条码,从而使得PDF417识别器可能变得冗余,仅保留了其简单性。
您可以在识别器中启用多个条码类型,但请注意,启用更多条码类型会影响扫描性能 - 条码类型越多,整体识别性能越慢。另外,请注意,一些简单条码类型(如缺乏适当冗余的Code 39)可以在更复杂的条码中识别,特别是2D条码,如PDF417。
该识别器可以在任何覆盖视图控制器中使用,但与针对条码扫描进行优化的MBBarcodeOverlayViewController
配合使用效果最佳。
故障排除
集成问题
如果遇到SDK集成问题,首先请确保您已经按照集成说明在XCode中进行了集成。
如果您已按照XCode集成说明进行操作并仍在遇到集成问题,请联系我们help.microblink.com。
SDK问题
在使用SDK过程中出现问题时,您应按照以下步骤操作
授权问题
如果您遇到“无效的许可证密钥”错误或其他与许可证相关的问题(例如,某个应该启用的功能未启用或相机顶部有水印),首先检查控制台。所有与许可证相关的问题都记录在错误日志中,因此可以轻松确定出了什么问题。
当您确定了与许可证相关的问题或您不理解日志内容时,应联系我们 help.microblink.com。在联系我们时,请确保提供以下信息
- 您应用的精确的Bundle ID(从您的
info.plist
文件中获取) - 导致问题的许可证
- 请强调您报告的是与PDF417.mobi SDK的iOS版本相关的问题
- 如果您不确定问题,还应提供包含许可证错误的控制台摘要
其他问题
如果您在扫描某些物品时遇到问题,或在特定设备上出现不期望的行为、PDF417.mobi SDK内部的崩溃或其他未提及的问题,请按照以下步骤操作
- 请在help.microblink.com描述您的问题,并提供以下信息
- 上一步骤中获得的日志文件
- 您要扫描的物品的高分辨率扫描或照片
- 您所使用的设备信息
- 请强调您报告的是与PDF417.mobi SDK的iOS版本相关的问题
常见问题及已知问题
以下是常见问题的列表和相应的解决方案,以及SDK中的已知问题及其解决方案。
在演示中一切正常,但切换到生产许可证后得到 NSError
与 MBMicroblinkSDKRecognizerErrorDomain
和 MBRecognizerFailedToInitalize
代码,当我构造特定的 MBRecognizer
对象时
每个许可证密钥包含有关可以和不可以使用的功能的信息。这个 NSError
指示您的生产许可证不允许使用特定的 MBRecognizer
对象。您应该联系 支持 来检查提供的许可证是否正确,并且它是否真的包含您购买的所有功能。
我在使用试用许可证密钥时得到 NSError
与 MBMicroblinkSDKRecognizerErrorDomain
和 MBRecognizerFailedToInitalize
代码
每次您构造任何 MBRecognizer
对象或,检查许可证是否允许使用该对象都将执行。如果在构造该对象之前未设置许可证,您将得到 NSError
与 MBMicroblinkSDKRecognizerErrorDomain
和 MBRecognizerFailedToInitalize
代码。我们建议尽早在您的应用程序中设置许可证。
在架构 armv7 上未定义符号
确保您根据快速入门显示的方式将应用程序链接到 iconv 和 Accelerate 框架。如果您正在使用 Cocoapods,请确保在安装 pods 之前已安装 git-lfs
。如果您仍然遇到此错误,请转到项目文件夹并执行命令 git-lfs pull
。
在我的 didFinish
回调中,我的 MBRecognizer
里面有结果,但当扫描活动结束时,结果消失了
这种情况通常发生在使用 MBRecognizerRunnerViewController
并忘记在 didFinish
回调中暂停它时出现。然后,一旦发生 didFinish
,结果就因为在您的 didFinish
回调结束和扫描活动实际完成之间 MBRecognizer
执行的附加处理而发生变化或重置。有关 MBRecognizer
对象的状态化更多信息,请参阅 此部分。
提交应用至 App Store 时的不支持的架构
Microblink.framework 是一个动态框架,它包含所有架构的字节码 - 设备和模拟器。如果您打算提取用于非正式发布的手动安装.ipa 文件,则需要预处理该框架以删除模拟器架构。
理想的解决方案是在嵌入式框架构建阶段之后添加一个构建阶段,从中去除嵌入框架的不需要的切片。
构建步骤基于以下提供的内容: http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
其他信息
完整的 API 参考在这里可以找到。
如有任何其他问题,请随时通过 help.microblink.com 联系我们。