旧 Ionic 工程常通过 ngCordova 调用原生插件,使用 $cordovaBarcodeScanner、$cordovaDialogs 等服务。这里的代码属于 AngularJS/ngCordova 风格,不是现代 Angular 的注入和安装教程。
先分清封装和原生入口
插件提供原生能力,封装库再把回调转换成 Promise。以对话框为例:
// ngCordova:依赖注入得到 $cordovaDialogs 后
$cordovaDialogs.alert('操作已完成', '提示', '知道了')
.then(function () {
console.log('对话框已关闭');
});
// 原生 Cordova Dialogs:第二个参数是回调
navigator.notification.alert(
'操作已完成',
function () { console.log('对话框已关闭'); },
'提示',
'知道了'
);
两种写法参数位置不同,不能混用。ngCordova Dialogs 封装源码
扫码完成,也可能是用户取消
下面示意旧封装的调用边界。前提是已在 Cordova 容器安装对应插件、加载封装,并在设备就绪后调用:
$cordovaBarcodeScanner.scan().then(function (result) {
if (result.cancelled) {
console.log('用户取消扫码');
return;
}
console.log('格式:', result.format);
console.log('内容:', result.text);
}, function (error) {
console.error('扫码失败', error);
});
读取到文本不代表它符合业务规则;二维码即使包含 URL,也应先校验,不要直接执行内容或自动跳转。原生插件同样返回 text、format、cancelled 等结果,但采用自己的回调签名。BarcodeScanner 项目说明
encode 用于生成编码内容,与 scan 不同。旧示例对 encode 还留有功能不可用的说明,因此不能把它当作所有平台都能运行的保证。
confirm、prompt 和 beep
在对应 ngCordova 封装中,confirm 的 Promise 返回按钮索引;prompt 返回包含 buttonIndex 和 input1 的对象。索引要结合按钮数组处理,不能假定取消永远等于某个业务动作。
beep 的 repetitions 是响声次数,不是输入框延迟秒数:
$cordovaDialogs.beep(3);
原生 alert、confirm、prompt 和 beep 的签名及平台差异可查 Cordova 8.x Dialogs 归档文档。
这些原生能力应等待 deviceready;在 AngularJS 工程中也可在正确注入的 $ionicPlatform.ready 回调里调用。普通浏览器的弹窗回退不等于真机插件已经工作,相机权限、取消与错误路径仍需在目标平台验证。