如何获取iOS设备Crash log
- 将产生崩溃的设备连接到PC,打开iTunes, 等待iTunes同步Crash日志完成
- Mac机器打开Finder,进入~/Library/Logs/CrashReporter/MobileDevice目录
Widnows机器进入C:\Users\<user_name>\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice
Windows XP进入C:\Documents and Settings\<user_name>\Application Data\Apple computer\Logs\CrashReporter - 在上述目录中找到以设备名命名的文件夹中,过滤以DCloud_Pandora 开始的文件,根据产生Crash的时间确定Crash的日志文件
- 将产生崩溃的设备连接到PC,打开iTunes, 等待iTunes同步Crash日志完成
- Mac机器打开Finder,进入~/Library/Logs/CrashReporter/MobileDevice目录
Widnows机器进入C:\Users\<user_name>\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice
Windows XP进入C:\Documents and Settings\<user_name>\Application Data\Apple computer\Logs\CrashReporter - 在上述目录中找到以设备名命名的文件夹中,过滤以DCloud_Pandora 开始的文件,根据产生Crash的时间确定Crash的日志文件
使用emmet快速生成css时,如何仅生成需要的浏览器类型
emmet快速生成浏览器兼容数据很方便,但某些情况下,我们可能只需要兼容数据中的一条或两条,该如何做呢?
如在css为div指定transition时,如果直接输入trans按下tab生成如下代码
.div{
-webkit-transition: prop time;
-moz-transition: prop time;
-ms-transition: prop time;
-o-transition: prop time;
transition: prop time;
}
但实际上,我们可能仅需要-webkit和-moz类型的兼容数据
如果你想手工指定想要的前缀,可以这样做 ,先输入一个小横线,然后是前缀的缩写形式
w 表示 webkit 前缀,m 是 moz 前缀,s 是 ms 前缀 .. o 就是 o 前缀
比如我们只想使用 webkit 前缀 输入一个 w ,我们可以继续指定其它的前缀
最后再加上一个小横线 .
然后是属性的缩写-wm-trans然后按下tab
生成结果如下
.div{
-webkit-transition: prop time;
-moz-transition: prop time;
transition: prop time;
}
感谢网友 @南安 的分享
emmet快速生成浏览器兼容数据很方便,但某些情况下,我们可能只需要兼容数据中的一条或两条,该如何做呢?
如在css为div指定transition时,如果直接输入trans按下tab生成如下代码
.div{
-webkit-transition: prop time;
-moz-transition: prop time;
-ms-transition: prop time;
-o-transition: prop time;
transition: prop time;
}
但实际上,我们可能仅需要-webkit和-moz类型的兼容数据
如果你想手工指定想要的前缀,可以这样做 ,先输入一个小横线,然后是前缀的缩写形式
w 表示 webkit 前缀,m 是 moz 前缀,s 是 ms 前缀 .. o 就是 o 前缀
比如我们只想使用 webkit 前缀 输入一个 w ,我们可以继续指定其它的前缀
最后再加上一个小横线 .
然后是属性的缩写-wm-trans然后按下tab
生成结果如下
.div{
-webkit-transition: prop time;
-moz-transition: prop time;
transition: prop time;
}
感谢网友 @南安 的分享
收起阅读 »今天写了一个mui下拉刷新的ajax实现
通过给后台传递last 和amount两个参数,获取json数组数据。
<script>
mui.init({
swipeBack: false,
pullRefresh: {
container: '#pullrefresh',
down: {
callback: pulldownRefresh
}
}
});
/**
* 下拉刷新具体业务实现
*/
var last=-5,amount=5;
function pulldownRefresh() {
last =last+amount;
var table = document.body.querySelector('.mui-table-view');
var cells = document.body.querySelectorAll('.mui-table-view-cell');
mui.ajax({
type: "post",
dataType: "json",
url: "http://localhost/amazeui/data.php?action=item",
data: "last="+last+"&amount="+amount,
complete :function(){$("#load").hide();},
success: function(msg){
var data = msg;
var tmp='';
$.each(data, function(i, n){
var li = document.createElement('li');
li.className = 'mui-table-view-cell';
li.innerHTML = '<a class="mui-navigate-right">' + n.itemname + '</a>';
//下拉刷新,新纪录插到最前面;
table.insertBefore(li, table.firstChild);
});
}
});
mui('#pullrefresh').pullRefresh().endPulldownToRefresh(); //refresh completed
}
if (mui.os.plus) {
mui.plusReady(function() {
setTimeout(function() {
mui('#pullrefresh').pullRefresh().pullupLoading();
}, 1000);
});
} else {
mui.ready(function() {
mui('#pullrefresh').pullRefresh().pullupLoading();
});
}
</script> 通过给后台传递last 和amount两个参数,获取json数组数据。
<script>
mui.init({
swipeBack: false,
pullRefresh: {
container: '#pullrefresh',
down: {
callback: pulldownRefresh
}
}
});
/**
* 下拉刷新具体业务实现
*/
var last=-5,amount=5;
function pulldownRefresh() {
last =last+amount;
var table = document.body.querySelector('.mui-table-view');
var cells = document.body.querySelectorAll('.mui-table-view-cell');
mui.ajax({
type: "post",
dataType: "json",
url: "http://localhost/amazeui/data.php?action=item",
data: "last="+last+"&amount="+amount,
complete :function(){$("#load").hide();},
success: function(msg){
var data = msg;
var tmp='';
$.each(data, function(i, n){
var li = document.createElement('li');
li.className = 'mui-table-view-cell';
li.innerHTML = '<a class="mui-navigate-right">' + n.itemname + '</a>';
//下拉刷新,新纪录插到最前面;
table.insertBefore(li, table.firstChild);
});
}
});
mui('#pullrefresh').pullRefresh().endPulldownToRefresh(); //refresh completed
}
if (mui.os.plus) {
mui.plusReady(function() {
setTimeout(function() {
mui('#pullrefresh').pullRefresh().pullupLoading();
}, 1000);
});
} else {
mui.ready(function() {
mui('#pullrefresh').pullRefresh().pullupLoading();
});
}
</script> 收起阅读 »
mui-popover如何强制隐藏
mui的popover只提供了toggle,也就是说每次调用只能根据现有的状态决定是显示还是隐藏。这显然是一个没人性,噢不,是不人性化的设计。
之前在官方ASK里看到有人提供了解决方法,是这么说的:
mui('#popover').popover('hide');
我当时就信了啊,结果实验发现和toggle的效果一样,还是一次弹出一次隐藏。于是乎打开mui.js开始读源码。读到4845行,差点没吐出一口老血……你们看看这代码:
$.fn.popover = function() {
var args = arguments;
this.each(function() {
$.targets._popover = this;
if (args[0] === 'show' || args[0] === 'hide' || args[0] === 'toggle') {
togglePopover(this, args[1]);
}
});
};
这3个参数实际上并没有区别,纯粹逗我玩啊!!
只好自己修改了一下,找到togglePopover的位置(4699行),然后与其同层级再加一个函数hidePopover。
var hidePopover = function(popover) {
popover.classList.remove(CLASS_ACTIVE);
removeBackdrop(popover);
}
再将刚才4845行那个操蛋的逗你玩函数改成下面这样。
$.fn.popover = function() {
var args = arguments;
this.each(function() {
$.targets._popover = this;
if (args[0] === 'show' || args[0] === 'toggle') {
togglePopover(this, args[1]);
}
else if(args[0] === 'hide') {
hidePopover(this);
}
});
};
这样就妥妥了,可以用hide参数来强制隐藏了。
mui('.mui-popover').popover('hide');
强制显示因为我暂时用不到,所以没写,需要的可以用类似方法自己添加。
mui的popover只提供了toggle,也就是说每次调用只能根据现有的状态决定是显示还是隐藏。这显然是一个没人性,噢不,是不人性化的设计。
之前在官方ASK里看到有人提供了解决方法,是这么说的:
mui('#popover').popover('hide');
我当时就信了啊,结果实验发现和toggle的效果一样,还是一次弹出一次隐藏。于是乎打开mui.js开始读源码。读到4845行,差点没吐出一口老血……你们看看这代码:
$.fn.popover = function() {
var args = arguments;
this.each(function() {
$.targets._popover = this;
if (args[0] === 'show' || args[0] === 'hide' || args[0] === 'toggle') {
togglePopover(this, args[1]);
}
});
};
这3个参数实际上并没有区别,纯粹逗我玩啊!!
只好自己修改了一下,找到togglePopover的位置(4699行),然后与其同层级再加一个函数hidePopover。
var hidePopover = function(popover) {
popover.classList.remove(CLASS_ACTIVE);
removeBackdrop(popover);
}
再将刚才4845行那个操蛋的逗你玩函数改成下面这样。
$.fn.popover = function() {
var args = arguments;
this.each(function() {
$.targets._popover = this;
if (args[0] === 'show' || args[0] === 'toggle') {
togglePopover(this, args[1]);
}
else if(args[0] === 'hide') {
hidePopover(this);
}
});
};
这样就妥妥了,可以用hide参数来强制隐藏了。
mui('.mui-popover').popover('hide');
强制显示因为我暂时用不到,所以没写,需要的可以用类似方法自己添加。
收起阅读 »iOS离线打包-平台功能配置
设置系统状态栏样式背景
关于该设置的具体介绍和可取值参考该文档
以下两步缺一不可切记
1.打开info.plist文件找到Statusbarstyle项目(没有该项按下图格式创建),在右侧的列表中选择对应值
2.找到View controller-based status bar appearance项目(没有该项按下图格式创建),选择NO
设置系统状态栏背景颜色
关于该设置的具体介绍和可取值参考该文档
打开info.plist文件找到StatusBarBackground项目(没有该项按下图格式创建),在右侧填入对应值
设置应用沉浸式状态栏
关于该设置的具体介绍和可取值参考文档iOS平台设置沉浸式状态栏显示效果
打开info.plist文件找到UIReserveStatusbarOffset项目(没有该项按下图格式创建),在右侧选择对应值
设置应用是否启动时全屏
打开info.plist文件找到Status bar is initially hidden项目(没有该项按下图格式创建),YES为全屏,NO非全屏在右侧选择对应值
通过UrlSchemes与第三方应用相互调用
关于该设置的具体介绍可参考该文档
打开info.plist文件找到URL types项目,按照下图格式添加scheme项目,红圈中输入urlidentifier,绿圈中输入scheme,
如果需要设置多个scheme,重复上边步骤
后台音乐播放
在info.plist中找到Required background modes项目没有则按照下图格式建立,添加一项在弹出的列表中选择App plays audio or streams audio/video using AirPlay
设置系统状态栏样式背景
关于该设置的具体介绍和可取值参考该文档
以下两步缺一不可切记
1.打开info.plist文件找到Statusbarstyle项目(没有该项按下图格式创建),在右侧的列表中选择对应值
2.找到View controller-based status bar appearance项目(没有该项按下图格式创建),选择NO
设置系统状态栏背景颜色
关于该设置的具体介绍和可取值参考该文档
打开info.plist文件找到StatusBarBackground项目(没有该项按下图格式创建),在右侧填入对应值
设置应用沉浸式状态栏
关于该设置的具体介绍和可取值参考文档iOS平台设置沉浸式状态栏显示效果
打开info.plist文件找到UIReserveStatusbarOffset项目(没有该项按下图格式创建),在右侧选择对应值
设置应用是否启动时全屏
打开info.plist文件找到Status bar is initially hidden项目(没有该项按下图格式创建),YES为全屏,NO非全屏在右侧选择对应值
通过UrlSchemes与第三方应用相互调用
关于该设置的具体介绍可参考该文档
打开info.plist文件找到URL types项目,按照下图格式添加scheme项目,红圈中输入urlidentifier,绿圈中输入scheme,
如果需要设置多个scheme,重复上边步骤
后台音乐播放
在info.plist中找到Required background modes项目没有则按照下图格式建立,添加一项在弹出的列表中选择App plays audio or streams audio/video using AirPlay
iOS离线打包-个推push和UniPush插件配置
个推push和UniPush配置
添加push插件
注: Linker Flags、framework添加方法参考该文档
- 依次添加下列Linker Flags: -lGeTuiPush, 注意:如果是UniPush 则把-lGeTuiPush 换成 -lUniPush。
-lGeTuiSdk,
-llibPush - 添加下列framework:"GTSDK.framework",
"CoreTelephony.framework",
"AVFoundation.framework",
"CoreLocation.framework",
"SystemConfiguration.framework",
"MobileCoreServices.framework",
"Security.framework",
"libresolv.tbd",
"libz.tbd",
"libsqlite3.tbd",
"libc++.tbd",
"UserNotifications.framework"帐号配置
1.首先到个推申请appkey等信息,查看该文档
注意:如果是UniPush 去这个链接申请
2.打开info.plist,找到getui项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
小米推送配置
注: Linker Flags、framework添加方法参考该文档
- 依次添加下列Linker Flags:-lXiaomiPush,-lMiPushSDK
- 添加下列framework:libresolv.dylib, libxml2.dylib,libz.dylib,SystemConfiguration.framework,MobileCoreServices.framework,CFNetwork.framework,CoreTelephony.framework,
帐号配置
1.首先到小米申请appkey等信息,查看该文档
2.打开info.plist,找到"MiSDKAppID"项,填入自己小米推送帐号的的APPID,如果没有该项,按照图中的格式创建
找到"MiSDKAppKey"项,填入自己小米推送帐号的的appKey,如果没有该项,按照图中的格式创建
3 小米推送调试/发布时需要设置不同的MiSDKRun值 调试证书对应值设置为“debug”,生产证书对应值设置为“online”,可参考小米推送文档
申请带APNS功能的profile文件(缺少该项将导致后台收不到推送)
1.创建应用程序ID
登陆iOS Dev Center选择进入iOS Provisioning Portal。
在Certificates,Identifiers &Profiles中,点iOS Apps的任何一项进入
在iOS Provisioning Portal中,点击App IDs进入App ID列表。
创建App ID,如果ID已经存在可以直接跳过此步骤
为App开启Push Notification功能。如果是已经创建的App ID也可以通过设置开启Push Notification功能。
根据实际情况完善App ID信息并提交,注意此处需要指定具体的Bundle ID不要使用通配符。
- 重新生成新的profile,下载到本地双击导入,并在Code signing 配置中选择该profile文件
生成APNS证书并上传到个推平台(缺少该项将导致后台收不到推送)
如果你之前没有创建过Push证书或者是要重新创建一个新的,请在证书列表下面新建。
新建证书需要注意选择证书种类(开发证书用于开发和调试使用,生产证书用于App Store发布)
点击Continue后选择证书对应的应用ID,然后继续会出现“About Creating a Certificate Signing Request (CSR)”
根据它的说明创建Certificate Signing Request。
然后点击Continue ,上传刚刚生成的 .certSigningRequest文件 点”generate”生成APNs Push Certificate。
下载并双击打开证书,证书打开时会启动“钥匙串访问”工具。
在“钥匙串访问”中你的证书会显示在“我的证书”中,注意选择“My Certificates” 和”login”
导出 .p12证书文件
在“钥匙串访问”中,选择刚刚加进来的证书,选择右键菜单中的“导出“...””。
将文件保存为Personal Information Exchange (.p12)格式。
注意:务必选择证书然后再导出。
保存p12文件时,需为其设置密码,上传到个推平台
UniPush使用指南:http://ask.dcloud.net.cn/article/35622
个推push和UniPush配置
添加push插件
注: Linker Flags、framework添加方法参考该文档
- 依次添加下列Linker Flags: -lGeTuiPush, 注意:如果是UniPush 则把-lGeTuiPush 换成 -lUniPush。
-lGeTuiSdk,
-llibPush - 添加下列framework:"GTSDK.framework",
"CoreTelephony.framework",
"AVFoundation.framework",
"CoreLocation.framework",
"SystemConfiguration.framework",
"MobileCoreServices.framework",
"Security.framework",
"libresolv.tbd",
"libz.tbd",
"libsqlite3.tbd",
"libc++.tbd",
"UserNotifications.framework"帐号配置
1.首先到个推申请appkey等信息,查看该文档
注意:如果是UniPush 去这个链接申请
2.打开info.plist,找到getui项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
小米推送配置
注: Linker Flags、framework添加方法参考该文档
- 依次添加下列Linker Flags:-lXiaomiPush,-lMiPushSDK
- 添加下列framework:libresolv.dylib, libxml2.dylib,libz.dylib,SystemConfiguration.framework,MobileCoreServices.framework,CFNetwork.framework,CoreTelephony.framework,
帐号配置
1.首先到小米申请appkey等信息,查看该文档
2.打开info.plist,找到"MiSDKAppID"项,填入自己小米推送帐号的的APPID,如果没有该项,按照图中的格式创建
找到"MiSDKAppKey"项,填入自己小米推送帐号的的appKey,如果没有该项,按照图中的格式创建
3 小米推送调试/发布时需要设置不同的MiSDKRun值 调试证书对应值设置为“debug”,生产证书对应值设置为“online”,可参考小米推送文档
申请带APNS功能的profile文件(缺少该项将导致后台收不到推送)
1.创建应用程序ID
登陆iOS Dev Center选择进入iOS Provisioning Portal。
在Certificates,Identifiers &Profiles中,点iOS Apps的任何一项进入
在iOS Provisioning Portal中,点击App IDs进入App ID列表。
创建App ID,如果ID已经存在可以直接跳过此步骤
为App开启Push Notification功能。如果是已经创建的App ID也可以通过设置开启Push Notification功能。
根据实际情况完善App ID信息并提交,注意此处需要指定具体的Bundle ID不要使用通配符。
- 重新生成新的profile,下载到本地双击导入,并在Code signing 配置中选择该profile文件
生成APNS证书并上传到个推平台(缺少该项将导致后台收不到推送)
如果你之前没有创建过Push证书或者是要重新创建一个新的,请在证书列表下面新建。
新建证书需要注意选择证书种类(开发证书用于开发和调试使用,生产证书用于App Store发布)
点击Continue后选择证书对应的应用ID,然后继续会出现“About Creating a Certificate Signing Request (CSR)”
根据它的说明创建Certificate Signing Request。
然后点击Continue ,上传刚刚生成的 .certSigningRequest文件 点”generate”生成APNs Push Certificate。
下载并双击打开证书,证书打开时会启动“钥匙串访问”工具。
在“钥匙串访问”中你的证书会显示在“我的证书”中,注意选择“My Certificates” 和”login”
导出 .p12证书文件
在“钥匙串访问”中,选择刚刚加进来的证书,选择右键菜单中的“导出“...””。
将文件保存为Personal Information Exchange (.p12)格式。
注意:务必选择证书然后再导出。
保存p12文件时,需为其设置密码,上传到个推平台
UniPush使用指南:http://ask.dcloud.net.cn/article/35622
收起阅读 »iOS离线打包-分享插件配置
目前分享插件支持新浪微博分享、QQ分享、腾讯微博分享、微信分享
分享插件首先需要到各开放平台申请帐号,申请查看该文档
注: Linker Flags、framework等添加方法参考该文档
新浪微博分享插件配置
1.添加以下Linker Flags: -llibShare、-lSinaShare、-lWeiboSDK
- 添加以下framwork: QuartzCore.framework、ImageIO.framework、SystemConfiguration.framework、Security.framwork、CoreTelephny。framwork、CoreText.framework、libz.dylib、libsqlite3.dylib
- 添加下列文件:WeiboSDK.bundle
- 打开info.plist,找到sinweibo项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
5.找到URL types ,打开URL identifier为com.weibo的项目,修改item0值为wb[这个是你的appkey] ,如果没有该项按照图中的格式创建
- iOS9.0以上版本需要在info.plist增加以下配置
QQ分享插件配置
1.添加以下Linker Flags: -llibShare、-lQQShare
2.添加以下framwork: TencentOpenAPI.framework
- 添加下列文件: TencentOpenApi_IOS_Bundle.bundle
4.找到URL types,打开URL identifier为tencentopenapi的项目, 修改item0值为tencent[这个是你的appId] ,如果没有该项按照图中的格式创建
- iOS9.0以上版本需要在info.plist增加以下配置
微信分享插件配置
1.添加以下Linker Flags: -llibShare、 -lweixinShare、-lWeChatSDK
2.添加以下framwork: Social.framework、Accounts.framework
3.找到URL types ,打开URL identifier为weixin的项目,修改item0值为wx[这个是你的appid] ,如果没有该项按照图中的格式创建
4.iOS9.0以上版本需要在info.plist增加以下配置
<a id="ulink"/>
5.HBuilderX2.3.4+ 版本需要配置 Universal Link
在info.plist root 节点添加UniversalLinks项,值和微信开放平台配置的一致,参考如下:
查看工程里的AppDelegate.m文件里是否有下面的方法:
>//@Summary:通用链接
-(BOOL)application:(UIApplication )application continueUserActivity:(NSUserActivity )userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
[PDRCore handleSysEvent:PDRCoreSysEventContinueUserActivity withObject:userActivity];
restorationHandler(nil);
return YES;
}
腾讯微博分享分享插件配置
1.添加以下Linker Flags: -llibShare、-lTCWeiboSDK
2.找到URL types ,打开URL identifier为com.tencent的项目,修改item0值为wb[这个是你的appkey] ,如果没有该项按照图中的格式创建
- 打开info.plist,找到tencentweibo项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
- iOS9.0以上版本需要在info.plist增加以下配置
目前分享插件支持新浪微博分享、QQ分享、腾讯微博分享、微信分享
分享插件首先需要到各开放平台申请帐号,申请查看该文档
注: Linker Flags、framework等添加方法参考该文档
新浪微博分享插件配置
1.添加以下Linker Flags: -llibShare、-lSinaShare、-lWeiboSDK
- 添加以下framwork: QuartzCore.framework、ImageIO.framework、SystemConfiguration.framework、Security.framwork、CoreTelephny。framwork、CoreText.framework、libz.dylib、libsqlite3.dylib
- 添加下列文件:WeiboSDK.bundle
- 打开info.plist,找到sinweibo项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
5.找到URL types ,打开URL identifier为com.weibo的项目,修改item0值为wb[这个是你的appkey] ,如果没有该项按照图中的格式创建
- iOS9.0以上版本需要在info.plist增加以下配置
QQ分享插件配置
1.添加以下Linker Flags: -llibShare、-lQQShare
2.添加以下framwork: TencentOpenAPI.framework
- 添加下列文件: TencentOpenApi_IOS_Bundle.bundle
4.找到URL types,打开URL identifier为tencentopenapi的项目, 修改item0值为tencent[这个是你的appId] ,如果没有该项按照图中的格式创建
- iOS9.0以上版本需要在info.plist增加以下配置
微信分享插件配置
1.添加以下Linker Flags: -llibShare、 -lweixinShare、-lWeChatSDK
2.添加以下framwork: Social.framework、Accounts.framework
3.找到URL types ,打开URL identifier为weixin的项目,修改item0值为wx[这个是你的appid] ,如果没有该项按照图中的格式创建
4.iOS9.0以上版本需要在info.plist增加以下配置
<a id="ulink"/>
5.HBuilderX2.3.4+ 版本需要配置 Universal Link
在info.plist root 节点添加UniversalLinks项,值和微信开放平台配置的一致,参考如下:
查看工程里的AppDelegate.m文件里是否有下面的方法:
>//@Summary:通用链接
-(BOOL)application:(UIApplication )application continueUserActivity:(NSUserActivity )userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
[PDRCore handleSysEvent:PDRCoreSysEventContinueUserActivity withObject:userActivity];
restorationHandler(nil);
return YES;
}
腾讯微博分享分享插件配置
1.添加以下Linker Flags: -llibShare、-lTCWeiboSDK
2.找到URL types ,打开URL identifier为com.tencent的项目,修改item0值为wb[这个是你的appkey] ,如果没有该项按照图中的格式创建
- 打开info.plist,找到tencentweibo项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
- iOS9.0以上版本需要在info.plist增加以下配置
iOS离线打包-地图配置
百度地图配置
Linker Flags、framework等添加方法请参考这个文档
1.添加下列Linker Flags: -llibMap、-lBaiduKeyVerify、-lbmapimp
-
添加下列framework: 添加下列framework libstdc++.tbd libsqlite3.0.dylib QuartzCore.framework CoreGraphics.framework CoreTelephony.framework SystemConfiguration.framework Security.framework MapKit.framework OpenGLES.framework CoreLocation.framework BaiduMapAPI_Utils.framework BaiduMapAPI_Base.framework BaiduMapAPI_Search.framework BaiduMapAPI_Map.framework BaiduMapAPI_Location.framework libbmapimp.a libBaiduKeyVerify.a libssl.a libcrypto.a -
添加下列文件: mapapi.bundle
4.申请Appkey,如果没有appkey将会导致地图显示不出
参考百度地图Appkey申请章节 -
打开Info.plist文件找到baidu项,如果没有按图片中的格式添加该项,在下图中的红色区域输入申请的Appkey
注意info.plist中Bundle identifier要和你输入的安全码一致
常见问题解决
1.如下图只能看见栅格图可能的原因appkey配置不对、Bundle identifier和安全码不一致、百度地图缓存导致的可以删除app重新安装
2.提示appKey校验错误
在XCode控制台搜索baidu maponGetPermissionState 查看错误码是多少,对比百度开发平台错误信息
高德地图配置
Linker Flags、framework等添加方法请参考这个文档
1.添加下列Linker Flags: -llibMap、-lAMapImp
- 添加下列依赖库:
libAMapImp.a、liblibMap.a和
参考高德地图章节 - 添加下列文件: AMap.bundle
4.申请Appkey,如果没有appkey将会导致地图显示不出
参考高德地图Appkey申请章节 - 打开Info.plist文件找到amap项,如果没有按图片中的格式添加该项,在下图中输入申请的appkey
注意:工程里只能有一个地图,其他的地图功能,要删除info.plist里的key,和对应的库文件,请详细根据Feature-iOS.xml文件的内容配置
百度地图配置
Linker Flags、framework等添加方法请参考这个文档
1.添加下列Linker Flags: -llibMap、-lBaiduKeyVerify、-lbmapimp
-
添加下列framework: 添加下列framework libstdc++.tbd libsqlite3.0.dylib QuartzCore.framework CoreGraphics.framework CoreTelephony.framework SystemConfiguration.framework Security.framework MapKit.framework OpenGLES.framework CoreLocation.framework BaiduMapAPI_Utils.framework BaiduMapAPI_Base.framework BaiduMapAPI_Search.framework BaiduMapAPI_Map.framework BaiduMapAPI_Location.framework libbmapimp.a libBaiduKeyVerify.a libssl.a libcrypto.a -
添加下列文件: mapapi.bundle
4.申请Appkey,如果没有appkey将会导致地图显示不出
参考百度地图Appkey申请章节 -
打开Info.plist文件找到baidu项,如果没有按图片中的格式添加该项,在下图中的红色区域输入申请的Appkey
注意info.plist中Bundle identifier要和你输入的安全码一致
常见问题解决
1.如下图只能看见栅格图可能的原因appkey配置不对、Bundle identifier和安全码不一致、百度地图缓存导致的可以删除app重新安装
2.提示appKey校验错误
在XCode控制台搜索baidu maponGetPermissionState 查看错误码是多少,对比百度开发平台错误信息
高德地图配置
Linker Flags、framework等添加方法请参考这个文档
1.添加下列Linker Flags: -llibMap、-lAMapImp
- 添加下列依赖库:
libAMapImp.a、liblibMap.a和
参考高德地图章节 - 添加下列文件: AMap.bundle
4.申请Appkey,如果没有appkey将会导致地图显示不出
参考高德地图Appkey申请章节 - 打开Info.plist文件找到amap项,如果没有按图片中的格式添加该项,在下图中输入申请的appkey
注意:工程里只能有一个地图,其他的地图功能,要删除info.plist里的key,和对应的库文件,请详细根据Feature-iOS.xml文件的内容配置
收起阅读 »iOS离线打包-Feature模块配置
离线打包可以根据需要进行插件的增删,这个过程需要对工程做出修改。
目前插件需要修改的项目包含 LinkerFlags、 Library、Framework、资源文件、宏定义、info.plist文件几项。
并不是所有的插件都要修改以上几项,大部分插件只需要修改其中几项即可。
如果app中出现“缺失模块提醒框”,需要按照下面步骤添加相应的模块即可。
每个插件需要修改哪些项目,每个项目需要配置的值是什么,可以查看SDK中的Feature-iOS.xls文件。
具体修改方法:
如何修改LinkerFlags配置
按照下图找到Other Linker Flags 点击该项,在弹出的窗口中点击+可以添加flag 点击-可以删除flag
如何修改Library配置
library为插件对应的库文件和依赖库, 目前离线打包工程包括所有的库,不需要修改
如何修改framework配置
framework为插件依赖的系统库,按照下图找到framework的配置位置,点击+可以添加,选中framework点击-可以删除
如何添加删除文件
资源为插件需要使用的资源如图片、国际化文件等, 点击File->addFile 在弹出的对话框中选择响应文件即可,
删除时在工程中选中该项目,点击delete键
如何修改宏定义
按照下图找到Macors,在弹出的窗口中点击+可以添加添加-可以删除
离线打包可以根据需要进行插件的增删,这个过程需要对工程做出修改。
目前插件需要修改的项目包含 LinkerFlags、 Library、Framework、资源文件、宏定义、info.plist文件几项。
并不是所有的插件都要修改以上几项,大部分插件只需要修改其中几项即可。
如果app中出现“缺失模块提醒框”,需要按照下面步骤添加相应的模块即可。
每个插件需要修改哪些项目,每个项目需要配置的值是什么,可以查看SDK中的Feature-iOS.xls文件。
具体修改方法:
如何修改LinkerFlags配置
按照下图找到Other Linker Flags 点击该项,在弹出的窗口中点击+可以添加flag 点击-可以删除flag
如何修改Library配置
library为插件对应的库文件和依赖库, 目前离线打包工程包括所有的库,不需要修改
如何修改framework配置
framework为插件依赖的系统库,按照下图找到framework的配置位置,点击+可以添加,选中framework点击-可以删除
如何添加删除文件
资源为插件需要使用的资源如图片、国际化文件等, 点击File->addFile 在弹出的对话框中选择响应文件即可,
删除时在工程中选中该项目,点击delete键
如何修改宏定义
按照下图找到Macors,在弹出的窗口中点击+可以添加添加-可以删除
HBuilder为什么要登录。没网、内网怎么办?可否离线使用?
HBuilderX
HBuilderX可以离线支持,登陆也不是强制的。
HBuilderX需要联网的地方包括:
- 开发App时,仍然需要联网获取appid(不影响uni-app的非App端)
- 云打包需要联网。不想联网也可以配置本地打包,参考https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/508
- HBuilderX安装插件需要联网。如果是内网使用,可以在外网下载好插件,然后把plugin目录copy到内网使用。
=======================以下为老HBuilder相关内容======================================
HBuilder
首先HBuilder支持离线使用,在登录界面有一个跳过注册离线使用的按钮。
但是我们还是需要说一下我们的设计理念,为什么需要联网。
理念
为什么要设计账户体系。
我们认为单机工具没有前途,云+端的开发者服务代表未来,有更多想象空间。
而帐户体系是一切服务的基础。
我们享受了很多免费的互联网服务,但有一个代价,就是需要注册账户。
现在的手机、windows也都需要注册账户,都是云+端的趋势所致。
在开发工具领域,目前vs、dreameweaver新版也需要注册账户,未来这样的工具会越来越多。
安全性
如果开发者顾虑HBuilder会偷偷上传代码,那么不必担忧。
HBuilder需要账户,不是因为计划偷偷上传开发者的代码。
DCloud作为有更大雄心的企业,不会冒让自己身败名裂的巨大风险做坏事,而且我们也实在没动力去看开发者写的代码。
DCloud的股东包括很多开发界的知名人士,比如蒋涛、王淮,名人不会轻易代言,也算对我们的一种背书。
首次使用
HBuilder在一台电脑上第一次使用时需要联网验证激活。
如果是公司有限制,可以请求网管对HBuilder的安全性做测试,安全性肯定是没问题的,毕竟程序员还要上网查资料,没网络怎么工作。可以把dcloud.net.cn加入网络白名单(dcloud.net.cn是托管在阿里云的,旗下有service.dcloud,net.cn、update.dcloud.net.cn、ask.dcloud.net.cn等子站)。
HBuilder支持暂不登录。初次使用HBuilder,若没有网,也可以进入HBuilder。
不过我们还是推荐用户注册一下,不然每次启动HBuilder都要点下暂不登录按钮。(那话怎么说来着,注册个帐户你又不会怀孕)
后续使用
帐户激活过一次后,后续HBuilder支持完全脱线使用,也不用再每次启动点暂不登录。(未激活过还需要点暂不登录)
开发者使用笔记本会经常没有网络,此时可放心,一样是可以写代码的。
只是脱线后需要联网的功能没法用,包括:
- 云端打包(我们也提供了本地打包)
- 插件一键式云端下载安装(也可使用eclipse的本地插件安装方式装插件)
- 升级,包括HBuilder及插件的升级无网络时都无法运行
- 吐槽、问答等功能也需要联网
- 没有网络无法自动每日签到,无法得到签到积分
其他误会
有人误以为登录会造成启动过慢,其实完全不会,1秒都不影响。
前面已经提到,没网络时HBuilder也是可直接进入的。
有人误以为我们做账户体系是为了收费,以后会推出收费免登录的功能。我们确实没这种想法。
如何让公司网管信任HBuilder
关于如何让公司网管信任HBuilder,我们也有点头疼。也欢迎大家给出好招。
但DCloud愿意配合开发者的公司网管的安全审计。
网管可以侦测HBuilder的网络通信流量,肯定是小到不足以上传工程代码的地步。
云服务的强化
后续DCloud还会继续开发更多创新的云服务,让大家体验到不一样的开发模式,账户的属性强化会越来越有意思。
最后,中国人之前从来没有做成功过开发工具,我们开发HBuilder的过程中也经历过很多质疑,
尤其是制作免费工具,不图给开发者卖钱,不就图多几个注册用户嘛,希望大家多支持我们,多帮我们发展用户,谢谢!
HBuilderX
HBuilderX可以离线支持,登陆也不是强制的。
HBuilderX需要联网的地方包括:
- 开发App时,仍然需要联网获取appid(不影响uni-app的非App端)
- 云打包需要联网。不想联网也可以配置本地打包,参考https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/508
- HBuilderX安装插件需要联网。如果是内网使用,可以在外网下载好插件,然后把plugin目录copy到内网使用。
=======================以下为老HBuilder相关内容======================================
HBuilder
首先HBuilder支持离线使用,在登录界面有一个跳过注册离线使用的按钮。
但是我们还是需要说一下我们的设计理念,为什么需要联网。
理念
为什么要设计账户体系。
我们认为单机工具没有前途,云+端的开发者服务代表未来,有更多想象空间。
而帐户体系是一切服务的基础。
我们享受了很多免费的互联网服务,但有一个代价,就是需要注册账户。
现在的手机、windows也都需要注册账户,都是云+端的趋势所致。
在开发工具领域,目前vs、dreameweaver新版也需要注册账户,未来这样的工具会越来越多。
安全性
如果开发者顾虑HBuilder会偷偷上传代码,那么不必担忧。
HBuilder需要账户,不是因为计划偷偷上传开发者的代码。
DCloud作为有更大雄心的企业,不会冒让自己身败名裂的巨大风险做坏事,而且我们也实在没动力去看开发者写的代码。
DCloud的股东包括很多开发界的知名人士,比如蒋涛、王淮,名人不会轻易代言,也算对我们的一种背书。
首次使用
HBuilder在一台电脑上第一次使用时需要联网验证激活。
如果是公司有限制,可以请求网管对HBuilder的安全性做测试,安全性肯定是没问题的,毕竟程序员还要上网查资料,没网络怎么工作。可以把dcloud.net.cn加入网络白名单(dcloud.net.cn是托管在阿里云的,旗下有service.dcloud,net.cn、update.dcloud.net.cn、ask.dcloud.net.cn等子站)。
HBuilder支持暂不登录。初次使用HBuilder,若没有网,也可以进入HBuilder。
不过我们还是推荐用户注册一下,不然每次启动HBuilder都要点下暂不登录按钮。(那话怎么说来着,注册个帐户你又不会怀孕)
后续使用
帐户激活过一次后,后续HBuilder支持完全脱线使用,也不用再每次启动点暂不登录。(未激活过还需要点暂不登录)
开发者使用笔记本会经常没有网络,此时可放心,一样是可以写代码的。
只是脱线后需要联网的功能没法用,包括:
- 云端打包(我们也提供了本地打包)
- 插件一键式云端下载安装(也可使用eclipse的本地插件安装方式装插件)
- 升级,包括HBuilder及插件的升级无网络时都无法运行
- 吐槽、问答等功能也需要联网
- 没有网络无法自动每日签到,无法得到签到积分
其他误会
有人误以为登录会造成启动过慢,其实完全不会,1秒都不影响。
前面已经提到,没网络时HBuilder也是可直接进入的。
有人误以为我们做账户体系是为了收费,以后会推出收费免登录的功能。我们确实没这种想法。
如何让公司网管信任HBuilder
关于如何让公司网管信任HBuilder,我们也有点头疼。也欢迎大家给出好招。
但DCloud愿意配合开发者的公司网管的安全审计。
网管可以侦测HBuilder的网络通信流量,肯定是小到不足以上传工程代码的地步。
云服务的强化
后续DCloud还会继续开发更多创新的云服务,让大家体验到不一样的开发模式,账户的属性强化会越来越有意思。
最后,中国人之前从来没有做成功过开发工具,我们开发HBuilder的过程中也经历过很多质疑,
尤其是制作免费工具,不图给开发者卖钱,不就图多几个注册用户嘛,希望大家多支持我们,多帮我们发展用户,谢谢!
App/uni-app离线本地存储方案
5+App的离线存储
HTML5+的离线本地存储有如下多种方案:
HTML5标准方案:cookie、localstorage、sessionstorage、websql、indexedDB
HTML5Plus扩展方案:plus.navigator.setCookie、plus.storage、plus.io、plus.sqllite
- cookie(标准h5方案)
体量最小,可以设置过期时间。不能跨域。 - localstorage(标准h5方案)
适合key、value键值对的存储,数据量一般不超过5M。是常用的轻量数据存储方案。不能跨域。 - sessionstorage(标准h5方案)
也是键值对,特点是关闭App就消失了,也不能跨webview,一般不用于持久化数据保存。 - websql(标准h5方案)
是手机端关系型数据库,各种手机都支持。注意iOS8、9的wkWebview不支持websql。如果要在iOS8、9上使用websql,请使用uiwebview内核。 - indexedDB(标准h5方案)
是HTML5里最新的数据存储规范,但不是基于SQL,而是基于对象。
indexedDB性能更高,全是异步处理,学习难度偏大。最重要的是目前手机端支持度不行。Android4.4以上和iOS8以上才支持indexedDB。 - plus.navigator.setCookie
与HTML5的标准cookie相比,plus的扩展主要是为了跨域。所谓跨越,就是本地HTML页面和服务器HTML页面共享cookie数据,或者说本地页面的js可以操作服务器页面产生的cookie。如果没有跨越需求,不需要使用plus扩展。注意iOS8以后的wkWebview不支持setcookie。 - plus.storage
plus.storage也是键值对数据存储。它是把OS给原生App使用的键值对存储数据库封装一层给JS使用。
plus.storage没有理论上的大小限制。也是持久化的,不会被当做缓存清理。
plus.storage相比于localstorage 还有一个特点是可跨域。当一个存储数据,需要被本地和来自服务器的页面同时读写时,就涉及跨域问题。此时HTML5的localstorage不能满足需求,只能使用plus.storage。
plus.storage操作要比localstorage慢几十毫秒,尤其是在循环里调用plus api会放大这种慢。
有网友封装了一个框架,针对key-value数据,在localstorage超过5m时自动切换到plus.storage,参考http://ask.dcloud.net.cn/article/552。虽然这么做听起来有点复杂,但我们对这种追求性能极致的开发者非常赞赏。 - plus.io
plus.io是文件读写,虽然也可以通过读写txt等文件存储数据,但并不如专业的storage和websql方便。
plus.io更多的是用于图片等多媒体文件的本地保存。
比如图文列表的离线使用,一般有2种做法:- 图片下载不通过img的src,而是plus.dowload下载的,先下载图片,存好路径后,然后img的src动态指定文件路径
- 图片使用img的src下载,然后用canvas把img存成图片文件。下次不联网,img的scr直接指向本地文件
- plus.sqllite
plus.sqllite是对原生的sqllite的封装。它也是一种可以通过sql在本地增删改查数据库的方案。
有点类似websql,但相对于websql而言,sqllite的好处是:- 可以预置基础数据库,直接打包到app里
- 当手机空间不足时,websql可能会被清理,而sqllite不会。
plus.storage没有理论上的大小限制。
有人问三方清理工具清理垃圾会不会造成某些数据丢失,这个可能性是存在的,但概率并不高,取决于清理软件会不会分析你的存储数据里哪些是可以清除的垃圾数据。除了OS的清理工具外,一般没有root权限的清理工具是拿不到除了plus.io外的你的app的存储数据的。
但ios上系统存储空间很少的时候,系统会清理 cookie、localstorage、sessionstorage、websql、indexedDB 的数据,此时使用plus.storage、plus.sqllite更安全。
uni-app存储
uni-app的存储方案比5+app要少,因为cookie、localstorage、sessionstorage、websql、indexedDB只有h5端支持,其他端都不支持。
uni.storage的键值对存储,这个是全端支持的。
uni-app的Storage在不同端的实现不同,uni.storage在app侧,映射为plus.storage;h5侧映射为localstorage;各个小程序平台映射为其自带的storage键值对存储:
- H5端为localStorage,浏览器限制5M大小,是缓存概念,可能会被清理
- App端为原生的plus.storage,无大小限制,不是缓存,持久化
- 各个小程序端为其自带的storage api,数据存储生命周期跟小程序本身一致,即除用户主动删除或超过一定时间被自动清理,否则数据都一直可用。
- 微信小程序单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
- 支付宝小程序单条数据转换成字符串后,字符串长度最大200*1024。同一个支付宝用户,同一个小程序缓存总上限为10MB。
- 百度、头条小程序文档未说明大小限制
app端还支持2种方案
- 使用plus.io访问文件系统
- 使用plus.sqlite访问数据库
5+App的离线存储
HTML5+的离线本地存储有如下多种方案:
HTML5标准方案:cookie、localstorage、sessionstorage、websql、indexedDB
HTML5Plus扩展方案:plus.navigator.setCookie、plus.storage、plus.io、plus.sqllite
- cookie(标准h5方案)
体量最小,可以设置过期时间。不能跨域。 - localstorage(标准h5方案)
适合key、value键值对的存储,数据量一般不超过5M。是常用的轻量数据存储方案。不能跨域。 - sessionstorage(标准h5方案)
也是键值对,特点是关闭App就消失了,也不能跨webview,一般不用于持久化数据保存。 - websql(标准h5方案)
是手机端关系型数据库,各种手机都支持。注意iOS8、9的wkWebview不支持websql。如果要在iOS8、9上使用websql,请使用uiwebview内核。 - indexedDB(标准h5方案)
是HTML5里最新的数据存储规范,但不是基于SQL,而是基于对象。
indexedDB性能更高,全是异步处理,学习难度偏大。最重要的是目前手机端支持度不行。Android4.4以上和iOS8以上才支持indexedDB。 - plus.navigator.setCookie
与HTML5的标准cookie相比,plus的扩展主要是为了跨域。所谓跨越,就是本地HTML页面和服务器HTML页面共享cookie数据,或者说本地页面的js可以操作服务器页面产生的cookie。如果没有跨越需求,不需要使用plus扩展。注意iOS8以后的wkWebview不支持setcookie。 - plus.storage
plus.storage也是键值对数据存储。它是把OS给原生App使用的键值对存储数据库封装一层给JS使用。
plus.storage没有理论上的大小限制。也是持久化的,不会被当做缓存清理。
plus.storage相比于localstorage 还有一个特点是可跨域。当一个存储数据,需要被本地和来自服务器的页面同时读写时,就涉及跨域问题。此时HTML5的localstorage不能满足需求,只能使用plus.storage。
plus.storage操作要比localstorage慢几十毫秒,尤其是在循环里调用plus api会放大这种慢。
有网友封装了一个框架,针对key-value数据,在localstorage超过5m时自动切换到plus.storage,参考http://ask.dcloud.net.cn/article/552。虽然这么做听起来有点复杂,但我们对这种追求性能极致的开发者非常赞赏。 - plus.io
plus.io是文件读写,虽然也可以通过读写txt等文件存储数据,但并不如专业的storage和websql方便。
plus.io更多的是用于图片等多媒体文件的本地保存。
比如图文列表的离线使用,一般有2种做法:- 图片下载不通过img的src,而是plus.dowload下载的,先下载图片,存好路径后,然后img的src动态指定文件路径
- 图片使用img的src下载,然后用canvas把img存成图片文件。下次不联网,img的scr直接指向本地文件
- plus.sqllite
plus.sqllite是对原生的sqllite的封装。它也是一种可以通过sql在本地增删改查数据库的方案。
有点类似websql,但相对于websql而言,sqllite的好处是:- 可以预置基础数据库,直接打包到app里
- 当手机空间不足时,websql可能会被清理,而sqllite不会。
plus.storage没有理论上的大小限制。
有人问三方清理工具清理垃圾会不会造成某些数据丢失,这个可能性是存在的,但概率并不高,取决于清理软件会不会分析你的存储数据里哪些是可以清除的垃圾数据。除了OS的清理工具外,一般没有root权限的清理工具是拿不到除了plus.io外的你的app的存储数据的。
但ios上系统存储空间很少的时候,系统会清理 cookie、localstorage、sessionstorage、websql、indexedDB 的数据,此时使用plus.storage、plus.sqllite更安全。
uni-app存储
uni-app的存储方案比5+app要少,因为cookie、localstorage、sessionstorage、websql、indexedDB只有h5端支持,其他端都不支持。
uni.storage的键值对存储,这个是全端支持的。
uni-app的Storage在不同端的实现不同,uni.storage在app侧,映射为plus.storage;h5侧映射为localstorage;各个小程序平台映射为其自带的storage键值对存储:
- H5端为localStorage,浏览器限制5M大小,是缓存概念,可能会被清理
- App端为原生的plus.storage,无大小限制,不是缓存,持久化
- 各个小程序端为其自带的storage api,数据存储生命周期跟小程序本身一致,即除用户主动删除或超过一定时间被自动清理,否则数据都一直可用。
- 微信小程序单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
- 支付宝小程序单条数据转换成字符串后,字符串长度最大200*1024。同一个支付宝用户,同一个小程序缓存总上限为10MB。
- 百度、头条小程序文档未说明大小限制
app端还支持2种方案
- 使用plus.io访问文件系统
- 使用plus.sqlite访问数据库
plus初始化原理及plus is not defined,mui is not defined 错误汇总
关于plus是哪里来的问题
plus是5+Runtime的内部对象。
就像chrome浏览器里有chrome.开头的一些对象方法,5+runtime内部内置了plus对象。
因为plus和mui不一样,plus是引擎级别的,不需要前端框架。而mui是前端框架,所以是要引入mui.js才能使用的。
不要在没有plus和mui的环境下调用相关API
普通浏览器里没有plus环境,只有HBuilder真机运行、打包后、或流应用环境下才能运行plus api。
在普通浏览器里运行时plus api时控制台必然会输出plus is not defined错误提示。
mui作为一个前端框架,你必须保证当前页面引入了mui.js。否则也会出现mui is not defined。
不要在plus和mui未完成初始化时调用相关API
就像在dom初始化完成前(DOMContentLoaded)去操作dom,就会报错是一样的道理。
plus和mui都需要初始化,在初始化完成后调用再调用。
一般我们在plusready的回调事件里调用plus api。
document.addEventListener('plusready',function () {
// 在这里调用plus api
},false);
执行更高效的写法是这样,如果plus已经存在,就直接使用
function plusReady(){
// 在这里调用plus api
}
if(window.plus){
plusReady();
}else{
document.addEventListener('plusready',plusReady,false);
}
mui框架对此进行了封装,写法更简单:
mui.plusReady(function(){
// 在这里调用plus api
});
事实上,mui作为一个框架,也有初始化的过程,但mui的初始化过程在DOMContentLoaded完毕后就结束了。
mui ready的写法是这样,但一般无需使用。
mui.ready(function () {
})
关于加载顺序
plus的ready的时间,在2016年12月后的ios版本上,其实是随时可用状态,不需要plus ready概念,但为了保持向下兼容,也仍然存在plus的ready事件;而安卓版本,plus的ready的时间是可以调节的。具体参考http://ask.dcloud.net.cn/article/921
而mui的ready一般伴随DOMContentLoaded而完成。
详细的启动时序参考这里:http://ask.dcloud.net.cn/article/571
关于plus是哪里来的问题
plus是5+Runtime的内部对象。
就像chrome浏览器里有chrome.开头的一些对象方法,5+runtime内部内置了plus对象。
因为plus和mui不一样,plus是引擎级别的,不需要前端框架。而mui是前端框架,所以是要引入mui.js才能使用的。
不要在没有plus和mui的环境下调用相关API
普通浏览器里没有plus环境,只有HBuilder真机运行、打包后、或流应用环境下才能运行plus api。
在普通浏览器里运行时plus api时控制台必然会输出plus is not defined错误提示。
mui作为一个前端框架,你必须保证当前页面引入了mui.js。否则也会出现mui is not defined。
不要在plus和mui未完成初始化时调用相关API
就像在dom初始化完成前(DOMContentLoaded)去操作dom,就会报错是一样的道理。
plus和mui都需要初始化,在初始化完成后调用再调用。
一般我们在plusready的回调事件里调用plus api。
document.addEventListener('plusready',function () {
// 在这里调用plus api
},false);
执行更高效的写法是这样,如果plus已经存在,就直接使用
function plusReady(){
// 在这里调用plus api
}
if(window.plus){
plusReady();
}else{
document.addEventListener('plusready',plusReady,false);
}
mui框架对此进行了封装,写法更简单:
mui.plusReady(function(){
// 在这里调用plus api
});
事实上,mui作为一个框架,也有初始化的过程,但mui的初始化过程在DOMContentLoaded完毕后就结束了。
mui ready的写法是这样,但一般无需使用。
mui.ready(function () {
})
关于加载顺序
plus的ready的时间,在2016年12月后的ios版本上,其实是随时可用状态,不需要plus ready概念,但为了保持向下兼容,也仍然存在plus的ready事件;而安卓版本,plus的ready的时间是可以调节的。具体参考http://ask.dcloud.net.cn/article/921
而mui的ready一般伴随DOMContentLoaded而完成。
详细的启动时序参考这里:http://ask.dcloud.net.cn/article/571














































