UniApp 实战指南

2023-10-30

uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。

打包原生 APP

  1. 申请 AppKey

  • 点击要打包的项目


这里 android 可以使用 com.android.simple 后面不需要更改,但是这里需要和生成 keystore 对应起来。

  • 生成证书 移动开发实战指南使用

    keytool -list -v -keystore ./*.keystore

    查看 SHA1

  • 查看 HBuilderX 版本


选择对应的 SDK


拷贝其中的 HBuilder-Integrate-AS 到目标文件夹

方式一:新建工程
打开Android studio新建一个空白项目


选择 Empty Activity 点击 Next。
Minimum API Level 建议选21及以上
Package name作为应用标志,涉及申请第三方平台账号,一般情况下不建议修改,包名一般设置反向域名,如:io.dcloud.HBuilder
点击 Finish 完成创建。 注意:App离线SDK不支持Kotlin 方式二:导入工程
2.7.0之后提供HBuilder-Integrate-AS工程,可以直接导入HBuilder-Integrate-AS工程,直接运行simpleDemo项目即可。 配置工程

  1. 基础库配置将lib.5plus.base-release.aar、android-gif-drawable-release@1.2.23.aar、uniapp-v8-release.aar和oaid_sdk_1.0.25.aar拷贝到libs目录下

在build.gradle中添加资源引用注意:HBuilderX3.2.5版本之后适配了AndroidX。AndroidX版本需添加如下资源

implementation fileTree(include: ['*.jar'], dir: 'libs')  
 implementation fileTree(include: ['*.aar'], dir: 'libs')  
 implementation 'androidx.appcompat:appcompat:1.0.0'  
 implementation 'androidx.legacy:legacy-support-v4:1.0.0'  
 implementation 'androidx.recyclerview:recyclerview:1.0.0'  
 implementation 'com.facebook.fresco:fresco:2.5.0'  
 implementation "com.facebook.fresco:animated-gif:2.5.0"  
 implementation 'com.github.bumptech.glide:glide:4.9.0'  
 implementation 'com.alibaba:fastjson:1.1.46.android'

完整的 build.gradle 配置

plugins {
    id 'com.android.application'
}

android {
    compileSdk 30

    defaultConfig {
        applicationId "com.leon.*"
        minSdk 21
        targetSdk 28
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

    signingConfigs {
        config {
            keyAlias 'yihuifanghuomiehuo'
            keyPassword '**'
            storeFile file('yihuifanghuomiehuo.keystore')
            storePassword '**'
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }

    buildTypes {
        debug { // 如果丢失,调试到虚拟机时会报 AppKey 丢失或错误
            signingConfig signingConfigs.config
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            signingConfig signingConfigs.config
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    aaptOptions {
        additionalParameters '--auto-add-overlay'
        ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.facebook.fresco:fresco:2.5.0'
    implementation "com.facebook.fresco:animated-gif:2.5.0"
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    implementation 'com.alibaba:fastjson:1.1.46.android'
}

Cop
wzhuxiang
y tos cliardErrorCopi

  1. 应用配置

配置Appkey3.1.10版本起需要申请 Appkey,申请请参考打开Androidmanifest.xml, 导航到Application节点,创建meta-data节点,name为dcloud_appkey,value为申请的AppKey如下:

<application   ...>   
  <meta-data       
  android:name="dcloud_appkey"       
  android:value="替换为自己申请的Appkey" />
  • 配置应用版本号 versionCode为应用的版本号(整数值),用于各应用市场的升级判断,建议与 manifest.json 中 version -> code 值一致。

versionName为应用的版本名称(字符串),在系统应用管理程序中显示的版本号,建议与 manifest.json中 version -> name 值一致。
applicationId为应用的包名,一般设置为反向域名,不建议修改。
建议将targetSdkVersion设置为25或以上。
App离线SDK minSdkVersion最低支持21,小于21在部分5.0以下机型上将无法正常使用。

完整版 AndroidManifest 可参考如下内容。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.leon.*">

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.HBuilderIntegrateAS">
        <activity
            android:name="io.dcloud.PandoraEntry"
            android:configChanges="orientation|keyboardHidden|keyboard|navigation"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:hardwareAccelerated="true"
            android:theme="@style/TranslucentTheme"
            android:screenOrientation="user"
            android:windowSoftInputMode="adjustResize" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="io.dcloud.PandoraEntryActivity"
            android:launchMode="singleTask"
            android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard|smallestScreenSize|screenLayout|screenSize"
            android:hardwareAccelerated="true"
            android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"
            android:screenOrientation="user"
            android:theme="@style/DCloudTheme"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <action android:name="android.intent.action.VIEW" />
                <data android:scheme="h56131bcf" />
            </intent-filter>
        </activity>
        <provider
            android:name="io.dcloud.common.util.DCloud_FileProvider"
            android:authorities="${apk.applicationId}.dc.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/dcloud_file_provider" />
        </provider>
        <meta-data
            android:name="dcloud_appkey"
            android:value="0f41ce1bbc104012ff42bc0dd0b883e8" />
    </application>
</manifest>

注意:${apk.applicationId} 必须替换成当前应用的包名

如果集成离线SDK时需要重写application,必须继承自DCloudApplication,否则会导致SDK中业务逻辑无法正常运行。
将对应的 application 配置到 Androidmanifest.xml中(如下),并添加tools:replace="android:name"以防出现冲突。

<application  
      android:name="io.dcloud.test.TestApplication"  
      android:icon="@drawable/icon"  
      android:label="@string/app_name"  
      tools:replace="android:name">
  </application>

py to clipboardErrorCopied
配置应用图标和启动界面将icon.png、push.png、splash.png放置到drawable,drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi文件夹下,不同文件夹下对应不同图片尺寸,可参考文档


修改Androidmanifest.xml中application节点的icon属性为@drawable/icon。如下图: 注意:splash.png在不同设备上显示效果不一样,为防止出现拉伸的状况,建议使用Android studio生成.9.png类型图片,可参考 文档

- icon.png 为应用的图标。
  - push.png 为推送消息的图标。
  - splash.png 为应用启动页的图标。


资源配置Android studio默认项目没有assets文件夹,需手动创建,创建位置与java目录同级。
创建data文件夹并拷贝资源将SDK->assets->data文件夹拷贝到刚刚创建的assets文件夹下,如下图:


注意:SDK升级时,data下资源需要同时更新。
创建 apps 文件夹并拷贝资源将HBuilderX中的项目导出,将导出的资源复制到assets->apps下,如下图所示: 导出app资源

修改 dcloud_control.xml 中的 appid 为拷贝过来的 uni-app 的 id,确保 dcloud_control.xml 中的appid 与manifest.json 中的 id 与 文件夹名一致,如下图所示:

生成自定义基座,需要在根节点下添加debug="true"和syncDebug="true",如下图:
自定义基座支持热更新需要将debug-server-release.aar打入apk中,生成正式包时可以删除。 详细步骤可参考链接

其他配置AndroidX 配置需要在项目根目录下的gradle.properties文件中添加如下内容 android.useAndroidX=true android.enableJetifier=trueCopy to clipboardErrorCopied运行
连接手机,点击按钮,运行即可。


引入本地 iconfont 的正确姿势

iconfont 文件里面包含 iconfont.ttficonfont.css, 将 iconfont.ttf 文件转位 base64Base64 文件转换工具
打开 iconfont.css文件
修改 @font-face 部分,将转换好的 base64代码粘贴到对应位置,并且设置代码如下:

/* 修改第 1 段 代码 */
@font-face {     
  font-family: "custom-icon";     
  src: url(data:font/truetype;charset=utf-8;base64,转换的base64内容) format('truetype');   
}


最后则再项目中App.vue中引入iconfont.css文件

<style>   
    @import "./font/iconfont.css";   
</style>

在任意组件中使用方法:

// 直接使用
<view class="iconfont icon-XXX"></view>

// 借助 UView Icon 使用
<u-icon name="home"custom-prefix="custom-icon"></u-icon>

蓝牙步骤

(1)初始化蓝牙 uni.openBluetoothAdapter(OBJECT)
(2)开始搜索蓝牙设备 uni.startBluetoothDevicesDiscovery(OBJECT)
(3)发现外围设备 uni.onBluetoothDeviceFound(CALLBACK)
(4)停止搜寻附近的蓝牙外围设备 uni.stopBluetoothDevicesDiscovery(OBJECT)
(5)连接低功耗蓝牙设备 uni.createBLEConnection(OBJECT)
(6)获取蓝牙设备所有服务 uni.getBLEDeviceServices(OBJECT)
(7)获取蓝牙特征 uni.getBLEDeviceCharacteristics(OBJECT)
(8)启用蓝牙设备特征值变化时的 notify 功能 uni.notifyBLECharacteristicValueChange(OBJECT)
(9)监听低功耗蓝牙设备的特征值变化 uni.onBLECharacteristicValueChange(CALLBACK)
(10)对需要操作的特征值进行读、写操作

使用蓝牙开发遇到的问题

1、安卓、微信小程序、IOS 渲染的蓝牙名字不同;
2、安卓、微信小程序、IOS DeviceId 不同,IOS、微信小程序为设备 UUID,安卓为设备MAC;
3、IOS API 从打开到调用不允许省略;
4、单次写入不允许超过 20 字节(40字符);
5、感觉安卓反应慢,在 API 调用前后可以加延时,有时会碰到读取不到服务,有时候读取到的服务又不对,莫名其妙;
6、对于同一个蓝牙设备,必须要规范使用,连接一次,用完断开,如果重复连接,可能会造成多个实例连接同一个蓝牙设备。(蓝牙设备自动断开连接的时间大概20秒左右,具体应该还要看设备);
7、小程序下面找不到蓝牙设备?对,在安卓测试发现的,安卓 10 版本,怎么解决的?
微信开启定位信息,定位总开关也要打开。
蓝牙总开关打开。
不开心;卡住 1 小时,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UniApp 实战指南 的相关文章

  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • Android 2.3 模拟器在更新位置时崩溃

    我正在使用 Eclipse 编写和调试 Android 应用程序 我需要做的事情之一是更新设备的位置 因此我尝试使用模拟器控制窗口中的位置控制面板 在 手动 选项卡上 我选择 十进制 输入有效的纬度和经度 然后单击 发送 不幸的是 接下来发
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • Dagger 2 中“HasFragmentInjector”的实际用法是什么

    我之前已经实现了 dagger2 v2 2 但现在他们也添加了 dagger android 部分 所以我正在用它创建示例项目 我知道旧的方法论 Provide and Modules and 成分等注释 但从 Dagger 2 8 开始
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • python同一文件内class类的调用

    class 类名 def init self self a None self b None def 函数 self x y self x x self y y A 类名 B 类名 A 函数 10 20 print B x B y 将会输出
  • python实现二分查找的四种变体

    本文用python3实现了二分查找的四种变体 一 查找第一个值等于给定值的元素 二 查找最后一个值等于给定值的元素 三 查找第一个大于等于给定值的元素 四 查找最后一个小于等于给定值的元素 python3 一 查找第一个值等于给定值的元素
  • git rebase

    目录 一 开发分支落后于主干分支 个人修复用的分支落后于被修复分支 模拟环境 开始rebase操作 二 本地分支落后于远程分支 多人共用一个分支的情况下其他人有提交 在本地模拟环境 熟悉的可以跳过 比较啰嗦 详细步骤 开始模拟情景 解决 u
  • 【Java学习笔记(一百零七)】之字节码执行引擎,栈帧结构

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 字节码执行引擎 一 概述 物理机和虚拟机都有代码执行能力 物理机的执行引擎建立在处理器 缓存机 指令集和操作系统之上 而虚拟机的执行引擎则是由软件实现的 不会受到物理条件制约地定
  • 稀疏数组(尚硅谷课程的笔记)

    2 稀疏数组 文章来自于听了尚硅谷的课自己所敲 https www bilibili com video BV1E4411H73v p 10 2 1 稀疏数组 我们来看一个实际问题 此时就需要稀疏数组来压缩 稀疏数组基本介绍 当一个数组中大
  • pycharm配置解释器

    因为没有系统学习过pycharm的使用 所以在换了新电脑之后重新配置pycharm一头雾水 查了很多资料 此文用来自己记录 1 解释器选择 virtual Enviroment 第一个是虚拟解释器 我的理解是 直接从pycharm里下载一个
  • 安徽旅游可视化

    安徽旅游可视化 此系统有详细的录屏 下面只是部分截图 需要看完整录屏联系博主 系统开发语言python 框架为django 数据库mysql 分为爬虫和可视化分析
  • 没看错!selenium自动化集成REST api实践!

    01 问题 当我们描述一个 好的自动化测试用例 时 经常出现标准是 精确 自动化测试用例应该测试一件事 只有一件事 与测试用例无关的应用程序的某个部分中的错误不应导致测试用例失败 独立 自动化测试用例不应该受测试套件中任何其他测试用例影响
  • 计算机视觉 相机标定

    目录 一 相机标定原理 1 相机标定简介 2 求解原理 2 1 针孔相机模型 2 2 畸变现象 2 3 像主点偏移 2 4 单应性矩阵H 二 相机标定策略 2 1 相关策略 2 2 棋盘格标定 三 实验内容 1 实验数据 2 实验代码 3
  • Tinyhttpd项目学习及httpd学习

    在参考网络有关Tinyhttpd的内容后 我打算写下自己的学习过程与自己的理解 我会在结尾附上参考的链接 我把代码放在了gitee Tinyhttpd学习 1 Tinyhttpd是一个轻量级的HTTP服务器 2 学习该项目可以学习web服务
  • Java面向对象(4) ——多态

    目录 多态的概念 对象上下转型 多态应用之打印机 多态的概念 多态是指同一个操作作用于某一类对象 可以有不同的解释 产生不同的执行结果 比如 猫吃鱼 狗吃肉 人吃米饭 多态存在的三个必要条件 需要存在继承 extends 或实现 接口 关系
  • 自学经典5个月的python学习历程,很多老司机都不知道的奥秘

    人生苦短 我用Python 下面分享pyhton的一些基础知识 学习中可以帮助快速入门 三元条件判断的3种实现方法 C语言中有三元条件表达式 如 a gt b a b Python中没有三目运算符 但Python有它自己的方式来实现类似的功
  • xilinx开发过程中的ip核配置总结

    1 XILINX的FIFO 不同带宽输入输出 输出时 默认是先输出高位 再输出低位 这个能不能设置 先输出低位再到高位 答 在写入的时候 切换下位置就行了 2 zynq7020 fpga启动了 但是ps没反应 ps灯不闪烁 程序直接ram运
  • Anaconda > Windows+Anaconda迁移到另一个硬盘

    Anaconda轻松迁移到另一个硬盘 so easy 环境 目标 移动Anaconda目录 环境调整 结果 环境 Win10 Windows10 正常运行的Anaconda 安装目录和环境变量都是 C Anaconda3 30 GB 目标
  • 折腾响应式布局设计

    看到这个标题是不是很头大呢 不错 我这一周就折腾了这个既是要求瀑布流 又是响应式布局的货 而且还是在bootstrap框架上折腾的 所以对于响应式布局呢 咱们可以忽略了吗 当然是不行的 响应式布局概念 Responsive design 意
  • [HDU 4738] Caocao‘s Bridges

    Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi But he wouldn t give up Caocao
  • Java Scrpit 语言基础

    数据类型 Java script 的数据类型分为基础数据类型和复合数据类型 Java script的基本数据类型 1 数值型 数值型是Java script 中的最基本的数据类型 和其他语言不同的地方在于它不区分整数数值和浮点数值 在所有的
  • 关于金额验证的Java方法(采用正则表达式)

    这是自己写的一个关于数字验证的方法 public static boolean isNumber String str java util regex Pattern pattern java util regex Pattern comp
  • 标定协议之CCP协议实现流程介绍

    之前两篇文章对CCP标定协议作了初步的介绍 大家也应该有了一定的了解 本文将对CCP标定协议的实现进行介绍 让大家能够进一步理解CCP标定协议 目前CCP协议最新版本是V2 1 在Vector的官网上提供了相应的参考例子 本文基于Vecto
  • UniApp 实战指南

    uni app 是一个使用 Vue js 开发所有前端应用的框架 开发者编写一套代码 可发布到iOS Android Web 响应式 以及各种小程序 微信 支付宝 百度 头条 飞书 QQ 快手 钉钉 淘宝 快应用等多个平台 打包原生 APP
Powered by Hwhale