1.应用闪退分析与 uniapp 安卓原生插件开发
2.uniapp 安卓和ios权限获取
3.uniappåhbuilderçå
³ç³»ï¼
4.uniapp技巧-滚动组件
5.uniapp app(ios/Android)怎么真机调试
应用闪退分析与 uniapp 安卓原生插件开发
公司开发的搜题uniapp应用在红米NoteT Pro上遇到拍照后闪退的问题。经过分析,源码首先确认前端代码无误,题库且问题仅在部分机型上出现。搜题通过网络查找,源码排除了代码和部分常见原因。题库拇指推源码
接着,搜题使用离线打包配置在Android Studio中运行项目到真机,源码并开启logcat。题库通过过滤特定日志包和等级,搜题获取有用信息,源码发现按下拍摄键后应用进程被结束,题库但未找到相关crash日志。搜题搜索机型关键词,源码发现与问题相似的题库情况,提示可能是应用进入后台后被系统回收资源。
了解到应用后台优先级(oom_adj值)对系统内存管理有影响,blumind源码值越低表示优先级越高,越不容易被回收资源。常见值有前台、后台等。通过命令查看应用优先级,发现进入后台时优先级较低,与消耗大量内存的拍摄行为结合,导致应用被系统回收资源。因此,需要提升应用的后台优先级以保活。
针对问题,采用Android实现进程保活方案,开发一个Android原生插件,尝试提升应用的后台优先级。遵循uniapp文档,配置环境、strchr 源码创建module、实现插件功能。通过启动前台服务方案,修改AndroidManifest.json注册服务并添加权限,实现后台保活效果。查看应用后台时的oom_adj值变小,解决了拍照闪退问题。
应用后台保活功能实现后,查看应用在后台限制下的表现,证实了应用一直存活。虽然尝试了其他保活实现方式,但由于国内对后台运行、自启动、关联启动的严格限制,实现保活较为困难。考虑到轻量级保活功能的flowplayer源码审核可能性,同事提出可以自定义拍照页面来完成拍照功能,从而避免应用被系统杀死。
总结过程中,发现与保活相关的讨论和经验分享。在面对应用商店对后台运行的严格要求时,寻找合规且有效的方式实现应用的保活功能,成为了一个挑战。对于轻量级保活功能的审核,还需进一步观察。
uniapp 安卓和ios权限获取
在使用uniapp进行项目开发时,遇到了一个拍照和相册功能的问题。起初一切正常,但客户在权限提示时选择禁止,随后在尝试拍照时不再出现提示。
经过一番思考,发现每次拍照和相册功能的fresco 源码使用都需要判断对应的权限是否开启。
在搜索过程中,发现一位博主的文章提到了iOS存在权限列表的问题。
参考了该博主的方法,成功解决了问题。不过,我对方法进行了优化。
在开始使用该功能前,必须下载官方的权限js文件permission.js。我将其放置在utils文件夹中,具体位置可根据需要调整。
此外,还需要使用vuex或uni storage存储一个变量,用于判断iOS是否是第一次打开拍照或相册。
以下为工具包的示例代码:
javascript
import permission from "./permission";
export function permissionCheck() {
return new Promise(async (resolve, reject) => {
if (uni.getSystemInfoSync().platform === 'ios') {
const camera = permission.judgeIosPermission("camera");
if (camera) {
resolve();
} else {
reject('需要开启相机使用权限');
}
} else {
let camera = await permission.requestAndroidPermission("android.permission.CAMERA");
let photoLibrary = await permission.requestAndroidPermission("android.permission.READ_EXTERNAL_STORAGE");
if (camera == -1 || photoLibrary == -1) {
reject('请同时开启相机和相册的使用权限');
} else {
resolve();
}
}
});
}
export function phonePermissionSetting() {
permission.gotoAppPermissionSetting();
}
以下为具体应用场景的示例代码:
javascript
import { permissionCheck, phonePermissionSetting} from '@/utils/phonePermissionCheck';
chooseImage() {
const callback = () => {
uni.chooseImage({
count: 1,
sourceType: ["camera"],
success: (res) => {
//选择成功
},
});
};
// #ifdef H5
callback()
// #endif
// 由于iOS的机制问题,只有用过该功能它的权限列表才会出现该权限的设置,iOS调用第一次就可直接打开相机
// #ifndef H5
const iosFirstOpenCamera = //这里是获取vuex 或者 storage 存储的变量
if (uni.getSystemInfoSync().platform === 'ios' && iosFirstOpenCamera) {
//把判断iOS这个变量置为false
this.$vuex.commit('SET_IOS_FIRST_OPEN_CAMERA', false)
or uni.getStorage('xxx')
callback()
} else {
permissionCheck().then(res => {
callback()
}).catch(err => {
uni.showModal({
title: '手机权限',
content: err,
success: function (res) {
if (res.confirm) {
phonePermissionSetting()
} else if (res.cancel) {
}
}
});
})
}
// #endif
},
uniappåhbuilderçå ³ç³»ï¼
uniappå¼åå®åappéè¦ä»ä¹å¼å软件
æ¨èææuniappç跨端å¼åé½ä½¿ç¨HBuilderXè¿è¡å¼åï¼è¿éæ¨èä¸æ¯å 为webstormãvscodeæä¹æ ·ä¸å¥½ï¼èæ¯å 为HBuilderX对uniappçè¯æ³åvueç¸å ³çæ示æ´ä¸ºçæ¹ä¾¿ï¼ä¸æ´è½»éãç¥è¯åå¤ï¼çævueçç¸å ³è¯æ³ã
第äºç§æ¯Uni-appæ¡æ¶åºäºVue.jsãä¿ç§°ä¸å¥ä»£ç ç¼å°8个平å°ä¸ã
uni-appæ¯ä¸ä¸ªä½¿ç¨Vue.jså¼åææå端åºç¨çæ¡æ¶ï¼å¼åè ç¼åä¸å¥ä»£ç ï¼å¯åå¸å°iOSãAndroidãH以ååç§å°ç¨åºï¼å¾®ä¿¡/æ¯ä»å®/ç¾åº¦/头æ¡/QQ/éé/æ·å®ï¼ãå¿«åºç¨çå¤ä¸ªå¹³å°ã
踩åè®°-uniapp+uView(HBuilder)
1ãQï¼æ¹æ¡1ï¼æåæç´¢å¾æ çåå æ¯ï¼å¤ä½çé£ä¸ªç°è²æç´¢å¾æ æ¯ç§»å¨ç«¯è§£æinputtype=searchæ¶ï¼èªå¸¦çå¾æ æ ·å¼ãæ åªéè¦å°inputsearchç±»åæ¹æ常è§textç±»åå³å¯ã
2ãæè¿è¦ä»é¶å¼åä¸ä¸ªè·åå°ç®¡çç³»ç»å¯¹æ¥çå°ç¨åºï¼å 为åè½æ¯è¾å¤æï¼æ¶é´çï¼éæ©äºæ¯è¾ç«çuni-appï¼å 为å°ç¨åºåºç°çæ¶é´è¾çï¼åæ¹é¢å¹¶ä¸å®åï¼å¼åè¿ç¨ä¸å°±æ¯ä¸æ踩åçè¿ç¨ï¼ç¹æ¤è®°å½ä¸å°ä¸ã
3ã两个æ®é页é¢ä¹é´ç跳转ç¨uni.navgateTo()ï¼urlå¯æºå¸¦åæ°ãæ®é页é¢è·³tabbaré ç½®è¿ç页é¢éè¦uni.switchTab()ï¼urlä¸è½ä¼ å¼ã
4ãuniappå¯ä»¥éåºå¤ä¸ªå¹³å°å¼åï¼ä½ ä¼åç°å¨HBuilderXä¸çå ç½®æµè§å¨ä¸è°æ¥å£ï¼æ²¡é®é¢ï¼å¨å°ç¨åºä¸ï¼ä¹æ²¡é®é¢ï¼è¿æ¥ææºèè°ä¹æ²¡é®é¢ï¼å½åå°è®¾ç½®å 许跨åä¹åï¼å端h5éè¦è¿è¡è®¾ç½®åå代çæè½è§£å³è¿ä¸ªé®é¢ã
5ãhbuilderè¿è¡uniapp没ååºï¼æ£æ¥å¾®ä¿¡å¼åè å·¥å ·ä¸æ¯å¦å¼å¯æå¡ç«¯å£å·ã
uniappä¹h5åå代ç设置踩å,解å³è·¨åé®é¢uniappå¯ä»¥éåºå¤ä¸ªå¹³å°å¼åï¼ä½ ä¼åç°å¨HBuilderXä¸çå ç½®æµè§å¨ä¸è°æ¥å£ï¼æ²¡é®é¢ï¼å¨å°ç¨åºä¸ï¼ä¹æ²¡é®é¢ï¼è¿æ¥ææºèè°ä¹æ²¡é®é¢ï¼å½åå°è®¾ç½®å 许跨åä¹åï¼å端h5éè¦è¿è¡è®¾ç½®åå代çæè½è§£å³è¿ä¸ªé®é¢ã
è¿ä¸ªåå ææªæ¾å°å¨uniappçH5çæ¬ï¼æ¥å ¥è ¾è®¯äºæ»å¨éªè¯ï¼ç¤ºä¾çç¹å»æ»å¨éªè¯å ç´ æ¯éè¿domæä½çï¼ä½æ¯æ æï¼å¯è½è·uniAPPä¸æ¯ædomæä½æå ³ç³»ï¼éç¨å®å¶æ¥å ¥æ¹æ³ä¸ï¼æå¨è°ç¨ã
第ä¸ç§è§£å³æ¹æ³ï¼ç´æ¥å建ä¸ä¸ªvue.config.jsæ件ï¼å¹¶å¨éé¢é ç½®devServerï¼ç´æ¥ä¸ä»£ç ï¼éå¯è·é¡¹ç®ã第äºç§è§£å³æ¹æ³ï¼å¨srcç®å½ä¸æ¾å°mainfest.jsonæ件ï¼ä¿®æ¹è¯¥æ件ï¼ç¹å»âæºç è§å¾âçå°h5ï¼æ¥å£è°ç¨ã
webpackçæ¬ä¸å ¼å®¹uniapp1ãå¦æä½ ä½¿ç¨å ¶ä»ideå¼åuni-appï¼ä¼ç»å¸¸å 为æ¼éåè¯èè¿è¡å¤±è´¥ï¼å 为ç»è¿webpackç¼è¯ä¸éï¼å¾å¤é误ååºçä¸å¤ç´è§ï¼æéæ¶é´å¾é¿ï¼ä¸å¦ä»å¼å§å°±ä¾èµæè¯å¥½æ示çHBuilderXï¼é¿å æ²éåè¯ã
2ãæ¥éª¤veu.config.jsä¸æ¨èå®è£ copy-webpack-plugin0.0çæ¬ã
3ãnpminstallå®è£ uniappç¨ä¸äºé£æ¯å 为ä¸å ¼å®¹ï¼æ以è¿ä¸ªæ¶åå°±éè¦ä½¿ç¨Windowsçç³»ç»ï¼å¦æ没æ温度æ¯çç³»ç»ï¼å®è¿ä¸ªæ¯æ æ³å ¼å®¹çï¼å 为ä»ä»¬ä¸¤ä¸ªé½æ¯å±äºææ°çä¸ä¸ªææ¡£å软件ã
4ãå 为uniappå¼åiosä¸å ¼å®¹ï¼æ以ä¸å¯ç¨ãä¸å¾ä¸è¯´ï¼ä»»ä½ä¸ä¸ªå¼åè éå°è¹æææºé½ä¼æå¤æå°éè¦åéé ã
5ãåå¨ç©ºé´ä¸è¶³ï¼è¯·å é¤åå¨ç©ºé´å ä¸å¿ è¦çæ件ï¼é¢çåºæ´å¤çåå¨ç©ºé´ï¼ç³»ç»ä¸å·²åå¨è¯¥ç¨åºï¼è¯·å¸è½½åéæ°å®è£ ï¼è½¯ä»¶çæ¬ä¸ç³»ç»ä¸å ¼å®¹ï¼è¯¦æ 请å¨è¯¢ç¬¬ä¸æ¹è½¯ä»¶å®¢æã
uniappç¨ä»ä¹è½¯ä»¶å¼ååé?1ãuni-appå¯ä»¥ä½¿ç¨HBuilderXçå¼åå·¥å ·è¿è¡å¼åï¼å¯ä»¥å¨å®åãIOSãH5çå¤ç«¯æ建appåºç¨ï¼èAndroidStudioå主è¦ç¨æ¥æ建å®åAppçNativeç¯å¢ï¼ä»¥å对åºçå®è£ å çã
2ãuni-appæ¯ä¸ä¸ªä½¿ç¨Vue.jså¼åææå端åºç¨çæ¡æ¶ï¼å¼åè ç¼åä¸å¥ä»£ç ï¼å¯åå¸å°iOSãAndroidãH以ååç§å°ç¨åºï¼å¾®ä¿¡/æ¯ä»å®/ç¾åº¦/头æ¡/QQ/ééçå¤ä¸ªå¹³å°ãå°ç»ï¼ç¬¬äºç±»å¼åèµ·æ¥æ´æ¾æçï¼è约å¾å¤æ¶é´ææ¬ã
3ãphpãuni-appæ¯ä¸ä¸ªä½¿ç¨Vue.jså¼åææå端åºç¨çæ¡æ¶ï¼å¼åè ç¼åä¸å¥ä»£ç ï¼uniappé åphpå端好ï¼ä¸»è¦æ¯phpçå¼åå¨æè¦æ¯javaä½å¾å¤ï¼èä¸ææ¯é¨æ§ä¹è¦ä½å¾å¤ã
HBuilderXæ¯ä»ä¹?1ãHBuilderæ¯DCloudï¼æ°å天å ï¼æ¨åºçä¸æ¬¾æ¯æHTML5çWebå¼åIDEãHBuilderçç¼åç¨å°äºJavaãCãWebåRubyãHBuilderæ¬èº«ä¸»ä½æ¯ç±Javaç¼åï¼å®åºäºEclipseï¼æä»¥é¡ºå ¶èªç¶å°å ¼å®¹äºEclipseçæ件ã
2ãHBuilderXç®ç§°HXï¼HBuilderï¼Hæ¯HTMLç缩åï¼Builderæ¯å»ºè®¾è ãæ¯ä¸ºå端å¼åè æå¡çéç¨IDEï¼æè 称为ç¼è¾å¨ãä¸vscodeãsublimeãwebstorm类似ã
3ãç½ç»æé®é¢ãHBuilderXç®ç§°HXï¼HBuilderï¼Hæ¯HTMLç缩åï¼Builderæ¯å»ºè®¾è ã
4ãHBuilderãHBuilderXç¼è¾å¨æ¯DCloudå ¨æ°æ¨åºçä¸æ¬¾HTML5çWebå¼åå·¥å ·ï¼è½¯ä»¶ä½ç§¯å°ï¼å¯å¨å¿«ã
uniapp技巧-滚动组件
在最近的项目中,客户要求调整信息展示方式,希望能在一屏内展示过多内容时通过滚动效果实现多屏显示,而非分页。在尝试和筛选多个组件后,我发现uniapp的MAOUI滚动组件能满足需求。以下是实现步骤:
1. 首先,访问uniapp的组件插件市场:
2. 在搜索框中输入“滚动”,找到并选择MAOUI的滚动组件。
3. 点击安装插件,确保在目标工程中已成功导入。在需要使用滚动功能的页面中,通过导入组件:
4. 在data中,预设需要滚动显示的数据,并设置滚动相关选项,如每页显示的行数和滚动动画时长。
5. 根据项目需求调整样式,注意此组件主要针对h5版本,使用px单位。
6. 当所有设置就绪,滚动功能便能正常工作。以下是一个示例:
{ { line.col1}}
{ { line.col2}}
{ { line.col3}}
通过以上步骤,项目成功实现了滚动效果,解决了客户需求。如果你在实施过程中遇到问题,可以在uniapp的插件市场寻找更多帮助。
相关链接:
plugi...>
通过实践和不断调试,这个滚动组件为项目带来了流畅的用户体验。
uniapp app(ios/Android)怎么真机调试
使用 UniApp 开发的 iOS 或 Android 应用,在真机上进行调试,需要遵循一系列步骤确保应用程序能在设备上正确运行。下面,我将分别针对 Android 和 iOS 平台,提供详细的真机调试指南。Android 篇
为了在 Android 设备上调试 UniApp 项目,首先确保已经连接设备与计算机,并通过数据线将设备与计算机连接。在设备上选择“传输文件”选项。随后,在设备的“设置”中找到“关于手机”选项,点击“软件版本”进行操作。具体点击次数可能因设备型号而异,以实际操作为准。点击后,找到“系统更新”并进入“开发人员选项”。启用“USB 调试”,并在弹出的确认框中点击“确定”。在 UniApp 编辑器中,选择运行至 Android App 基座,等待调试完成。成功调试后,应用程序将在设备上自动安装。iOS 篇
在进行 iOS 真机调试前,确保已获取所需的证书。将苹果手机与计算机连接,然后在 UniApp 中运行至 iOS App 基座。在弹出的对话框中选择使用 Apple 证书签名,并填写相应信息。成功签名后,添加手机设备的 UUID 到 Apple Developer 网站的 Devices 部分。如果在添加设备时遇到问题,可以通过百度搜索解决方案,确保成功添加设备。登录公司项目账号,并在 Devices 页面上填写设备信息,然后上传证书。完成证书上传后,再次运行 iOS 真机调试,验证调试成功,应用程序将在设备上正确安装和运行。