Cordova 设备在 iOS 中未触发

Posted

技术标签:

【中文标题】Cordova 设备在 iOS 中未触发【英文标题】:Cordova deviceready not firing in iOS 【发布时间】:2016-04-18 12:42:21 【问题描述】:

我正在使用 Ionic 来构建我的混合应用程序。 在 android 上,我的应用运行良好。现在我正在为 ios 构建它,但我的整个内容都包含在里面

document.addEventListener('deviceready', function () 
  console.log('dashboard -> device ready');
  // copy database to the device
  DbAccess.copyDb();
, false);

在 iOS 中不会触发。

我当时用iOS模拟器试了一下

$ ionic emulate ios --livereload

并检查了 console.log。

结果:

1     709252   log      deviceready has not fired after 5 seconds.
2     709253   log      Channel not fired: onCordovaInfoReady

我遵循了我在这里和通过 Google 找到的建议,但不幸的是没有任何成功(删除 ios 并重新添加等)

我的版本:

Cordova: 6.1.1
Ionic: 1.7.14

我的 index.html 中的安全设置:

<meta http-equiv="Content-Security-Policy" content="default-src *; script-src 'self' 'unsafe-inline' 'unsafe-eval' *; style-src  'self' 'unsafe-inline' *">

在我的 config.xml 中:

<access origin="geo:*" launch-external="yes"/>
<access origin="tel:*" launch-external="yes"/>
<access origin="mailto:*" launch-external="yes"/>

我真的不知道在哪里可以解决这个错误。也许它与 Content-Security-Policy 有关,但我不知道如何解决。

提前感谢您的帮助!

编辑: 我现在把我的控制器包裹在里面了

$ionicPlatform.ready(function() ...);

例如:

    var dashboardCtrl = function ($scope, $ionicPlatform, $cordovaDevice, DbAccess) 
      console.log('dashboardCtrl');
      $ionicPlatform.ready(function () 
        console.log('dashboard -> platform ready');
        document.addEventListener('deviceready', function () 
          console.log('dashboard -> device ready');
          // copy database to the device
          DbAccess.copyDb();
        , false);
      );
    ;
    dashboardCtrl.$inject = ['$scope', '$ionicPlatform', '$cordovaDevice', 'DbAccess'];

当我使用 iOS 模拟器对其进行测试时,它仍然失败并在 console.log 中抛出“deviceready”错误。

【问题讨论】:

【参考方案1】:

如果您使用 Ionic,为什么要手动使用 document.addEventListener('deviceready', function () $ionicPlatform.ready 会给您与科尔多瓦的“设备就绪”相同的结果,无需再次调用设备就绪。

另外,你不应该把ready函数放在控制器的自定义函数中。 不应该这样使用

$scope.logInSubmit = function (details)  

var submit = function () 

如果您查看 Ionic 示例,您将更好地了解这两个项目(例如:ionic start myApp tabs)

在 Ionic 中,你的代码可以是这样的

$ionicPlatform.ready(function() 
  console.log('dashboard -> device ready');
  //you can load your plugins or custom objects inside this device ready

【讨论】:

谢谢@Pyro!我不知道“document.addEventListener('deviceready', function ()”已经包含了“$ionicPlatform.ready” @StefanBlattmann 额外参考:ionicframework.com/docs/api/utility/ionic.Platform 如果此答案对您有帮助,请勾选正确答案。谢谢 @Pyro 在控制器内部使用 ready 函数有什么问题?如果您想在控制器内部执行一些插件操作,则必须等到设备准备就绪。 @SimonSchüpbach 可以在任何控制器中使用它。我是说在默认函数以外的任何控制器的自定义函数中调用都不好,也更新了答案【参考方案2】:

我用

捕捉事件
 $ionicPlatform.ready(function () 
...
)

它可以在真实设备上运行,我从未在模拟器上测试过。 我不认为 Content-Security-Policy 是您没有收到该事件的原因。

【讨论】:

谢谢@simon-schüpbach!我现在更改了我的代码(请参阅我编辑的帖子),但它仍然在模拟器中失败。 我在我的 Content-Security-Policy 中添加了 gap:// ready ,之后,一切都按预期工作。

以上是关于Cordova 设备在 iOS 中未触发的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 设备上的 iframe 中未触发 Click/Tap 事件

在 Cordova 3.2.0 中未触发 deviceready 事件

未找到 Cordova_Plugins.js

一些 Cordova 插件在 iOS 模拟器中未定义

Cordova iOS deviceready 永远不会触发

离子屏幕方向 Cordova 插件在 iOS 环境中未锁定为纵向模式