旧 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 回调里调用。普通浏览器的弹窗回退不等于真机插件已经工作,相机权限、取消与错误路径仍需在目标平台验证。