在iOS 10中,deviceready只有在30秒后才会触发。

7

当我在iOS设备上运行我的Ionic应用时,deviceready事件不触发或者触发非常晚。

ionic run ios --device -lcs

我使用ionic plugin rm ...删除了所有插件,删除了plugins/目录中的内容,并重新安装了它们。我还使用ionic platform rm/add ios删除和重新安装了ios平台。
我卡在这里。
iPhone(6+)运行iOS 10。
我正在使用ionic 1和最新的ionic CLI。 编辑:我逐个删除了所有插件,似乎问题是由cordova-plugin-network-information和cordova-plugin-device引起的。
Process 663 detached
(lldb) 
(node:26790) DeprecationWarning: Using Buffer without `new` will soon stop working. Use `new Buffer()`, or preferably `Buffer.from()`, `Buffer.allocUnsafe()` or `Buffer.alloc()` instead.

14    030280   warn     Native: deviceready did not fire within 2000ms. This can happen when plugins are in an inconsistent state. Try removing plugins from plugins/ and reinstalling them.
15    030605   info     [object Object]
16    033286   log      deviceready has not fired after 5 seconds.
17    033290   log      Channel not fired: onCordovaInfoReady
18    033293   log      Channel not fired: onCordovaConnectionReady
19    363977   log      DEVICE READY FIRED AFTER, 32259, ms

我需要翻译的内容如下:

我的run.js、AppCtrl.js和主视图控制器都封装在$ionicPlatform.ready(function () {..});中。

我的内容安全策略是:

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *; connect-src 'self' 'unsafe-inline' 'unsafe-eval' blob: ws: *;">

1
请附上一个 [MCVE] 来演示此问题。 - t0mm13b
1
但是我的应用程序有超过10个插件,代码量非常庞大! - Louis
有人能帮我吗? - Louis
1
如果我移除插件“cordova-plugin-network-information”,deviceready将在1秒时触发。 - Louis
1
好的,我明白了,我正在做同样的事情,好的,我已经安装了所有的插件,除了设备和网络信息...并且在iOS10上,deviceready在不到一秒钟的时间内触发。也许ionic存在一个bug。 - Louis
显示剩余12条评论
2个回答

11

我感谢@baviskarmitesh的回复。但是我必须在内容安全策略中添加gap,现在它似乎可以工作了。

我在我的index.html文件中的内容安全策略中添加了data: gap: https://ssl.gstatic.com 'unsafe-eval',放在default-src *之后,就像这样:

<meta http-equiv="Content-Security-Policy" content="
  default-src * data: gap: https://ssl.gstatic.com 'unsafe-eval';
  style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
  script-src 'self' 'unsafe-inline' 'unsafe-eval' *;
  connect-src 'self' 'unsafe-inline' 'unsafe-eval' blob: ws: *;
">

现在我的所有插件都能快速触发deviceready事件。


1
很高兴它起作用了。正如我所提到的,这也与内容安全策略有关。 - Gandhi
它有所帮助,但我还必须删除cordova-plugin-device,以便更快地触发DeviceReady事件。 - simdrouin

1
这似乎是Ionic框架的常见问题,可能有多种原因。其中一种可能是您使用的插件存在问题,也可能是平台文件夹中存在问题。在Ionic CLI项目中似乎有一个已公开问题
以下是可能的解决方法:
  1. 删除有问题的插件并重新添加
  2. 删除平台文件夹并重新添加
  3. 可能避免使用实时重新加载选项
  4. 如果问题仅针对iOS,请尝试放宽内容安全策略
您还可以查看此链接
希望这可以帮到您。

这个问题与Crosswalk有关,但我没有使用它。 如果你读了我的问题,你会发现你提到的第1点和第2点都不相关(我已经删除/添加了平台和插件)。最后一个链接也是一样。 我编译了一个发布版本(没有实时重新加载),问题仍然存在。而且无论如何,我需要实时重新加载来开发。 你能解释一下“放宽内容安全策略”的意思吗?(我在问题中添加了我的内容安全策略)。 - Louis
@Louis 感谢您的评论。我重新检查了问题链接,它记录在ionic CLI项目中。一些人也使用crosswalk遇到了同样的问题,但我认为这个问题不仅限于crosswalk。关于内容安全性,请查看growthclick在开放问题链接中的评论。还要注意config.xml中指定的访问来源。 - Gandhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接