HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

IOS app 上架审核 与打包注意事项 经验分享

Appstore 审核 App打包

我的app提交时间为 3月11日 ,3月16日审核通过。也就是 apple禁止热更新之后提交的,并且我也用到了wgt 升级。

中间3月15日因为ipv6和注册页面的问题被拒绝一次,所以我来分享一下我的打包经验和上传需要注意的事项

1. 打包
无论你是否用到了 相册模块 这个都是必选勾选的, 否则你提交的二进制文件 无法通过机器审核,会报错
Missing Info.plist key- This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
这一步是机器审核,2小时之内会有审核结果,通过 就进入下一个环节

https://img-cdn-tc.dcloud.net.cn/uploads/article/20170316//d037e49bfd992e4e516dc3f77b61f657.png

2. 功能注意
app要有注册功能,我开始是没有注册功能的,后来为了通过审核特地加了一个注册功能, 等审核通过我会通过服务端关闭注册。
注册页面 让用户填写的注册信息越少越好,可以让用户登录后完善
api接口访问要用域名 不要写ip地址, 然后域名解析加一条AAAA记录就可以了 ,最后 到墙外访问测试下自己的 api接口 ,能不能访问 延迟是否太高,因为审核人员在墙外
wgt升级 如果能不用尽量不要用,但如果像我一样必须要用 不止页面里,代码里也最好不要有更新升级等字样,升级提示和逻辑可以让服务端来提示,否则谁也不知道 这些字眼是否可以被机器扫描出来,审核期间记得关闭该功能

3.技巧
由于我app 页面复杂角色众多 ,所以我给提供的演示账号登录后, 审核人员看到的页面只是部分功能, 这样可以避免他弄不清楚你的业务逻辑和其他BUG导致的审核失败(我猜测)

就这,目前来看apple所说的 热更新 和wgt 不是一回事,可以继续使用

最后上张审核图

https://img-cdn-tc.dcloud.net.cn/uploads/article/20170316//ffd520af16952dff599144ae1260c637.png

继续阅读 »

我的app提交时间为 3月11日 ,3月16日审核通过。也就是 apple禁止热更新之后提交的,并且我也用到了wgt 升级。

中间3月15日因为ipv6和注册页面的问题被拒绝一次,所以我来分享一下我的打包经验和上传需要注意的事项

1. 打包
无论你是否用到了 相册模块 这个都是必选勾选的, 否则你提交的二进制文件 无法通过机器审核,会报错
Missing Info.plist key- This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
这一步是机器审核,2小时之内会有审核结果,通过 就进入下一个环节

https://img-cdn-tc.dcloud.net.cn/uploads/article/20170316//d037e49bfd992e4e516dc3f77b61f657.png

2. 功能注意
app要有注册功能,我开始是没有注册功能的,后来为了通过审核特地加了一个注册功能, 等审核通过我会通过服务端关闭注册。
注册页面 让用户填写的注册信息越少越好,可以让用户登录后完善
api接口访问要用域名 不要写ip地址, 然后域名解析加一条AAAA记录就可以了 ,最后 到墙外访问测试下自己的 api接口 ,能不能访问 延迟是否太高,因为审核人员在墙外
wgt升级 如果能不用尽量不要用,但如果像我一样必须要用 不止页面里,代码里也最好不要有更新升级等字样,升级提示和逻辑可以让服务端来提示,否则谁也不知道 这些字眼是否可以被机器扫描出来,审核期间记得关闭该功能

3.技巧
由于我app 页面复杂角色众多 ,所以我给提供的演示账号登录后, 审核人员看到的页面只是部分功能, 这样可以避免他弄不清楚你的业务逻辑和其他BUG导致的审核失败(我猜测)

就这,目前来看apple所说的 热更新 和wgt 不是一回事,可以继续使用

最后上张审核图

https://img-cdn-tc.dcloud.net.cn/uploads/article/20170316//ffd520af16952dff599144ae1260c637.png

收起阅读 »

ios云端打包未越狱,成功了但不能安装到手机

iOS iOS打包

我打包成功了,但是用iTools安装不起来,求大神指点

我打包成功了,但是用iTools安装不起来,求大神指点

安卓APK和webAPP互调并传递多个参数分享

以下是webAPP启动安卓应用和获取安卓应用传递过来的参数

> webAPP启动安卓APK并传递参数

请看:

function startAndroidActivity(){
var Intent = plus.android.importClass("android.content.Intent");
var intent = new Intent(Intent.ACTION_VIEW);
var ComponentName = plus.android.importClass("android.content.ComponentName");
var comp = new ComponentName("你的安卓APK的Package,在AndroidManifest.xml里面,比如yy.com.testandriodapp", "你的安卓APK启动控制器,比如yy.com.testandriodapp.MainActivity");
intent.setComponent(comp);
intent.setAction("android.intent.action.MAIN");
intent.putExtra("参数一key", "参数一value");
intent.putExtra("参数一key", "参数二value");
var main = plus.android.runtimeMainActivity();
main.startActivity(intent);
}

> 接收安卓数据

请看:

        document.addEventListener('plusready', function() {  
            checkArguments();  
        });  
        // 判断启动方式  
        function checkArguments() {  
            Intent = plus.android.importClass("android.content.Intent");  
            // 程序全局环境对象,内部自动导入Activity类  
            mainActivity = plus.android.runtimeMainActivity();  
            intent = mainActivity.getIntent();//获取启动intent  
            name = intent.getStringExtra("name");//通过intent获取参数  
            birthday = intent.getStringExtra("birthday");  
            alert(name);  
            alert(birthday);  
        }  
        // 处理从后台恢复  
        document.addEventListener('newintent', function() {  
            checkArguments();  
        }, false);  

以下是安卓应用获取webAPP传递过来的参数和启动webAPP

> 获取webAPP传递过来的参数

请看:

Intent intent1 = getIntent();
Bundle bundle = intent1.getExtras();
if (bundle != null) {
String name = bundle.getString("name");
if (name != null) {
Toast.makeText(getApplicationContext(), "name:" + name, Toast.LENGTH_SHORT).show();
}
String birthday = bundle.getString("birthday");
if (birthday != null) {
Toast.makeText(getApplicationContext(), "birthday:" + birthday, Toast.LENGTH_SHORT).show();
}
}

> 安卓应用启动webAPP

请看:

Intent intent = new Intent();
// 这里如果intent为空,就说名没有安装要跳转的应用嘛
ComponentName componentName = new ComponentName("你在mainfest的->代码视图->google->packagename设置的包名,比如:io.dcloud.Test","这个参数是固定的,dcloud默认都会生成这个activity名字:io.dcloud.PandoraEntryActivity");
if (intent != null) {
// 这里跟Activity传递参数一样的嘛,不要担心怎么传递参数,还有接收参数也是跟Activity和Activity传参数一样
intent.setComponent(componentName);
intent.putExtra("name", "Liu xiang");
intent.putExtra("birthday", "1983-7-13");
startActivity(intent);
} else {
// 没有安装要跳转的app应用,提醒一下
Toast.makeText(getApplicationContext(), "哟,赶紧下载安装这个APP吧", Toast.LENGTH_LONG).show();
}

over -- 由于论坛自身格式问题,我一直没办法展示很好,我把他整理在博客里了:阿里学院

继续阅读 »

以下是webAPP启动安卓应用和获取安卓应用传递过来的参数

> webAPP启动安卓APK并传递参数

请看:

function startAndroidActivity(){
var Intent = plus.android.importClass("android.content.Intent");
var intent = new Intent(Intent.ACTION_VIEW);
var ComponentName = plus.android.importClass("android.content.ComponentName");
var comp = new ComponentName("你的安卓APK的Package,在AndroidManifest.xml里面,比如yy.com.testandriodapp", "你的安卓APK启动控制器,比如yy.com.testandriodapp.MainActivity");
intent.setComponent(comp);
intent.setAction("android.intent.action.MAIN");
intent.putExtra("参数一key", "参数一value");
intent.putExtra("参数一key", "参数二value");
var main = plus.android.runtimeMainActivity();
main.startActivity(intent);
}

> 接收安卓数据

请看:

        document.addEventListener('plusready', function() {  
            checkArguments();  
        });  
        // 判断启动方式  
        function checkArguments() {  
            Intent = plus.android.importClass("android.content.Intent");  
            // 程序全局环境对象,内部自动导入Activity类  
            mainActivity = plus.android.runtimeMainActivity();  
            intent = mainActivity.getIntent();//获取启动intent  
            name = intent.getStringExtra("name");//通过intent获取参数  
            birthday = intent.getStringExtra("birthday");  
            alert(name);  
            alert(birthday);  
        }  
        // 处理从后台恢复  
        document.addEventListener('newintent', function() {  
            checkArguments();  
        }, false);  

以下是安卓应用获取webAPP传递过来的参数和启动webAPP

> 获取webAPP传递过来的参数

请看:

Intent intent1 = getIntent();
Bundle bundle = intent1.getExtras();
if (bundle != null) {
String name = bundle.getString("name");
if (name != null) {
Toast.makeText(getApplicationContext(), "name:" + name, Toast.LENGTH_SHORT).show();
}
String birthday = bundle.getString("birthday");
if (birthday != null) {
Toast.makeText(getApplicationContext(), "birthday:" + birthday, Toast.LENGTH_SHORT).show();
}
}

> 安卓应用启动webAPP

请看:

Intent intent = new Intent();
// 这里如果intent为空,就说名没有安装要跳转的应用嘛
ComponentName componentName = new ComponentName("你在mainfest的->代码视图->google->packagename设置的包名,比如:io.dcloud.Test","这个参数是固定的,dcloud默认都会生成这个activity名字:io.dcloud.PandoraEntryActivity");
if (intent != null) {
// 这里跟Activity传递参数一样的嘛,不要担心怎么传递参数,还有接收参数也是跟Activity和Activity传参数一样
intent.setComponent(componentName);
intent.putExtra("name", "Liu xiang");
intent.putExtra("birthday", "1983-7-13");
startActivity(intent);
} else {
// 没有安装要跳转的app应用,提醒一下
Toast.makeText(getApplicationContext(), "哟,赶紧下载安装这个APP吧", Toast.LENGTH_LONG).show();
}

over -- 由于论坛自身格式问题,我一直没办法展示很好,我把他整理在博客里了:阿里学院

收起阅读 »

快速获取Hbuilder打包ios私钥p12和profile文件.mobileprovision

iOS打包 iOS证书 技术分享

Hbuilder如果要打包ipa上架App Store或者安装到直接的非越狱手机测试苹果APP

要在Hbuilder工上需要上传两个ios证书文件私钥p12和profile文件.mobileprovision!才能打包ipa!

这里介绍快速获取ios证书(p12)和(mobileprovision)上传到Hbuilder就可以打包了,而且可以在Windows系统直接申请。

没有Mac的伙伴也无所谓!

ios证书有很多类型,不同的环境使用不同的证书,不能乱搭!

iOS开发证书申请(xcode开发手机测试)

iOS发布证书申请(发布上架App Store)

iOS推送证书申请(APP推送通知)

iOS真机调试证书申请(安装到非越狱手机测试)

iOS企业证书申请(免上架App Store安装手机使用)

这里以发布证书为例

iOS发布证书 用于发布到App Store,只有用iOS发布证书打包的IPA才能上架到苹果应用市场。

一、创建iOS发布证书

iOS证书申请这里就是用到一个工具Appuploader,可以在win系统中辅助快速申请iOS证书,如果没有Mac也无所谓。

可以很快速的创建ios证书

先安装好Appuploader安装教程

1、打开Appuploader,选择Certification

2、点击+ ADD类型会出现各种证书选项,根据自己需要创建的证书类型选择。

iOS App Development 开发证书
Apple Push Notification service SSL(Sandbox) 开发调试模式推送证书
App Store and Ad Hoc 发布证书
Push Notification Auth Key (Sandbox & Producyion) 推送授权key
Push Notification service SLL(Sandbox & Producyion)发布上架模式的推送证书
Pass Type ID Certificate pass type证书
Website Push ID Certificate 网站推送证书
Watchkit Services Certificate
iwatch服务证书
voIP Services Certificate voip服务证书
Apple Pay Certificate
苹果支付证书

3、以创建发布证书为例,输入证书名称,邮箱,密码(打包ipa时用到),点击ok即可创建。

4、创建成功后,点击p12 File,下载保存.p12证书文件到电脑。

二、创建iOS发布描述文件

1、打开Appuploader,选择Profiles

2、点击+ ADD,根据需要选择配置文件类型,以发布描述文件为例,选择 App Store。

iOS App Development 苹果开发描述文件
tvOS App Development 苹果电视开发描述文件
App Store 发布描述文件
tvOS App Store 电视发布描述文件
Ad Hoc 不上架可推广描述文件
tvOS Ad Hoc 苹果电视不上架推广描述文件
3、选择之前在开发者中心创建的 APP IDs,勾选关联好发布证书,如果之前创建了2个发布证书,那勾选哪个就下载对应的那个,输入名称,点击ok创建。

4、创建成功了.mobileprovision的描述文件,点击Download下载,保存到电脑

现在发布证书.p12和发布描述文件.mobileprovision都有了,就可以去打包ipa了。

ios真机调试文档(不上架App Store安装手机测试)

HBuilder打包ios上架App Store完整流程

继续阅读 »

Hbuilder如果要打包ipa上架App Store或者安装到直接的非越狱手机测试苹果APP

要在Hbuilder工上需要上传两个ios证书文件私钥p12和profile文件.mobileprovision!才能打包ipa!

这里介绍快速获取ios证书(p12)和(mobileprovision)上传到Hbuilder就可以打包了,而且可以在Windows系统直接申请。

没有Mac的伙伴也无所谓!

ios证书有很多类型,不同的环境使用不同的证书,不能乱搭!

iOS开发证书申请(xcode开发手机测试)

iOS发布证书申请(发布上架App Store)

iOS推送证书申请(APP推送通知)

iOS真机调试证书申请(安装到非越狱手机测试)

iOS企业证书申请(免上架App Store安装手机使用)

这里以发布证书为例

iOS发布证书 用于发布到App Store,只有用iOS发布证书打包的IPA才能上架到苹果应用市场。

一、创建iOS发布证书

iOS证书申请这里就是用到一个工具Appuploader,可以在win系统中辅助快速申请iOS证书,如果没有Mac也无所谓。

可以很快速的创建ios证书

先安装好Appuploader安装教程

1、打开Appuploader,选择Certification

2、点击+ ADD类型会出现各种证书选项,根据自己需要创建的证书类型选择。

iOS App Development 开发证书
Apple Push Notification service SSL(Sandbox) 开发调试模式推送证书
App Store and Ad Hoc 发布证书
Push Notification Auth Key (Sandbox & Producyion) 推送授权key
Push Notification service SLL(Sandbox & Producyion)发布上架模式的推送证书
Pass Type ID Certificate pass type证书
Website Push ID Certificate 网站推送证书
Watchkit Services Certificate
iwatch服务证书
voIP Services Certificate voip服务证书
Apple Pay Certificate
苹果支付证书

3、以创建发布证书为例,输入证书名称,邮箱,密码(打包ipa时用到),点击ok即可创建。

4、创建成功后,点击p12 File,下载保存.p12证书文件到电脑。

二、创建iOS发布描述文件

1、打开Appuploader,选择Profiles

2、点击+ ADD,根据需要选择配置文件类型,以发布描述文件为例,选择 App Store。

iOS App Development 苹果开发描述文件
tvOS App Development 苹果电视开发描述文件
App Store 发布描述文件
tvOS App Store 电视发布描述文件
Ad Hoc 不上架可推广描述文件
tvOS Ad Hoc 苹果电视不上架推广描述文件
3、选择之前在开发者中心创建的 APP IDs,勾选关联好发布证书,如果之前创建了2个发布证书,那勾选哪个就下载对应的那个,输入名称,点击ok创建。

4、创建成功了.mobileprovision的描述文件,点击Download下载,保存到电脑

现在发布证书.p12和发布描述文件.mobileprovision都有了,就可以去打包ipa了。

ios真机调试文档(不上架App Store安装手机测试)

HBuilder打包ios上架App Store完整流程

收起阅读 »

新手调用Native.js, startService 不能启动服务

service

今天参照 http://ask.dcloud.net.cn/question/433 中所给的方式开启后台服务。本地打包后发现在执行main.startService(intent); 后服务没有正常执行, 将代码防盗android 里面后确定执行成功,但是服务未启动。

找了一下午终于发现问题,需要在AndroidManifest.xml 声明服务如下
<service android:name="io.dcloud.HBuilder.Wiedii.MsgService" android:exported="true" />

见:http://www.cnblogs.com/lwbqqyumidi/p/4181185.html

继续阅读 »

今天参照 http://ask.dcloud.net.cn/question/433 中所给的方式开启后台服务。本地打包后发现在执行main.startService(intent); 后服务没有正常执行, 将代码防盗android 里面后确定执行成功,但是服务未启动。

找了一下午终于发现问题,需要在AndroidManifest.xml 声明服务如下
<service android:name="io.dcloud.HBuilder.Wiedii.MsgService" android:exported="true" />

见:http://www.cnblogs.com/lwbqqyumidi/p/4181185.html

收起阅读 »

IOS使用openURL打开百度地图的坑,已解决!

function openBMap(lon, lat, title, address) {
var url=null,id=null,f=null;
address = address == ''? title: address;
switch ( plus.os.name ) {
case "Android":
// 规范参考官方网站:http://developer.baidu.com/map/index.php?title=uri/api/android
url = "baidumap://map/marker?location=" + lat + "," + lon + "&title=" + title + "&content=" + address + "&src=wz";
f = androidMarket;
id = "com.baidu.BaiduMap";
break;
case "iOS":
// 规范参考官方网站:http://developer.baidu.com/map/index.php?title=uri/api/ios
url = "baidumap://map/marker?location=" + lat.toFixed(6) + "," + lon.toFixed(6) + "&title=" + title + "&content=" + address + "&src=wz";
// url = "baidumap://map/marker?location=39.968789,116.347247&title=DCloud&content=%e6%89%93%e9%80%a0HTML5%e6%9c%80%e5%a5%bd%e7%9a%84%e7%a7%bb%e5%8a%a8%e5%bc%80%e5%8f%91%e5%b7%a5%e5%85%b7&src=HelloH5";
f = iosAppstore;
id = "itunes.apple.com/cn/app/bai-du-de-tu-yu-yin-dao-hang/id452186370?mt=8";
break;
default:
return;
break;
}
url = encodeURI(url); //重点在这一句,如果不加,android没问题,但是ios打不开,每次提示未安装,所以同学们要注意了
console.log(url);
plus.runtime.openURL( url, function(e) {
plus.nativeUI.confirm( "检查到您未安装百度地图,是否到商城搜索下载?", function(i){
if ( i.index == 0 ) {
f(id);
}
} );
} );
}

继续阅读 »

function openBMap(lon, lat, title, address) {
var url=null,id=null,f=null;
address = address == ''? title: address;
switch ( plus.os.name ) {
case "Android":
// 规范参考官方网站:http://developer.baidu.com/map/index.php?title=uri/api/android
url = "baidumap://map/marker?location=" + lat + "," + lon + "&title=" + title + "&content=" + address + "&src=wz";
f = androidMarket;
id = "com.baidu.BaiduMap";
break;
case "iOS":
// 规范参考官方网站:http://developer.baidu.com/map/index.php?title=uri/api/ios
url = "baidumap://map/marker?location=" + lat.toFixed(6) + "," + lon.toFixed(6) + "&title=" + title + "&content=" + address + "&src=wz";
// url = "baidumap://map/marker?location=39.968789,116.347247&title=DCloud&content=%e6%89%93%e9%80%a0HTML5%e6%9c%80%e5%a5%bd%e7%9a%84%e7%a7%bb%e5%8a%a8%e5%bc%80%e5%8f%91%e5%b7%a5%e5%85%b7&src=HelloH5";
f = iosAppstore;
id = "itunes.apple.com/cn/app/bai-du-de-tu-yu-yin-dao-hang/id452186370?mt=8";
break;
default:
return;
break;
}
url = encodeURI(url); //重点在这一句,如果不加,android没问题,但是ios打不开,每次提示未安装,所以同学们要注意了
console.log(url);
plus.runtime.openURL( url, function(e) {
plus.nativeUI.confirm( "检查到您未安装百度地图,是否到商城搜索下载?", function(i){
if ( i.index == 0 ) {
f(id);
}
} );
} );
}

收起阅读 »

IOS10 打开系统设置

IOS原有跳转Wi-Fi设置是”prefs:root=WIFI”,新的写法是”App-Prefs:root=WIFI”

function networkType(){
var types = {};
types[plus.networkinfo.CONNECTION_UNKNOW] = "Unknown connection";
types[plus.networkinfo.CONNECTION_NONE] = "No connection";
types[plus.networkinfo.CONNECTION_ETHERNET] = "Ethernet connection";
types[plus.networkinfo.CONNECTION_WIFI] = "WiFi connection";
types[plus.networkinfo.CONNECTION_CELL2G] = "Cellular 2G connection";
types[plus.networkinfo.CONNECTION_CELL3G] = "Cellular 3G connection";
types[plus.networkinfo.CONNECTION_CELL4G] = "Cellular 4G connection";

if (plus.networkinfo.getCurrentType() == plus.networkinfo.CONNECTION_NONE || plus.networkinfo.getCurrentType() == plus.networkinfo.CONNECTION_UNKNOW) {
mui.toast("当前暂无网络连接,请打开数据服务!", "提示");
mui.confirm('网络出错,请检查网络配置', '温馨提示', ['退出', '设置'], function(e){
if(e.index == 0){
} else {
if(mui.os.ios){
plus.runtime.launchApplication({action:'App-Prefs:root=WIFI'}, function(e){
console.log(JSON.stringify(e));
}); //WIFI
} else {
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var mIntent = new Intent('android.settings.WIFI_SETTINGS');
main.startActivity(mIntent);
}
}
});
}
else {
console.log(types[plus.networkinfo.getCurrentType()]);
}
}

继续阅读 »

IOS原有跳转Wi-Fi设置是”prefs:root=WIFI”,新的写法是”App-Prefs:root=WIFI”

function networkType(){
var types = {};
types[plus.networkinfo.CONNECTION_UNKNOW] = "Unknown connection";
types[plus.networkinfo.CONNECTION_NONE] = "No connection";
types[plus.networkinfo.CONNECTION_ETHERNET] = "Ethernet connection";
types[plus.networkinfo.CONNECTION_WIFI] = "WiFi connection";
types[plus.networkinfo.CONNECTION_CELL2G] = "Cellular 2G connection";
types[plus.networkinfo.CONNECTION_CELL3G] = "Cellular 3G connection";
types[plus.networkinfo.CONNECTION_CELL4G] = "Cellular 4G connection";

if (plus.networkinfo.getCurrentType() == plus.networkinfo.CONNECTION_NONE || plus.networkinfo.getCurrentType() == plus.networkinfo.CONNECTION_UNKNOW) {
mui.toast("当前暂无网络连接,请打开数据服务!", "提示");
mui.confirm('网络出错,请检查网络配置', '温馨提示', ['退出', '设置'], function(e){
if(e.index == 0){
} else {
if(mui.os.ios){
plus.runtime.launchApplication({action:'App-Prefs:root=WIFI'}, function(e){
console.log(JSON.stringify(e));
}); //WIFI
} else {
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var mIntent = new Intent('android.settings.WIFI_SETTINGS');
main.startActivity(mIntent);
}
}
});
}
else {
console.log(types[plus.networkinfo.getCurrentType()]);
}
}

收起阅读 »

关于PHP Editor中PHP代码折叠的问题

如果你觉得你所有设置步骤都弄过了,也重启了IDE,还是不能折叠代码,那个让期待的“+”、“-”号还是不出现,建议你立即看一眼HD底部正在使用的编辑器是不是已经显示为【PHP Editor (Aptana)】,如果没有显示为这个插件的名称,点击一下,在弹出列表中选择这个插件即可。完成后,HD代码区略微一闪,“+”、“-”号就出现了。

如果从头开始,那么:

  1. 确保已下载PHP Editor插件。
  2. 选择【工具】->【选项】->【HBuilder】->【编辑器】->【PHP】,点击后,右侧设置区域即可看见【折叠】设置,你可以根据自己的需要,选择代码元素的这点方式
  3. 操作完成后,如果不出现折叠标志,则按前面所说再试一试。

JS和HTML也类似。

继续阅读 »

如果你觉得你所有设置步骤都弄过了,也重启了IDE,还是不能折叠代码,那个让期待的“+”、“-”号还是不出现,建议你立即看一眼HD底部正在使用的编辑器是不是已经显示为【PHP Editor (Aptana)】,如果没有显示为这个插件的名称,点击一下,在弹出列表中选择这个插件即可。完成后,HD代码区略微一闪,“+”、“-”号就出现了。

如果从头开始,那么:

  1. 确保已下载PHP Editor插件。
  2. 选择【工具】->【选项】->【HBuilder】->【编辑器】->【PHP】,点击后,右侧设置区域即可看见【折叠】设置,你可以根据自己的需要,选择代码元素的这点方式
  3. 操作完成后,如果不出现折叠标志,则按前面所说再试一试。

JS和HTML也类似。

收起阅读 »

【MUI还需改进】indexed list 索引列表的一些问题以及自己想到的一些笨办法

indexed list

indexed list 索引列表 目前自己踩过的坑

1、动态加载的数据过多时性能明显下降,尤其是数据达到一定量级时那速度特别感人

笨办法:由于数据比较多,无奈之下只好使用AJAX的方式直接查询数据库,然后将查询结果展示到索引列表,若是查询结果过多的话,则直接使用分页的形式展示数据,一次只加载固定长度的数据,这样性能还在可接受的范围内

2、索引列表高度的问题,在某些场景下webview是隐藏的,document.body.offsetHeight获取到的高度是0,尤其是隐藏状态下动态加载了数据索引列表显示不完整

笨办法:直接根据当前webview高度计算索引列表窗口,一些布局特殊的webview则是当webview显示时重新获取webview高度并设置下索引列表的高度

3、索引列表与下拉刷新不兼容,当索引列表使用了下拉刷新时,索引列表就无法向上滚动了

笨办法:放弃下拉刷新,直接监听longtap事件,将下拉刷新的方式改成了按住屏幕刷新的方式

4、数据过多时快速滚动索引列表会闪烁

笨办法:妈蛋、劳资不用了 #24#24#24

希望文档能完善点,组件也能多一点,MUI真心有些丑,这次重构就只好用framework7+vue了,其实mui也可以借鉴一下framework7,闭门造车是很难得

希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点

继续阅读 »

indexed list 索引列表 目前自己踩过的坑

1、动态加载的数据过多时性能明显下降,尤其是数据达到一定量级时那速度特别感人

笨办法:由于数据比较多,无奈之下只好使用AJAX的方式直接查询数据库,然后将查询结果展示到索引列表,若是查询结果过多的话,则直接使用分页的形式展示数据,一次只加载固定长度的数据,这样性能还在可接受的范围内

2、索引列表高度的问题,在某些场景下webview是隐藏的,document.body.offsetHeight获取到的高度是0,尤其是隐藏状态下动态加载了数据索引列表显示不完整

笨办法:直接根据当前webview高度计算索引列表窗口,一些布局特殊的webview则是当webview显示时重新获取webview高度并设置下索引列表的高度

3、索引列表与下拉刷新不兼容,当索引列表使用了下拉刷新时,索引列表就无法向上滚动了

笨办法:放弃下拉刷新,直接监听longtap事件,将下拉刷新的方式改成了按住屏幕刷新的方式

4、数据过多时快速滚动索引列表会闪烁

笨办法:妈蛋、劳资不用了 #24#24#24

希望文档能完善点,组件也能多一点,MUI真心有些丑,这次重构就只好用framework7+vue了,其实mui也可以借鉴一下framework7,闭门造车是很难得

希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点
希望文档能完善点,组件也能多一点

收起阅读 »

分享离线打包遇到的一个坑

离线打包

离线打包,要添加微信好友和朋友圈分享功能。直接运行Hbuilder项目可以,但是用安卓离线打包后,调不起来了,后来发现,因为在离线打包里,asset->data->dcloud_properties.xml中,多添加了Sina和Tencent的模块配置,而微信的模块配置放在下边,如图:

结果就是plus.share.getServices获取不到微信的配置信息,最后把前两个删掉就可以了。这。。容错率

继续阅读 »

离线打包,要添加微信好友和朋友圈分享功能。直接运行Hbuilder项目可以,但是用安卓离线打包后,调不起来了,后来发现,因为在离线打包里,asset->data->dcloud_properties.xml中,多添加了Sina和Tencent的模块配置,而微信的模块配置放在下边,如图:

结果就是plus.share.getServices获取不到微信的配置信息,最后把前两个删掉就可以了。这。。容错率

收起阅读 »

基于Windows创建iOS证书和p12文件 不用钥匙串 不限制电脑

iOS证书

os的证书需要用mac才能申请,而且证书受电脑限制!现在有款工具Appuploader可以创建证书。

Appuploader支持创建各种Apple证书,创建过程非常简单,不需要钥匙串,只需输入证书名称,创建邮箱等信息即可创建证书,而且可以运行在windows,linux或mac上创建,最方便的是创建的证书可以多电脑使用,不受限制。

Appuploader工具,也可以提交ipa到App Store,或者后续更新app等功能。

继续阅读 »

os的证书需要用mac才能申请,而且证书受电脑限制!现在有款工具Appuploader可以创建证书。

Appuploader支持创建各种Apple证书,创建过程非常简单,不需要钥匙串,只需输入证书名称,创建邮箱等信息即可创建证书,而且可以运行在windows,linux或mac上创建,最方便的是创建的证书可以多电脑使用,不受限制。

Appuploader工具,也可以提交ipa到App Store,或者后续更新app等功能。

收起阅读 »

mui、h5+、h.js、项目实战教程汇总(免费、详细、播放总量已达3万)

5+App开发 mui

mui、h5+、h.js、项目实战教程汇总,观看地址:
http://www.hcoder.net/course


观看地址:
http://www.hcoder.net/course/

自hcoder发布mui h5+ 教程以来视频总播放量已经超过3万,我们一直在努力更新各类视频教程来方便大家学习!
感谢大家的支持和厚爱! 我们会继续努力做得更好!

h.js mui dom操作完美小伙伴同步更新中!更多教程请关注 hcoder.net
http://www.hcoder.net

继续阅读 »

mui、h5+、h.js、项目实战教程汇总,观看地址:
http://www.hcoder.net/course


观看地址:
http://www.hcoder.net/course/

自hcoder发布mui h5+ 教程以来视频总播放量已经超过3万,我们一直在努力更新各类视频教程来方便大家学习!
感谢大家的支持和厚爱! 我们会继续努力做得更好!

h.js mui dom操作完美小伙伴同步更新中!更多教程请关注 hcoder.net
http://www.hcoder.net

收起阅读 »