我时H5集成的安卓应用
当我在hbuilder的真机测试的时候,整个代码可以完美运行;
但是我打包成apk后在手机运行,window.plus会报undefined;
这样也导致var xhr_svn = new plus.net.XMLHttpRequest();会报错
"plus is not defined"
请问这是什么问题导致的?

- 发布:2018-07-04 13:48
- 更新:2018-07-04 23:29
- 阅读:4514

Trust - 少说废话
耐心读一下如何正确高效地在社区提问,然后提供下文中提到的必要的信息,最好能提供一个有问题的apk以供测试。
参考文章:
http://ask.dcloud.net.cn/article/165
http://ask.dcloud.net.cn/article/30
http://ask.dcloud.net.cn/article/122
如果不引入 mui 的话,可以自己参考 mui 的源码封装一个相关的 plusReady 方法,示例如下:
var plusReady = function (callback) {
if (window.plus) {
callback();
} else {
document.addEventListener('plusready', callback);
}
}
解决方法:
- 更新 HBuilder 到最新版,你这个版本落后太多了,可能会存在一些目前已解决的bug。
- 将涉及到 5+API 调用的代码,都放在 plusReady 中。
- 虽然是 C/S 结构的应用,但是 script 标签最好还是放在 body 标签结束前。如果不是很明白为什么,百度会告诉你。

1***@qq.com (作者)
代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title>Ionic Seed App</title>
<!-- ionic css -->
<link href="lib/ionic/css/ionic.css" rel="stylesheet">
<!-- your app's css -->
<link href="css/clj_common.css" rel="stylesheet">
<link href="css/clj_all.css" rel="stylesheet">
<!-- ionic/angularjs scripts -->
<script src="lib/ionic/js/ionic.bundle.js"></script>
<!-- cordova script (this will be a 404 during development) -->
<script src="cordova.js"></script>
<!-- your app's script -->
<script src="js/app.js"></script>
<script src="js/services.js"></script>
<script src="js/controllers.js"></script>
<script src="js/md5js.js"></script>
<script src="js/jquery_1.9.1.js"></script>
<script src="js/ng-cordova.js"></script>
<script src="html5plus://ready"></script>
<script type="text/javascript" charset="utf-8">
// 这里可以调用5+ API了,为了更好的兼容性,应该使用以下代码进行判断
window.onerror = function (message, url, line, column, error) {
alert('log---onerror::::'+message+' '+url+' '+line+' '+column+' '+error);
}
alert('window.plus is'+window.plus);
</script>
</head>
<body ng-app="Doctor" animation="slide-left-right-ios7">
<ion-nav-view></ion-nav-view>
</body>
<script>
var version='1.1.4';
//检查自动更新
function svn(old_version) {
alert("svn");
var xhr_svn = new plus.net.XMLHttpRequest();
alert('lilili');
xhr_svn.onreadystatechange = function() {
alert(xhr_svn.readyState);
if (xhr_svn.readyState == 4) {
alert(xhr_svn.status);
if (xhr_svn.status == 200) {
var res = JSON.parse(xhr_svn.responseText);
alert("res:"+res);
alert("res的类型:"+ typeof res);
alert("res.update:"+res.update);
}
} else {
plus.nativeUI.toast( "网络连接错误!");
}
}
}
xhr_svn.open("GET","http://121.40.144.109:19090/myopic-dev/resources/update_ShortSightednessDoctor.json");//这里的地址是上面json文件的地址
xhr_svn.send();
};
if(window.plus != undefined){
// 在这里调用5+ API
alert('hello');
svn(version); //更新版本同时要更新svn中参数
}else{// 兼容老版本的plusready事件
alert('如果能出现hi,说明进入api加载完成的回调函数,否则api没有加载完成');
document.addEventListener('plusready',function () {
// 在这里调用5+ API
alert('hi');
svn(version); //更新版本同时要更新svn中参数
},false);
}
// svn(version); //更新版本同时要更新svn中参数
</script>
</html>
我用的是HBuilder
8.8.0.201706142254
测试手机用了好几部,都是一样的结果
希望大佬快来捞我一把~马上要抑郁了啊~~~

1***@qq.com (作者)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
<title>HTML5+ API</title>
<script src="html5plus://ready"></script>
<script src="js/jquery_1.9.1.js"></script>
<script src="js/mui.min.js"></script>
<script>
window.onerror = function (message, url, line, column, error) {
alert('log---onerror::::'+message+' '+url+' '+line+' '+column+' '+error);
}
(function(mui, doc) {
alert('eee');
mui.init({
});
mui.plusReady(function() {
alert("here");
var xhr_svn = new plus.net.XMLHttpRequest();
xhr_svn.onreadystatechange = function() {
alert(xhr_svn.readyState);
}
xhr_svn.open("GET","http://www.inwoold.com/myopic-dev/resources/update_ShortSightednessDoctor.json");//这里的地址是上面json文件的地址
xhr_svn.send();
});
}(mui, document));
</script>
</head>
<body>
Hello HTML5 plus.
</body>
</html>
后来有换成mui尝试,hbuilder基座真机测试也是可以完美运行,然而打包apk以后eee弹出来了,mui.plusReady没有触发,

我看你代码里写了plus的提前注入,还有一种可能的原因是你的其他代码里有对plus进行重定义,搜一下里面有没有plus这个变量或函数。
js是后定义生效的,提前注入plus虽然让plus这个变量生效了,但如果后面有js重定义了plus,plus就不再是5+的对象了
-
1***@qq.com (作者)
你好,我在代码里全面检查了一下,没有其他代码用到plus或对其重定义的操作,因为我是本地打包的,我本来猜想是不是因为有什么依赖包没有配置,所以早上的时候我根据官方文档下了5+SDK对项目进行配置后再次打包,还是不可以....
2018-07-05 10:38
-
1***@qq.com (作者)
您好,我看了您给的几个参考文章,这几个文章之前我都用尝试过,我出现的问题是hbuilder真机测试的时候 document.addEventListener('plusready', callback);可以触发callback,但是在打包apk后运行应用就无法触发,这导致我无法使用5+API;
并且我有尝试用MUI的框架,但是同样的是我在Hbuilder真机测试的时候可以触发,mui.plusReady(),但打包以后就无法触发,mui.plusReady();
灵,我是离线打包的,,用mui框架写的代码po在最后了,请看一下~
2018-07-04 21:57