
MUI底部tab遮挡 iphoneX适配
mui底部tab 拼合而成的页面
var subpages = ['index.html', '../circle/circle.html', '../noopsyche/noopsyche.html', '../personalCenter/personCenter.html'];
var subpage_style = {
top: '0px',
bottom: '51px',
styles: {
"render": "always",//一直渲染
}
};

iphoneX中出现遮挡底部tab现象,如图,采用js判断屏幕大小方式改变bottom值
if(/iphone/gi.test(navigator.userAgent) && (screen.height == 812 && screen.width == 375)){
subpage_style = {
top: '0px',
bottom: '85px',//34px
styles: {
"render": "always",//一直渲染
}
};
}
疑问:
设置viewport-fit=cover,并设置padding-bottom: constant(safe-area-inset-bottom);等四个值并未出现理想效果。
参考链接:
https://cloud.tencent.com/community/article/686372
https://segmentfault.com/q/1010000011998222/
mui底部tab 拼合而成的页面
var subpages = ['index.html', '../circle/circle.html', '../noopsyche/noopsyche.html', '../personalCenter/personCenter.html'];
var subpage_style = {
top: '0px',
bottom: '51px',
styles: {
"render": "always",//一直渲染
}
};
iphoneX中出现遮挡底部tab现象,如图,采用js判断屏幕大小方式改变bottom值
if(/iphone/gi.test(navigator.userAgent) && (screen.height == 812 && screen.width == 375)){
subpage_style = {
top: '0px',
bottom: '85px',//34px
styles: {
"render": "always",//一直渲染
}
};
}
疑问:
设置viewport-fit=cover,并设置padding-bottom: constant(safe-area-inset-bottom);等四个值并未出现理想效果。
参考链接:
https://cloud.tencent.com/community/article/686372
https://segmentfault.com/q/1010000011998222/

【文档】iOS云打包修改权限提示语
打包提交appstore如果用到了如下权限需要修改提示语,详细描述使用这个权限的原因,如不修改提示语appstore审核可能会被拒绝。
Apple的原则是,如果一个app想要申请用户同意某个隐私信息访问许可,需要给用户明确的申请权限的原因,能给用户带来什么价值。
所以要求开发者填写这个原因,并且在iOS向手机用户弹出是否允许app访问某隐私信息时,会同时展示开发者填写的这个描述,以帮助用户判断,是否有必要同意这个app访问隐私信息。
iOS上的隐私信息包括:
- 通讯录 NSContactsUsageDescription
- 麦克风 NSMicrophoneUsageDescription
- 相机 NSCameraUsageDescription
- 相册(访问) NSPhotoLibraryUsageDescription
- 相册(保存图片到相册) NSPhotoLibraryAddUsageDescription
- 定位(使用时获取地理位置) NSLocationWhenInUseUsageDescription
- 定位(持续获取地理位置) NSLocationAlwaysUsageDescription
新版本IOS 11.3上对定位权限进行了合并 使用定位需要增加一个新的声明
- 定位(iOS11.3及以上版本) NSLocationAlwaysAndWhenInUseUsageDescription
- 蓝牙 NSBluetoothPeripheralUsageDescription
- 语音转文字 NSSpeechRecognitionUsageDescription
- 日历 NSCalendarsUsageDescription
设置方法如下:
使用视图方式打开manifest.json文件, 在plus->distribute->apple节点下添加plistcmds(不推荐使用此方法),数据类型为Array,
开发者可复制以下代码到manifest.json文件中并根据实际使用情况进行增减
"plus": {
"distribute": {
"apple": {
"plistcmds": [
"Set :NSContactsUsageDescription 说明读取用户通讯录的原因",
"Set :NSMicrophoneUsageDescription 说明使用麦克风的原因",
"Set :NSPhotoLibraryUsageDescription 说明读取用户相册的原因",
"Set :NSCameraUsageDescription 说明使用用户相机的原因",
"Set :NSPhotoLibraryAddUsageDescription 说明向用户相册添加图片的原因",
"Set :NSLocationAlwaysUsageDescription 说明持续获取用户地理位置的原因",
"Set :NSLocationWhenInUseUsageDescription 说明使用用户地理位置的原因",
"Set :NSLocationAlwaysAndWhenInUseUsageDescription 说明使用用户地理位置的原因"
]
}
}
}
更新:HBuilderX1.1起,在manifest可视化视图-模块权限配置里,可方便的输入提示语,不用再进代码视图操作
注意:
- 通过上面方法修改提示语后需要重新打包,调试基座的提示语不会变化。
举例说明
比如一个外卖应用,获取定位后需要展示附近的美食信息。那么,相应的定位权限描述,应当是类似“获取定位信息用于为用户提供附近的美食信息”这样的描述。而不应当是,“获取用户当前位置信息”这种没有明确描述定位用处的信息。
打包提交appstore如果用到了如下权限需要修改提示语,详细描述使用这个权限的原因,如不修改提示语appstore审核可能会被拒绝。
Apple的原则是,如果一个app想要申请用户同意某个隐私信息访问许可,需要给用户明确的申请权限的原因,能给用户带来什么价值。
所以要求开发者填写这个原因,并且在iOS向手机用户弹出是否允许app访问某隐私信息时,会同时展示开发者填写的这个描述,以帮助用户判断,是否有必要同意这个app访问隐私信息。
iOS上的隐私信息包括:
- 通讯录 NSContactsUsageDescription
- 麦克风 NSMicrophoneUsageDescription
- 相机 NSCameraUsageDescription
- 相册(访问) NSPhotoLibraryUsageDescription
- 相册(保存图片到相册) NSPhotoLibraryAddUsageDescription
- 定位(使用时获取地理位置) NSLocationWhenInUseUsageDescription
- 定位(持续获取地理位置) NSLocationAlwaysUsageDescription
新版本IOS 11.3上对定位权限进行了合并 使用定位需要增加一个新的声明
- 定位(iOS11.3及以上版本) NSLocationAlwaysAndWhenInUseUsageDescription
- 蓝牙 NSBluetoothPeripheralUsageDescription
- 语音转文字 NSSpeechRecognitionUsageDescription
- 日历 NSCalendarsUsageDescription
设置方法如下:
使用视图方式打开manifest.json文件, 在plus->distribute->apple节点下添加plistcmds(不推荐使用此方法),数据类型为Array,
开发者可复制以下代码到manifest.json文件中并根据实际使用情况进行增减
"plus": {
"distribute": {
"apple": {
"plistcmds": [
"Set :NSContactsUsageDescription 说明读取用户通讯录的原因",
"Set :NSMicrophoneUsageDescription 说明使用麦克风的原因",
"Set :NSPhotoLibraryUsageDescription 说明读取用户相册的原因",
"Set :NSCameraUsageDescription 说明使用用户相机的原因",
"Set :NSPhotoLibraryAddUsageDescription 说明向用户相册添加图片的原因",
"Set :NSLocationAlwaysUsageDescription 说明持续获取用户地理位置的原因",
"Set :NSLocationWhenInUseUsageDescription 说明使用用户地理位置的原因",
"Set :NSLocationAlwaysAndWhenInUseUsageDescription 说明使用用户地理位置的原因"
]
}
}
}
更新:HBuilderX1.1起,在manifest可视化视图-模块权限配置里,可方便的输入提示语,不用再进代码视图操作
注意:
- 通过上面方法修改提示语后需要重新打包,调试基座的提示语不会变化。
举例说明
比如一个外卖应用,获取定位后需要展示附近的美食信息。那么,相应的定位权限描述,应当是类似“获取定位信息用于为用户提供附近的美食信息”这样的描述。而不应当是,“获取用户当前位置信息”这种没有明确描述定位用处的信息。
收起阅读 »
【公告】HBuilder8.9.1发布,解决iOS云打包图标不正确的问题,解决Android手机无法真机调试的问题
因需要支持iPhoneX打包,现打包机已升级,使用新版本打包机打包需要重新设置应用图标,否则会导致ipa上传后显示的图标是HBuilder的logo。
正式版HBuilder已更新,请及时升级HBuilder至8.9.0。同时,也可以选择使用HBuilder Alpha版打包。
修复问题
解决某些情况下Android手机真机运行无法连接到手机的问题
注意事项
- 打包前需要在manifest的设置页面重新设置应用图标。
- 遵循苹果的规范,新版HBuilder要求上传一张1024X1024的png图标(必须是严格的png,不能是其它格式的改后缀名使用)。图标上传成功后点击“自动生成所有图标并替换”重新生成应用图标。图标替换成功后重新打包上传即可
- iOS应用部分权限提示不修改的话,很有可能造成appstroe审核被拒。
- 如果在apploder中显示的图标不正确,请尝试上传appstore后,在页面中查看图标是否正确。
其他问题
1 关于iOS云打包修改权限提示语,参考这篇文章中的说明http://ask.dcloud.net.cn/article/12964。
2 iOS 上传App Store 报 ITMS-90096错误处理方法http://ask.dcloud.net.cn/article/12971。
HBuilder Alpha版下载
- 官网点击“下载”,底部“Alpha版本请点击这里”
- 社区首页,右边栏下载“HBuilder Alpha版”
因需要支持iPhoneX打包,现打包机已升级,使用新版本打包机打包需要重新设置应用图标,否则会导致ipa上传后显示的图标是HBuilder的logo。
正式版HBuilder已更新,请及时升级HBuilder至8.9.0。同时,也可以选择使用HBuilder Alpha版打包。
修复问题
解决某些情况下Android手机真机运行无法连接到手机的问题
注意事项
- 打包前需要在manifest的设置页面重新设置应用图标。
- 遵循苹果的规范,新版HBuilder要求上传一张1024X1024的png图标(必须是严格的png,不能是其它格式的改后缀名使用)。图标上传成功后点击“自动生成所有图标并替换”重新生成应用图标。图标替换成功后重新打包上传即可
- iOS应用部分权限提示不修改的话,很有可能造成appstroe审核被拒。
- 如果在apploder中显示的图标不正确,请尝试上传appstore后,在页面中查看图标是否正确。
其他问题
1 关于iOS云打包修改权限提示语,参考这篇文章中的说明http://ask.dcloud.net.cn/article/12964。
2 iOS 上传App Store 报 ITMS-90096错误处理方法http://ask.dcloud.net.cn/article/12971。
HBuilder Alpha版下载
- 官网点击“下载”,底部“Alpha版本请点击这里”
- 社区首页,右边栏下载“HBuilder Alpha版”

将生日按距离某一天远近排序
SELECT t.* FROM T_ABLE t
ORDER BY DATE_FORMAT('2017-8-23','%m.%d') - 0.00 -
(CASE WHEN DATE_FORMAT('2017-8-23','%m.%d') - 0.00 - DATE_FORMAT(birthday,'%m.%d') > 0 THEN DATE_FORMAT(birthday,'%m.%d')+12
ELSE DATE_FORMAT(birthday,'%m.%d') END ) DESC;
例子是MySQL的,其他数据库适当修改
SELECT t.* FROM T_ABLE t
ORDER BY DATE_FORMAT('2017-8-23','%m.%d') - 0.00 -
(CASE WHEN DATE_FORMAT('2017-8-23','%m.%d') - 0.00 - DATE_FORMAT(birthday,'%m.%d') > 0 THEN DATE_FORMAT(birthday,'%m.%d')+12
ELSE DATE_FORMAT(birthday,'%m.%d') END ) DESC;
例子是MySQL的,其他数据库适当修改
收起阅读 »
git使用笔记
1.第一次使用时设置用户名和密码
在全局设置
git config --global user.name "*"
git config --global user.email ***.com
在本地仓库设置
git config user.name ""
git config user.email ***.com
2.查看和修改用户名邮箱
查看用户名和邮箱
git config user.name
git config user.email
修改用户名和邮箱
git config --global user.name "username"
git config --global user.email "email"
3.第一次将本地仓库push到远程仓库
使用环境,本地有仓库,未连接过远程仓库时,(1)先在git上创建仓库。(2)在命令行找到本地仓库,初始化,使用以下命令push到远程仓库
git init
git add README.md (把文件添加到仓库)
git commit -m "first commit" (把文件提交到仓库)
git remote add origin https://github.com/git账户名/****.git
git push -u origin master
Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
由于远程仓库时空的,第一次推送master分支时,加上-u参数,git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支关联起来,在以后的推送或拉取时就可以简化命令。
4.查看远程仓库地址
git remote -v
5.创建分支
git branch <name>
6.切换分支
git checkout <name>
7.版本回退
git reset --hard HEAD^
注:在git中 HEAD表示当前版本,上一个版本就是 HEAD^,以此类推,当往上100个版本可以写成 HEAD~100.
git log 查看提交历史
git reflog查看命令历史
默认的CMD是不支持cat命令的,不过window你可以尝试一下cmder这个强大的cmd工具,它自带git,而且支持部分linux的指令,比如cat.
工作区和暂存区
git和其他版本控制系统如SVN的不同之处就是有暂存区的概念。
工作区(working directory)
就是能在你电脑上看到的目录就是一个工作区
版本库(repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是成为stage(或者叫index)的暂存区,还有Git为我们自动创建的
第一个分支master,以及指向master的一个指针叫HEAD.
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
如果我们只有唯一一个master分支,git commit就是往master分支上提交更改。可以理解为,需要提交的文件通通放
到暂存区,然后,一次性提交暂存区的所有修改。
用git status查看状态。
git add 实际上就是把所提交的所有修改放到暂存区(Stage),然后执行git commit 就可以一次性把暂存区的所有修改提交
到分支。
git diff 是工作区(work dict)和暂存区(stage)的比较 (已修改,未暂存)
git diff --cached 是暂存区(stage)和分支(master)的比较(已暂存,未提交)
git diff master origin/master 已提交,未推送
撤销修改
git chechout . 或者 git reset --hard (已修改,未暂存)
git reset 和git checkout . 或者 git reset --hard (已暂存,未提交)
git reset --hard origin/master (已提交,未推送)
git reset --hard HEAD^ git push -f (已推送)
git提交时忽略文件
在git工作区的根目录下创建一个特殊的.gitignore文件(也就是在仓库目录下新建一个名为.gitignore的文件),把要忽略的文件名填进去,Git就会自动忽略这些文件。
下面我们看看常用的规则:
1)/mtk/ 过滤整个文件夹
2)*.zip 过滤所有.zip文件
3)/mtk/do.c 过滤某个具体文件
例如忽略到cache目录
/cache
这样即可
另外别忘记了在.gitignore文件中加入一行.gitignore,否则的话.gitignore将会被传到GIT服务器上
工作区---->暂存区----->本地仓库------>远程仓库
git add . -----> git commit -m "comment" ---->git push对应上图中的三个箭头
工作区 暂存区在.git文件中
git reset 、git revert 、git checkout 有什么区别?
这个问题同样也需要先了解git仓库的三个组成部分:工作区(working Directory)、暂存区(stage)和历史记录区(History)。
首先是他们的共同点:用来撤销代码仓库中的某些更改。
不同点:
首先,从commit层面来说:
git reset可以将一个分支的末端指向之前得一个commit。然后在下次git执行回收的时候,会把这个commit之后的commit都扔掉。git reset还支持三种标记,用来标记reset指令影响的范围:
--mixed:会影响到暂存区和历史记录区。也是默认选项;
--soft:只影响历史记录区;
--hard:影响工作区、暂存区和历史记录区。
注意:因为git reset 是直接删除commit记录,从而会影响到其他开发人员的分支,所以不要公共分支(比如develop)做这个操作。
git checkout可以将HEAD移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要stash或者commit暂存区和工作区的更改。
git revert和git reset 的目的是一样的,但是做法不同,它会创建新的commit的方式来撤销commit,这样能保留之前的commit历史,比较安全。另外,同样因为可能会覆盖本地的修改,所以执行这个指令之前,你需要stash或者commit暂存区和工作区的更改。
然后,从文件层面来说:
git reset 只是把文件从历史记录区拿到暂存区,不影响工作区的内容,而且不支持--mixed、--soft 和 --hard。
git checkout 则是把文件从历史记录拿到工作区,不影响暂存区的内容。
git revert不支持文件层面的操作。
关键点:(1)对于commit层面和文件层面,这三个指令本身功能差别很大。(2)git revert不支持文件层面的操作。(3)不要在公共分支做git reset操作。
创建与合并分支
当创建一个dev分支,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:git checkout -b dev,创建并切换到dev分支 git checkout master , git merge dev ,合并完之后就可以删除dev了 git branch -d dev
1.第一次使用时设置用户名和密码
在全局设置
git config --global user.name "*"
git config --global user.email ***.com
在本地仓库设置
git config user.name ""
git config user.email ***.com
2.查看和修改用户名邮箱
查看用户名和邮箱
git config user.name
git config user.email
修改用户名和邮箱
git config --global user.name "username"
git config --global user.email "email"
3.第一次将本地仓库push到远程仓库
使用环境,本地有仓库,未连接过远程仓库时,(1)先在git上创建仓库。(2)在命令行找到本地仓库,初始化,使用以下命令push到远程仓库
git init
git add README.md (把文件添加到仓库)
git commit -m "first commit" (把文件提交到仓库)
git remote add origin https://github.com/git账户名/****.git
git push -u origin master
Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
由于远程仓库时空的,第一次推送master分支时,加上-u参数,git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支关联起来,在以后的推送或拉取时就可以简化命令。
4.查看远程仓库地址
git remote -v
5.创建分支
git branch <name>
6.切换分支
git checkout <name>
7.版本回退
git reset --hard HEAD^
注:在git中 HEAD表示当前版本,上一个版本就是 HEAD^,以此类推,当往上100个版本可以写成 HEAD~100.
git log 查看提交历史
git reflog查看命令历史
默认的CMD是不支持cat命令的,不过window你可以尝试一下cmder这个强大的cmd工具,它自带git,而且支持部分linux的指令,比如cat.
工作区和暂存区
git和其他版本控制系统如SVN的不同之处就是有暂存区的概念。
工作区(working directory)
就是能在你电脑上看到的目录就是一个工作区
版本库(repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是成为stage(或者叫index)的暂存区,还有Git为我们自动创建的
第一个分支master,以及指向master的一个指针叫HEAD.
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
如果我们只有唯一一个master分支,git commit就是往master分支上提交更改。可以理解为,需要提交的文件通通放
到暂存区,然后,一次性提交暂存区的所有修改。
用git status查看状态。
git add 实际上就是把所提交的所有修改放到暂存区(Stage),然后执行git commit 就可以一次性把暂存区的所有修改提交
到分支。
git diff 是工作区(work dict)和暂存区(stage)的比较 (已修改,未暂存)
git diff --cached 是暂存区(stage)和分支(master)的比较(已暂存,未提交)
git diff master origin/master 已提交,未推送
撤销修改
git chechout . 或者 git reset --hard (已修改,未暂存)
git reset 和git checkout . 或者 git reset --hard (已暂存,未提交)
git reset --hard origin/master (已提交,未推送)
git reset --hard HEAD^ git push -f (已推送)
git提交时忽略文件
在git工作区的根目录下创建一个特殊的.gitignore文件(也就是在仓库目录下新建一个名为.gitignore的文件),把要忽略的文件名填进去,Git就会自动忽略这些文件。
下面我们看看常用的规则:
1)/mtk/ 过滤整个文件夹
2)*.zip 过滤所有.zip文件
3)/mtk/do.c 过滤某个具体文件
例如忽略到cache目录
/cache
这样即可
另外别忘记了在.gitignore文件中加入一行.gitignore,否则的话.gitignore将会被传到GIT服务器上
工作区---->暂存区----->本地仓库------>远程仓库
git add . -----> git commit -m "comment" ---->git push对应上图中的三个箭头
工作区 暂存区在.git文件中
git reset 、git revert 、git checkout 有什么区别?
这个问题同样也需要先了解git仓库的三个组成部分:工作区(working Directory)、暂存区(stage)和历史记录区(History)。
首先是他们的共同点:用来撤销代码仓库中的某些更改。
不同点:
首先,从commit层面来说:
git reset可以将一个分支的末端指向之前得一个commit。然后在下次git执行回收的时候,会把这个commit之后的commit都扔掉。git reset还支持三种标记,用来标记reset指令影响的范围:
--mixed:会影响到暂存区和历史记录区。也是默认选项;
--soft:只影响历史记录区;
--hard:影响工作区、暂存区和历史记录区。
注意:因为git reset 是直接删除commit记录,从而会影响到其他开发人员的分支,所以不要公共分支(比如develop)做这个操作。
git checkout可以将HEAD移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要stash或者commit暂存区和工作区的更改。
git revert和git reset 的目的是一样的,但是做法不同,它会创建新的commit的方式来撤销commit,这样能保留之前的commit历史,比较安全。另外,同样因为可能会覆盖本地的修改,所以执行这个指令之前,你需要stash或者commit暂存区和工作区的更改。
然后,从文件层面来说:
git reset 只是把文件从历史记录区拿到暂存区,不影响工作区的内容,而且不支持--mixed、--soft 和 --hard。
git checkout 则是把文件从历史记录拿到工作区,不影响暂存区的内容。
git revert不支持文件层面的操作。
关键点:(1)对于commit层面和文件层面,这三个指令本身功能差别很大。(2)git revert不支持文件层面的操作。(3)不要在公共分支做git reset操作。
创建与合并分支
当创建一个dev分支,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:git checkout -b dev,创建并切换到dev分支 git checkout master , git merge dev ,合并完之后就可以删除dev了 git branch -d dev

【示例】原生版本图片预览使用教程
mui内置有H5版本的图片预览插件,教程参考mui文档。
原生图片预览,可以解决当前窗口中使用了原生标题栏等原生组件时,H5版图片预览无法全屏的情况。
相比MUI提供的H5模式,具有更优的体验和性能。先看最终效果:
简单实现
使用5+runtime提供的原生图片预览,详细参考plus.nativeUI.previewImage相关文档。
HTML部分
<div class="mui-content-padded">
<img src="../images/yuantiao.jpg" />
<img src="../images/muwu.jpg" />
<img src="../images/shuijiao.jpg" />
</div>
JavaScript部分
具体实现中,图片地址列表可以在图片信息渲染结束后,就立刻读取;点击某个图片时,只需要查找当前图片在列表中的位置即可。
mui.plusReady(function() {
// 获取图片地址列表
var images = document.querySelectorAll('.mui-content-padded img');
var urls = [];
for(var i = 0; i < images.length; i++) {
urls.push(images[i].src);
}
// 监听图片的点击
mui('body').on('tap', 'img', function() {
// 查询图片在列表中的位置
// 由于dom节点列表是伪数组,需要处理一下
var index = [].slice.call(images).indexOf(this);
plus.nativeUI.previewImage(urls, {
current: index,
loop: true,
indicator: 'number'
});
});
});
注意:实际开发中,如果列表信息会动态加载,则每次加载完成后需要更新图片地址列表。
Hello mui中体验
最新版的Hello mui已集成了原生图片预览的示例,在即将发版的HBuilder 8.9 版本中即可体验,体验路径:
访问 http://www.dcloud.io/ 下载最新版HBuilder,新建Hello mui项目,Hello mui首页--> image viewer(图片预览) --> 图片预览(native模式)
mui内置有H5版本的图片预览插件,教程参考mui文档。
原生图片预览,可以解决当前窗口中使用了原生标题栏等原生组件时,H5版图片预览无法全屏的情况。
相比MUI提供的H5模式,具有更优的体验和性能。先看最终效果:
简单实现
使用5+runtime提供的原生图片预览,详细参考plus.nativeUI.previewImage相关文档。
HTML部分
<div class="mui-content-padded">
<img src="../images/yuantiao.jpg" />
<img src="../images/muwu.jpg" />
<img src="../images/shuijiao.jpg" />
</div>
JavaScript部分
具体实现中,图片地址列表可以在图片信息渲染结束后,就立刻读取;点击某个图片时,只需要查找当前图片在列表中的位置即可。
mui.plusReady(function() {
// 获取图片地址列表
var images = document.querySelectorAll('.mui-content-padded img');
var urls = [];
for(var i = 0; i < images.length; i++) {
urls.push(images[i].src);
}
// 监听图片的点击
mui('body').on('tap', 'img', function() {
// 查询图片在列表中的位置
// 由于dom节点列表是伪数组,需要处理一下
var index = [].slice.call(images).indexOf(this);
plus.nativeUI.previewImage(urls, {
current: index,
loop: true,
indicator: 'number'
});
});
});
注意:实际开发中,如果列表信息会动态加载,则每次加载完成后需要更新图片地址列表。
Hello mui中体验
最新版的Hello mui已集成了原生图片预览的示例,在即将发版的HBuilder 8.9 版本中即可体验,体验路径:
访问 http://www.dcloud.io/ 下载最新版HBuilder,新建Hello mui项目,Hello mui首页--> image viewer(图片预览) --> 图片预览(native模式)

mui中的本地语音转文字,而不用讯飞的,使用百度的。
mui中的本地语音转文字,而不用讯飞的,使用百度的。很多人都是用讯飞的语音识别来语音转中文,要是遇到录制好了的语音要如何转中文呢?,我现在就来教教大家使用百度转:
1.先上百度语音开发者申请账号,地址:http://ai.baidu.com/;
- 所需要的api文档地址是:http://ai.baidu.com/docs#/ASR-API/top
- 先获取token,然后用token以及语音的中的时长去识别,如果要获取本地时长的话
plus.io.resolveLocalFileSystemURL(path, function(entry){
entry.file(function(file){
len = file.size;})});
附加我测试的demo:
var url="http://vop.baidu.com/server_api";
var format = "amr";
var rate = "8000";
var channel = "1";
var cuid = “设备号”,
var speech ='IyFBTVIKPJEXFr5meeHgAeev8AAAAIAAAAAAAAAAAAAAAAAAAAA8SHcklmZ54eAB57rwAAAAwAAAAAAAAAAAAAAAAAAAADxVAIi2Znn
h4AHnz/AAAACAAAAAAAAAAAAAAAAAAAAAPEj5H5ZmeeHgAeeK8AAAAMAAAAAAAAAAAAAAAAAAAAA8CPlmkh3hIXBB58qREQnBLS2
AJiaa8Vqa7gILj8G3gDxCdymROQIAABfzq88RwMhLefLr3vK3U6azfvq2nmHAPD72h50rSBEAHi+aAMR3ptW1FgXQIAf3RyrTkKRbVNA8RG
5xjrpQA2Af58rpoypM11/kORggGJI0bKkO9aI3wDxEclqNTNoAgFMuupawKhLxonjKARrlXizd3p380vlAPEJoZ0PvUAFgHvfaQQNN2t5xEFKHP
1urAHfDDXmGA4A8NHtpjqWEAOBSIPrEkpKP2HysXQprlqRKAXWT10+N0DyQY3GUbFABQB/vCmFBoBTVkGo8slIzg9wwUr/RvD3APAB7ZIjOyA5
gH+fKwRKrZcdSOFwEx+Ze8g/wOCfNaAA8CARG6fxy/uA88Dp+Yugn8Wk/5KA9sbyxsvy/jRTRADwCDhY5+GPd4flQK/fVvOVSgXf7AIZEoon9+tA3M
EDgPAgFpUn/9LXgzts6yb7dudC4IkGZo1Z5/90vmfbgtHA8Ag+dlgBn8EOE0UpIC35c9H+qChMrd7PFyCTBwv60MDwICD9OAGf64ePJOrcalLDNLS7ov
C5JvE9mCWNelXgwPAIHy0yrH59Bj4BaI4qyP8Xt+4Qc4gfGkUBzQtfh3LA8CAhCQf2nxxQbKNpQLF/M/aPIom9Gf4PjhoHm3AlmsDwCBi1B89754PLEa2
pTjxBEU2KJgXSHqNxALEnqcoJwPAQJp4nk7pfhyy+6FzAnVe2vj/kYCpudow+hkuBCaqA8BAmiWeAfXyGPLYu3hWWMRjRajOZDkCUUss+2yKJQ8DwCED
SRtU9O4fGHmmsTyCv60riXaHIP/Y0ae9yPV3LwPAgjnRnhh/yJYY0MUtwAMDpA4bxLil8Vor6diMJOFfA8Aj2jWeN28QH/hRTh60wbArI03gJuPTPDoL7SR
UmskDzgSh4L5sctw9h1rQYDUMqwQW5eR+FuP9ZUE9iQQC2wPAhBlGnjYG0loy4EncjBPAPZExLaiekfQQ+6sJSh4IA8CFITYeZfZ6H9gbxPQBDr6vWF4
k6J0ZOtHyzw2/vgYDwITbJp5kb0tKrRi2EWjYt8KSlbziAzEj+QA6Pv0ZswPARMDmHh++GFutEbMapR4XdZA1i03eV4A3TAoWH/WqA8CEAEYeN3aEPdjDt
4rToGRiO0MRy7QkAWWFT0g4DoEDwIRAxh+J3hgc+Ma/1kshlSrWWKFIO1+QyfnfIiWsLQPAgiAmH+rB8B+4Nr5RddjHVBtf0SoHWEQSUCGLRgruA8AlILT
gIXLMH7gXoyfRJg21YxPRQw5ig5Kx4Slkb2cDwIO75eDFR4wfDEGwOBYZ50KTm0PJ4LHYs4lPwT1iDwPAI2C0Ndrloh8VBq+t13NvJnBEP+W/HlAXR69m
YDRiA8CEW2VgmNA0HwSmtAkCszS0MEkutOvmdBvYI6yKLkgA==';
var token_url = "https://openapi.baidu.com/oauth/2.0/token";
var grant_type = "grant_type=client_credentials&";
var APIkey = "client_id=申请的";
var SecretKey = "client_secret=申请的client_secret&";
var AppID = "申请的appid";
var access_token = "";
token();
setTimeout(function(){
fanyi();
},500);
function token(){
var data = grant_type+APIkey+SecretKey;
mui.ajax(token_url,{
data:data,
type:'post',
timeout:5000,
success:function(resp){
console.log(resp);
console.log(resp.access_token);
access_token = resp.access_token;
},
error:function(xhr,type,errorThrown){
mui.toast("==");
}
});
}
function fanyi(){
var data = "format="+format+"&rate="+rate+"&channel="+channel+"&cuid="+cuid+"&token="+access_token+"&speech="+speech+"&len=8192";
console.log(url+"?"+data);
mui.ajax(url,{
data:data,
type:'post',
timeout:5000,
contentType:"application/json",
success:function(resp){
console.log(resp);
console.log(resp.err_no);
},
error:function(xhr,type,errorThrown){
mui.toast("请求失败");
}
});
}
by:转载请注明地址
mui中的本地语音转文字,而不用讯飞的,使用百度的。很多人都是用讯飞的语音识别来语音转中文,要是遇到录制好了的语音要如何转中文呢?,我现在就来教教大家使用百度转:
1.先上百度语音开发者申请账号,地址:http://ai.baidu.com/;
- 所需要的api文档地址是:http://ai.baidu.com/docs#/ASR-API/top
- 先获取token,然后用token以及语音的中的时长去识别,如果要获取本地时长的话
plus.io.resolveLocalFileSystemURL(path, function(entry){
entry.file(function(file){
len = file.size;})});
附加我测试的demo:
var url="http://vop.baidu.com/server_api";
var format = "amr";
var rate = "8000";
var channel = "1";
var cuid = “设备号”,
var speech ='IyFBTVIKPJEXFr5meeHgAeev8AAAAIAAAAAAAAAAAAAAAAAAAAA8SHcklmZ54eAB57rwAAAAwAAAAAAAAAAAAAAAAAAAADxVAIi2Znn
h4AHnz/AAAACAAAAAAAAAAAAAAAAAAAAAPEj5H5ZmeeHgAeeK8AAAAMAAAAAAAAAAAAAAAAAAAAA8CPlmkh3hIXBB58qREQnBLS2
AJiaa8Vqa7gILj8G3gDxCdymROQIAABfzq88RwMhLefLr3vK3U6azfvq2nmHAPD72h50rSBEAHi+aAMR3ptW1FgXQIAf3RyrTkKRbVNA8RG
5xjrpQA2Af58rpoypM11/kORggGJI0bKkO9aI3wDxEclqNTNoAgFMuupawKhLxonjKARrlXizd3p380vlAPEJoZ0PvUAFgHvfaQQNN2t5xEFKHP
1urAHfDDXmGA4A8NHtpjqWEAOBSIPrEkpKP2HysXQprlqRKAXWT10+N0DyQY3GUbFABQB/vCmFBoBTVkGo8slIzg9wwUr/RvD3APAB7ZIjOyA5
gH+fKwRKrZcdSOFwEx+Ze8g/wOCfNaAA8CARG6fxy/uA88Dp+Yugn8Wk/5KA9sbyxsvy/jRTRADwCDhY5+GPd4flQK/fVvOVSgXf7AIZEoon9+tA3M
EDgPAgFpUn/9LXgzts6yb7dudC4IkGZo1Z5/90vmfbgtHA8Ag+dlgBn8EOE0UpIC35c9H+qChMrd7PFyCTBwv60MDwICD9OAGf64ePJOrcalLDNLS7ov
C5JvE9mCWNelXgwPAIHy0yrH59Bj4BaI4qyP8Xt+4Qc4gfGkUBzQtfh3LA8CAhCQf2nxxQbKNpQLF/M/aPIom9Gf4PjhoHm3AlmsDwCBi1B89754PLEa2
pTjxBEU2KJgXSHqNxALEnqcoJwPAQJp4nk7pfhyy+6FzAnVe2vj/kYCpudow+hkuBCaqA8BAmiWeAfXyGPLYu3hWWMRjRajOZDkCUUss+2yKJQ8DwCED
SRtU9O4fGHmmsTyCv60riXaHIP/Y0ae9yPV3LwPAgjnRnhh/yJYY0MUtwAMDpA4bxLil8Vor6diMJOFfA8Aj2jWeN28QH/hRTh60wbArI03gJuPTPDoL7SR
UmskDzgSh4L5sctw9h1rQYDUMqwQW5eR+FuP9ZUE9iQQC2wPAhBlGnjYG0loy4EncjBPAPZExLaiekfQQ+6sJSh4IA8CFITYeZfZ6H9gbxPQBDr6vWF4
k6J0ZOtHyzw2/vgYDwITbJp5kb0tKrRi2EWjYt8KSlbziAzEj+QA6Pv0ZswPARMDmHh++GFutEbMapR4XdZA1i03eV4A3TAoWH/WqA8CEAEYeN3aEPdjDt
4rToGRiO0MRy7QkAWWFT0g4DoEDwIRAxh+J3hgc+Ma/1kshlSrWWKFIO1+QyfnfIiWsLQPAgiAmH+rB8B+4Nr5RddjHVBtf0SoHWEQSUCGLRgruA8AlILT
gIXLMH7gXoyfRJg21YxPRQw5ig5Kx4Slkb2cDwIO75eDFR4wfDEGwOBYZ50KTm0PJ4LHYs4lPwT1iDwPAI2C0Ndrloh8VBq+t13NvJnBEP+W/HlAXR69m
YDRiA8CEW2VgmNA0HwSmtAkCszS0MEkutOvmdBvYI6yKLkgA==';
var token_url = "https://openapi.baidu.com/oauth/2.0/token";
var grant_type = "grant_type=client_credentials&";
var APIkey = "client_id=申请的";
var SecretKey = "client_secret=申请的client_secret&";
var AppID = "申请的appid";
var access_token = "";
token();
setTimeout(function(){
fanyi();
},500);
function token(){
var data = grant_type+APIkey+SecretKey;
mui.ajax(token_url,{
data:data,
type:'post',
timeout:5000,
success:function(resp){
console.log(resp);
console.log(resp.access_token);
access_token = resp.access_token;
},
error:function(xhr,type,errorThrown){
mui.toast("==");
}
});
}
function fanyi(){
var data = "format="+format+"&rate="+rate+"&channel="+channel+"&cuid="+cuid+"&token="+access_token+"&speech="+speech+"&len=8192";
console.log(url+"?"+data);
mui.ajax(url,{
data:data,
type:'post',
timeout:5000,
contentType:"application/json",
success:function(resp){
console.log(resp);
console.log(resp.err_no);
},
error:function(xhr,type,errorThrown){
mui.toast("请求失败");
}
});
}
by:转载请注明地址
收起阅读 »
iOS APP上架被拒重新提交审核教程
iOS APP审核比较严格,难免会出现被拒绝的情况,需要根据苹果反馈的问题修改后重新打包上传审核!
1、登录itunesconnect、https://itunesconnect.apple.com 进入被拒绝的APP页面
点击未解决的iOS问题,进入查看原因。
2、复制翻译下具体被拒绝的原因,查看反馈的审核截图,根据问题修改app重新打包上传。
也可以直接在回复那里申诉,可以直接写中文。
3、再点击下活动那查看你已上传的版本号,修改打包的时候要比之前的高,比如现在2.0.0,可以修改为2.1或者2.0.1.
4、修改打包好后,重新上传ipa文件。点击被1.0拒绝那,选择构建版本选项,移动鼠标到之前选择的版本那,点击删除。
5、选择修改后新上传的版本,点击完成。
6、然后右上角点击存储。
7、存储好、然后点击提交以供审核。
8、这里出现的信息根据app的类型不同、有不同的选项、根据自己的app的情况选择
一般选择否。
然后提交、显示为正在等待审核、然后等待苹果再次审核。
9、如果变成可供销售,恭喜你~上架成功了,如果还是被拒绝,点击查看问题,根据反馈修改再重新打包上传提交审核。
iOS APP审核比较严格,难免会出现被拒绝的情况,需要根据苹果反馈的问题修改后重新打包上传审核!
1、登录itunesconnect、https://itunesconnect.apple.com 进入被拒绝的APP页面
点击未解决的iOS问题,进入查看原因。
2、复制翻译下具体被拒绝的原因,查看反馈的审核截图,根据问题修改app重新打包上传。
也可以直接在回复那里申诉,可以直接写中文。
3、再点击下活动那查看你已上传的版本号,修改打包的时候要比之前的高,比如现在2.0.0,可以修改为2.1或者2.0.1.
4、修改打包好后,重新上传ipa文件。点击被1.0拒绝那,选择构建版本选项,移动鼠标到之前选择的版本那,点击删除。
5、选择修改后新上传的版本,点击完成。
6、然后右上角点击存储。
7、存储好、然后点击提交以供审核。
8、这里出现的信息根据app的类型不同、有不同的选项、根据自己的app的情况选择
一般选择否。
然后提交、显示为正在等待审核、然后等待苹果再次审核。
9、如果变成可供销售,恭喜你~上架成功了,如果还是被拒绝,点击查看问题,根据反馈修改再重新打包上传提交审核。
收起阅读 »
iPhone X适配
在线版用Alpha版HBuilder打包应该就行,离线版官方给出了demo,但没有给出具体说明,也没给出精简离线版怎么适配,这真的好折腾人,我愣是摸了一天才发现精简离线版适配iPhoneX如此简单,官方就不能说明一下?也是醉了
方法:
1、替换splash图片
2、Info.plist文件中替换UILaunchImages就适配好了
3、如果顶部和底部有白边,更新一下所需的.a文件即可
在线版用Alpha版HBuilder打包应该就行,离线版官方给出了demo,但没有给出具体说明,也没给出精简离线版怎么适配,这真的好折腾人,我愣是摸了一天才发现精简离线版适配iPhoneX如此简单,官方就不能说明一下?也是醉了
方法:
1、替换splash图片
2、Info.plist文件中替换UILaunchImages就适配好了
3、如果顶部和底部有白边,更新一下所需的.a文件即可

蓝牙插件开发中的一点感受,分享一下
安卓6.0以上必须手动授权获取定位权限,否则LeScanCallback()不回调!!!!!蓝牙开发须首先关心这个问题,然后再参考这哥们的文章:http://ask.dcloud.net.cn/question/22989;要灵活强大的蓝牙功能,可自行移植Cordova插件。
Cordova和Dcloud的框架大致上差不多,只是Native 2 js和js 2 Native的机制稍微不同,Cordova的PluginResult和CallbackContext可移植过来,这俩有点类似DCloud的JSUtil。整体来说,DCLOUD的5+ SDK还是比较简洁易用,但是也缺乏了Cordova的灵活与开放,各有各的好,就是因为跳入MUI的坑,所以只能离开一下Cordova了。
另外华为真机调试插件代码里的Log.d没输出的问题解决办法如下:
拨号盘输入:
##2846579##
点击ProjectMenu(也可能是系统菜单)--->后台设置---->LOG设置--->LOG开关 打开重启即可
PS:LOG设置里还有一个选项是LOG级别,我自己测试的时候选择了之后会失效,所以我就只打开了开关,LOG级别不设置保持默认,亲测有效。
安卓6.0以上必须手动授权获取定位权限,否则LeScanCallback()不回调!!!!!蓝牙开发须首先关心这个问题,然后再参考这哥们的文章:http://ask.dcloud.net.cn/question/22989;要灵活强大的蓝牙功能,可自行移植Cordova插件。
Cordova和Dcloud的框架大致上差不多,只是Native 2 js和js 2 Native的机制稍微不同,Cordova的PluginResult和CallbackContext可移植过来,这俩有点类似DCloud的JSUtil。整体来说,DCLOUD的5+ SDK还是比较简洁易用,但是也缺乏了Cordova的灵活与开放,各有各的好,就是因为跳入MUI的坑,所以只能离开一下Cordova了。
另外华为真机调试插件代码里的Log.d没输出的问题解决办法如下:
拨号盘输入:
##2846579##
点击ProjectMenu(也可能是系统菜单)--->后台设置---->LOG设置--->LOG开关 打开重启即可
PS:LOG设置里还有一个选项是LOG级别,我自己测试的时候选择了之后会失效,所以我就只打开了开关,LOG级别不设置保持默认,亲测有效。
收起阅读 »