![](https://img-cdn-tc.dcloud.net.cn/account/identicon/7f148243ad89ae51a0ad1079766f3f79.png)
来来来,给你们看看云端打包的速度
[HBuilder] 11:03:55.857 项目 xxxx的打包状态:
[HBuilder] 11:03:55.857 时间: 2023-09-12 10:41:20 类型: Android云端证书 正在云端打包
[HBuilder] 11:03:55.857 预计2-5分钟完成打包。如项目使用了App原生插件,打包时间可能会较长,请耐心等待。
[HBuilder] 11:04:53.821 项目 xxxx的打包状态:
[HBuilder] 11:04:53.821 时间: 2023-09-12 10:41:20 类型: Android云端证书 正在云端打包
[HBuilder] 11:04:53.821 预计2-5分钟完成打包。如项目使用了App原生插件,打包时间可能会较长,请耐心等待。
[HBuilder] 11:05:53.630 项目 xxxx的打包状态:
[HBuilder] 11:05:53.630 时间: 2023-09-12 10:41:20 类型: Android云端证书 正在云端打包
[HBuilder] 11:05:53.630 预计2-5分钟完成打包。如项目使用了App原生插件,打包时间可能会较长,请耐心等待。
这种速度真垃圾
首先声明,我这应用里面不包含原生插件,不包含第三方东西
这速度,吃屎估计都赶不上热乎的吧
[HBuilder] 11:03:55.857 项目 xxxx的打包状态:
[HBuilder] 11:03:55.857 时间: 2023-09-12 10:41:20 类型: Android云端证书 正在云端打包
[HBuilder] 11:03:55.857 预计2-5分钟完成打包。如项目使用了App原生插件,打包时间可能会较长,请耐心等待。
[HBuilder] 11:04:53.821 项目 xxxx的打包状态:
[HBuilder] 11:04:53.821 时间: 2023-09-12 10:41:20 类型: Android云端证书 正在云端打包
[HBuilder] 11:04:53.821 预计2-5分钟完成打包。如项目使用了App原生插件,打包时间可能会较长,请耐心等待。
[HBuilder] 11:05:53.630 项目 xxxx的打包状态:
[HBuilder] 11:05:53.630 时间: 2023-09-12 10:41:20 类型: Android云端证书 正在云端打包
[HBuilder] 11:05:53.630 预计2-5分钟完成打包。如项目使用了App原生插件,打包时间可能会较长,请耐心等待。
这种速度真垃圾
首先声明,我这应用里面不包含原生插件,不包含第三方东西
这速度,吃屎估计都赶不上热乎的吧
![](http://img-cdn-tc.dcloud.net.cn/uploads/avatar/000/42/82/63_avatar_mid.jpg?v=1628147404)
app启动图
1.安卓用android studio工具,就是不太好画,对图形内容有要求;
2.ios用Xcode做,Xcode下面有个预览,可以看看在各个手机的展示效果,就可以看到了。
1.安卓用android studio工具,就是不太好画,对图形内容有要求;
2.ios用Xcode做,Xcode下面有个预览,可以看看在各个手机的展示效果,就可以看到了。
![](http://img-cdn-tc.dcloud.net.cn/uploads/avatar/002/40/96/13_avatar_mid.jpg?v=1694168614)
小程序分包显示不出来的原因!—— 竟然如此简单?
长话短说,偶然发现uni-app文档中分包的内容与小程序的内容不一样
具体如下:
该图 为uni-app开发文档中的
![](http://img-cdn-tc.dcloud.net.cn/uploads/article/20230911/34f2a3db6165f5ea96c127a2e265c6bb.png)
注意:"subPackages" 中的P为大写
下面这张图为 微信小程序开发文档中的
注意:"subpackages" 中的p为小写
如果没仔细看文档的话 可能会找半天bug...
因为一个字母大小写的原因导致 分包没有显示出来!!!
长话短说,偶然发现uni-app文档中分包的内容与小程序的内容不一样
具体如下:
该图 为uni-app开发文档中的
注意:"subPackages" 中的P为大写
下面这张图为 微信小程序开发文档中的
注意:"subpackages" 中的p为小写
如果没仔细看文档的话 可能会找半天bug...
因为一个字母大小写的原因导致 分包没有显示出来!!!
收起阅读 »![](http://img-cdn-tc.dcloud.net.cn/uploads/avatar/000/14/07/50_avatar_mid.jpg?v=0)
【经验分享】HX 源代码格式化用法
作为一枚强迫症程序员,如果源代码格式不能精细控制,那是不可接受的。
HBuilderX 是一款功能强大的 IDE 工具,它提供了多种途径用于对源代码格式进行控制,但要完全驾驭它还需要一些经验。
我这里把个人摸索的结果做个小结,希望有人能觉得有用。
主要考虑的文件类型:
.js
.css
.vue
主要考虑的格式:
- 缩进用空格而不是
tab
- 缩进 2 个空格
HX 中编辑代码时,有几处设置可以控制格式风格,优先级从低到高:
- 主菜单【重排代码格式】,实际采用的是
%AppData%\Roaming\HBuilder X\extensions\format\jsbeautifyrc.js
- 主菜单【编辑-缩进】里面设置
- 项目中的
.jsbeautifyrc
配置文件 - 项目中的
.eslintrc.js
配置文件(需安装 eslint-js 和 eslint-plugin-vue 插件)
其中 1/2/3 是在 HX 里【重排代码格式】时起作用,4 是在保存文件时自动触发(如果开启了的话)。
考虑到格式风格的选择与项目相关,所以最好是在项目的根目录下放置 .jsbeautifyrc
和 .eslintrc.js
配置文件。
下面的配置文件可以解决大部分问题:
// .jsbeautifyrc
{
"js": {
"indent_size": 2,
"indent_char": " ",
"indent_with_tabs": false,
"jslint_happy": true
},
"css": {
"indent_size": 2,
"indent_char": " ",
"indent_with_tabs": false
}
}
// .eslintrc.js
module.exports = {
"extends": "plugin:vue/vue3-recommended",
"rules":{
'vue/html-indent': ['error', 2, {
baseIndent: 0
}],
'vue/first-attribute-linebreak': ['error', {
singleline: 'ignore',
multiline: 'below'
}],
'vue/max-attributes-per-line': ['error', {
singleline: 3,
multiline: 1
}],
'vue/script-indent': ['error', 2, {
baseIndent: 0
}],
'no-trailing-spaces': 'error',
'no-multi-spaces': 'error',
'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'],
'no-tabs': 'error',
'indent': ['error', 2],
}
}
注意事项
在 HX 的编辑器中打开 .js
文件时,如果进行【重排代码格式】操作,是 jsbeautify
在起作用,而在保存时的自动重排,是 eslint-js
插件在起作用。
如果两者的格式设置冲突的话,后者会最终胜出,但操作过程会比较困惑。
所以应尽量设置成保持一致,且一般不用【重排代码格式】,不过有些混乱的代码可能需要先用【重排代码格式】来整理一下效果会更好。
作为一枚强迫症程序员,如果源代码格式不能精细控制,那是不可接受的。
HBuilderX 是一款功能强大的 IDE 工具,它提供了多种途径用于对源代码格式进行控制,但要完全驾驭它还需要一些经验。
我这里把个人摸索的结果做个小结,希望有人能觉得有用。
主要考虑的文件类型:
.js
.css
.vue
主要考虑的格式:
- 缩进用空格而不是
tab
- 缩进 2 个空格
HX 中编辑代码时,有几处设置可以控制格式风格,优先级从低到高:
- 主菜单【重排代码格式】,实际采用的是
%AppData%\Roaming\HBuilder X\extensions\format\jsbeautifyrc.js
- 主菜单【编辑-缩进】里面设置
- 项目中的
.jsbeautifyrc
配置文件 - 项目中的
.eslintrc.js
配置文件(需安装 eslint-js 和 eslint-plugin-vue 插件)
其中 1/2/3 是在 HX 里【重排代码格式】时起作用,4 是在保存文件时自动触发(如果开启了的话)。
考虑到格式风格的选择与项目相关,所以最好是在项目的根目录下放置 .jsbeautifyrc
和 .eslintrc.js
配置文件。
下面的配置文件可以解决大部分问题:
// .jsbeautifyrc
{
"js": {
"indent_size": 2,
"indent_char": " ",
"indent_with_tabs": false,
"jslint_happy": true
},
"css": {
"indent_size": 2,
"indent_char": " ",
"indent_with_tabs": false
}
}
// .eslintrc.js
module.exports = {
"extends": "plugin:vue/vue3-recommended",
"rules":{
'vue/html-indent': ['error', 2, {
baseIndent: 0
}],
'vue/first-attribute-linebreak': ['error', {
singleline: 'ignore',
multiline: 'below'
}],
'vue/max-attributes-per-line': ['error', {
singleline: 3,
multiline: 1
}],
'vue/script-indent': ['error', 2, {
baseIndent: 0
}],
'no-trailing-spaces': 'error',
'no-multi-spaces': 'error',
'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'],
'no-tabs': 'error',
'indent': ['error', 2],
}
}
注意事项
在 HX 的编辑器中打开 .js
文件时,如果进行【重排代码格式】操作,是 jsbeautify
在起作用,而在保存时的自动重排,是 eslint-js
插件在起作用。
如果两者的格式设置冲突的话,后者会最终胜出,但操作过程会比较困惑。
所以应尽量设置成保持一致,且一般不用【重排代码格式】,不过有些混乱的代码可能需要先用【重排代码格式】来整理一下效果会更好。
收起阅读 »![](http://img-cdn-tc.dcloud.net.cn/uploads/avatar/001/30/24/94_avatar_mid.jpg?v=1626164163)
h5腾讯地图 选点下方加载不出来 可能的原因
如果使用的key是你的第二个项目,需要手动分配额度,否则就会超额,因为额度默认都在第一个key上,出现地图选点下方内容空白的原因!
如果使用的key是你的第二个项目,需要手动分配额度,否则就会超额,因为额度默认都在第一个key上,出现地图选点下方内容空白的原因!
![](http://img-cdn-tc.dcloud.net.cn/uploads/avatar/000/19/15/29_avatar_mid.jpg?v=1618286499)
APP 备案公钥、签名 MD5获取方法。
一、IOS 系统获取 Bundle ID、平台公钥、签名 MD5 值的指引
- 获取 Bundle ID:使用 APP 对应的 IOS 开发者账号登录 Developer 控制台,找到下图标识符(英文),单击进入 Certificates,Identifiers&Profiles 页面。
- 在 Certificates,Identifiers&Profiles 页面,单击 Identifiers,其中 IDENTIFIER 列对应的就是 Bundle ID。如下图所示:
- 获取公钥与签名 SHA1 值:在计划资源中,单击证书(英文),进入 Certificates 页面。
- 在 Certificates 页面,可查看证书详情,并下载 APP 对应的证书。
- 通过查看证书详细信息,可获取公钥和签名 SHA1 值。IOS 的 APP 公钥,如下图所示:
若公共密钥未完整显示,可以先单击省略号,如果仍然未能完整显示出来,请复制省略号前面显示出的数据进行填写。
- IOS 的 APP签名 MD5 值(SHA-1),如下图所示:
二、安卓系统获取包名、平台公钥、签名 MD5 值的指引
Windows 平台
公钥和 MD5 值可以通过安卓开发工具、Keytool、Jadx-GUI 等多种工具获取,本文以 jadx-gui 为例。
- 下载 jadx-gui 工具 ,点击此处 下载 jadx-gui 工具。
- 下载完成后,解压压缩包,双击 jadx-gui-1.4.7.exe 运行。
- 运行后,在页面左上方单击文件 > 打开文件,打开 APK 包。
- 打开 APK 包后,找到并单击 AndroidManifest.xml,查看 APP 包名。
- 打开 APK 包后,找到并单击 APK signature,查看平台公钥和签名 MD5 值。
macOS 平台
- 打开终端,运行如下命令安装 jadx。
brew install jadx - 安装完成后,在终端运行如下命令打开 jadx。
jadx-gui - 运行后,单击Open file,打开 APK 包。
- 打开 APK 包后,找到并单击 Resources,找到并单击 AndroidManifest.xml,查看 APP 包名。
- 打开 APK 包后,找到并单击 APK signature,查看平台公钥和签名 MD5 值。
来自腾讯云备案《APP 特征信息填写参考规范》
一、IOS 系统获取 Bundle ID、平台公钥、签名 MD5 值的指引
- 获取 Bundle ID:使用 APP 对应的 IOS 开发者账号登录 Developer 控制台,找到下图标识符(英文),单击进入 Certificates,Identifiers&Profiles 页面。
- 在 Certificates,Identifiers&Profiles 页面,单击 Identifiers,其中 IDENTIFIER 列对应的就是 Bundle ID。如下图所示:
- 获取公钥与签名 SHA1 值:在计划资源中,单击证书(英文),进入 Certificates 页面。
- 在 Certificates 页面,可查看证书详情,并下载 APP 对应的证书。
- 通过查看证书详细信息,可获取公钥和签名 SHA1 值。IOS 的 APP 公钥,如下图所示:
若公共密钥未完整显示,可以先单击省略号,如果仍然未能完整显示出来,请复制省略号前面显示出的数据进行填写。
- IOS 的 APP签名 MD5 值(SHA-1),如下图所示:
二、安卓系统获取包名、平台公钥、签名 MD5 值的指引
Windows 平台
公钥和 MD5 值可以通过安卓开发工具、Keytool、Jadx-GUI 等多种工具获取,本文以 jadx-gui 为例。
- 下载 jadx-gui 工具 ,点击此处 下载 jadx-gui 工具。
- 下载完成后,解压压缩包,双击 jadx-gui-1.4.7.exe 运行。
- 运行后,在页面左上方单击文件 > 打开文件,打开 APK 包。
- 打开 APK 包后,找到并单击 AndroidManifest.xml,查看 APP 包名。
- 打开 APK 包后,找到并单击 APK signature,查看平台公钥和签名 MD5 值。
macOS 平台
- 打开终端,运行如下命令安装 jadx。
brew install jadx - 安装完成后,在终端运行如下命令打开 jadx。
jadx-gui - 运行后,单击Open file,打开 APK 包。
- 打开 APK 包后,找到并单击 Resources,找到并单击 AndroidManifest.xml,查看 APP 包名。
- 打开 APK 包后,找到并单击 APK signature,查看平台公钥和签名 MD5 值。
来自腾讯云备案《APP 特征信息填写参考规范》
收起阅读 »![](https://img-cdn-tc.dcloud.net.cn/account/identicon/8bd595bc108068d96d84d36a6ac636f3.png)
Vue3 项目设置微信H5、微信小程序全局分享
Vue3 项目设置微信H5、微信小程序全局分享。
该方法为使用 mixins 解决全局分享。
虽然在Vue3中新增了组合式API,理应使用组合式API解决问题,但是的确没有想到更好的解决方法。
第一步:新建设置全局分享的 mixin 文件;share/mixin.ts
import { last, map, join } from 'lodash';
export default {
// #ifdef MP
// 设置该页面的分享信息 share
onShareAppMessage() {
let view = last(getCurrentPages());
let mp = view?.$vm.shareData.mp;
return {
title: mp.title,
path: mp.path,
imageUrl: mp.imgUrl,
};
},
// 监听用户点击右上角转发到朋友圈
onShareTimeline() {
let view = last(getCurrentPages());
let mp = view?.$vm.shareData.mp;
return {
title: mp.title,
query: join(map(mp.query, (value, key) => {
return `${key}=${value}`;
}), '&'),
imageUrl: mp.imgUrl,
};
},
// #endif
onLoad() {
this.shareData = {
h5: {
// 分享标题
title: '',
// 分享描述
des: '',
// 分享图标
imgUrl: '',
// 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
link: '',
},
mp: {
// 转发标题 默认值(当前小程序名称)
title: '',
// 转发路径 必须是以 / 开头的完整路径
path: '',
// 自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。支持PNG及JPG。显示图片长宽比是 5:4。
imgUrl: '',
// 自定义页面路径中携带的参数
query: {},
},
};
},
onShow() {
// #ifdef H5
let view = last(getCurrentPages());
let shareData = view?.$vm.shareData;
if (shareData) {
wx.onMenuShareTimeline(shareData.h5)
wx.onMenuShareAppMessage(shareData.h5);
wx.updateAppMessageShareData(shareData.h5);
wx.updateTimelineShareData(shareData.h5);
}
// #endif
},
};
第二步,在 main.ts 文件中使用分享mixin.ts
// 项目文件路径
import shareMixin from '@/common/mixin/share/mixin';
export function createApp() {
const app = createSSRApp(App);
app.mixin(shareMixin);
return {
app,
};
}
第三步,新建用于更新页面分享的函数。/share/index.ts
import { each, assign, last, } from 'lodash';
import { nextTick } from 'vue';
interface shareDataType {
h5?: {
// 分享标题
title?: string,
// 分享描述
des?: string,
// 分享图标
imgUrl?: string,
// 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
link?: string,
},
mp?: {
// 转发标题 默认值(当前小程序名称)
title?: string,
// 转发路径 必须是以 / 开头的完整路径
path?: string,
// 自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。支持PNG及JPG。显示图片长宽比是 5:4。
imgUrl?: string,
// 自定义页面路径中携带的参数
query?: object,
},
}
export const defineShare = async function (options: shareDataType) {
// 用于规避 setup 直接调用的情况
await nextTick();
let view = last(getCurrentPages());
let shareData = view?.$vm.shareData;
each(options, (value, key) => {
assign(shareData[key], value);
})
// #ifdef H5
wx.onMenuShareTimeline(shareData.h5)
wx.onMenuShareAppMessage(shareData.h5);
wx.updateAppMessageShareData(shareData.h5);
wx.updateTimelineShareData(shareData.h5);
// #endif
}
第四步,使用更新分享的函数
import { defineShare } from '@/common/mixin/share/index';
defineShare({
mp: {
title: 'title'
}
});
Vue3 项目设置微信H5、微信小程序全局分享。
该方法为使用 mixins 解决全局分享。
虽然在Vue3中新增了组合式API,理应使用组合式API解决问题,但是的确没有想到更好的解决方法。
第一步:新建设置全局分享的 mixin 文件;share/mixin.ts
import { last, map, join } from 'lodash';
export default {
// #ifdef MP
// 设置该页面的分享信息 share
onShareAppMessage() {
let view = last(getCurrentPages());
let mp = view?.$vm.shareData.mp;
return {
title: mp.title,
path: mp.path,
imageUrl: mp.imgUrl,
};
},
// 监听用户点击右上角转发到朋友圈
onShareTimeline() {
let view = last(getCurrentPages());
let mp = view?.$vm.shareData.mp;
return {
title: mp.title,
query: join(map(mp.query, (value, key) => {
return `${key}=${value}`;
}), '&'),
imageUrl: mp.imgUrl,
};
},
// #endif
onLoad() {
this.shareData = {
h5: {
// 分享标题
title: '',
// 分享描述
des: '',
// 分享图标
imgUrl: '',
// 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
link: '',
},
mp: {
// 转发标题 默认值(当前小程序名称)
title: '',
// 转发路径 必须是以 / 开头的完整路径
path: '',
// 自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。支持PNG及JPG。显示图片长宽比是 5:4。
imgUrl: '',
// 自定义页面路径中携带的参数
query: {},
},
};
},
onShow() {
// #ifdef H5
let view = last(getCurrentPages());
let shareData = view?.$vm.shareData;
if (shareData) {
wx.onMenuShareTimeline(shareData.h5)
wx.onMenuShareAppMessage(shareData.h5);
wx.updateAppMessageShareData(shareData.h5);
wx.updateTimelineShareData(shareData.h5);
}
// #endif
},
};
第二步,在 main.ts 文件中使用分享mixin.ts
// 项目文件路径
import shareMixin from '@/common/mixin/share/mixin';
export function createApp() {
const app = createSSRApp(App);
app.mixin(shareMixin);
return {
app,
};
}
第三步,新建用于更新页面分享的函数。/share/index.ts
import { each, assign, last, } from 'lodash';
import { nextTick } from 'vue';
interface shareDataType {
h5?: {
// 分享标题
title?: string,
// 分享描述
des?: string,
// 分享图标
imgUrl?: string,
// 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
link?: string,
},
mp?: {
// 转发标题 默认值(当前小程序名称)
title?: string,
// 转发路径 必须是以 / 开头的完整路径
path?: string,
// 自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。支持PNG及JPG。显示图片长宽比是 5:4。
imgUrl?: string,
// 自定义页面路径中携带的参数
query?: object,
},
}
export const defineShare = async function (options: shareDataType) {
// 用于规避 setup 直接调用的情况
await nextTick();
let view = last(getCurrentPages());
let shareData = view?.$vm.shareData;
each(options, (value, key) => {
assign(shareData[key], value);
})
// #ifdef H5
wx.onMenuShareTimeline(shareData.h5)
wx.onMenuShareAppMessage(shareData.h5);
wx.updateAppMessageShareData(shareData.h5);
wx.updateTimelineShareData(shareData.h5);
// #endif
}
第四步,使用更新分享的函数
import { defineShare } from '@/common/mixin/share/index';
defineShare({
mp: {
title: 'title'
}
});
收起阅读 »
![](https://img-cdn-tc.dcloud.net.cn/account/identicon/c805ae7ee3854b26de6f84382a434a0e.png)
寻找 黑帽 seo 渗透 相关人才
Position : 渗透测试工程师 Location : #remote
职位描述: 负责公司承接的信息安全项目实施,实施经过合法授权的主机、网络和 Web 安全渗透测试。 编写渗透测试报告及提供信息安全。 具备网络安全攻防技术及紧急应变能力。 对互联网领域的重大安全事件进行跟踪、分析。 对安全领域的新技术、新方法进行研究。 跟踪国内外安全动态,进行安全漏洞分析、预警,进行漏洞整改。
要求: 熟练使用 kali linux 、awvs 、nessus 、metasploit 、burpsuite 等安全测试工具。 熟悉 OWASP 中常见的 web 安全漏洞、业务逻辑漏洞及其原理。 熟悉渗透测试技术的整体流程。 熟悉 linux 系统操作,了解常见 web 中间件、数据库相关漏洞。 至少掌握一种编程语言。 具备一定的 php 或 java 代码审核能力,能够对公开漏洞进行分析 。 具备良好的逻辑思维、沟通技巧及团队协作能力。 具备很好的理解分析能力,善于与他人沟通合作,具有团队精神。 具备大型渗透项目能力者优先。 3~5 年以上相关工作经验
寻找 黑帽 seo 渗透 相关人才 wx:lyh75889 tg @wstg98564
Position : 渗透测试工程师 Location : #remote
职位描述: 负责公司承接的信息安全项目实施,实施经过合法授权的主机、网络和 Web 安全渗透测试。 编写渗透测试报告及提供信息安全。 具备网络安全攻防技术及紧急应变能力。 对互联网领域的重大安全事件进行跟踪、分析。 对安全领域的新技术、新方法进行研究。 跟踪国内外安全动态,进行安全漏洞分析、预警,进行漏洞整改。
要求: 熟练使用 kali linux 、awvs 、nessus 、metasploit 、burpsuite 等安全测试工具。 熟悉 OWASP 中常见的 web 安全漏洞、业务逻辑漏洞及其原理。 熟悉渗透测试技术的整体流程。 熟悉 linux 系统操作,了解常见 web 中间件、数据库相关漏洞。 至少掌握一种编程语言。 具备一定的 php 或 java 代码审核能力,能够对公开漏洞进行分析 。 具备良好的逻辑思维、沟通技巧及团队协作能力。 具备很好的理解分析能力,善于与他人沟通合作,具有团队精神。 具备大型渗透项目能力者优先。 3~5 年以上相关工作经验
寻找 黑帽 seo 渗透 相关人才 wx:lyh75889 tg @wstg98564
![](https://img-cdn-tc.dcloud.net.cn/account/identicon/a7e756783832806bec411f3ad425a84b.png)
app备案app公钥和MD5值的获取方法
9月后,现在上架的app都需要备案了,网上的教程不是要用命令行就是要用程序去获取,都太麻烦了。
分享一个视化工具,上传证书就可以获取app的公钥和MD5值,省去了很多时间:
https://www.yunedit.com/androidmd5
https://www.yunedit.com/iosmd5
9月后,现在上架的app都需要备案了,网上的教程不是要用命令行就是要用程序去获取,都太麻烦了。
分享一个视化工具,上传证书就可以获取app的公钥和MD5值,省去了很多时间:
https://www.yunedit.com/androidmd5
https://www.yunedit.com/iosmd5
收起阅读 »![](https://img-cdn-tc.dcloud.net.cn/account/identicon/bd6e2a84453156185a014cf81b9f4374.png)
CLI模式下,HB真机调试 easycom 失效问题解决
背景:
- 项目基于Cli模式的 vite + vue3 + ts + jsx 架构, 使用了 uni-simple-router 和 tsx 插件
- 真机运行时,发现所有通过easycom导入的组件无一例外,全部失效,无法渲染(在失效的页面文件中,随意修改任何东西,HB差异化编译后当前页面恢复正常)
- 折腾研究了很久,本来就不富裕的头发,又掉了一撮。。。。
步骤:
- npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project
- npm install
- HB 导入 src
- **新建文件 src/vite.config.ts
- 安装 @vitejs/plugin-vue-jsx
- vite.config.ts 配置 jsx 插件**
- 安装UI组件库
- 配置 easycom
- 运行到手机 - 标准基座 或者 自定义基座
结果:
所有通过 easycom 导入的组件,都无法渲染
Failed to resolve component: tui-icon If this is a native custom element, make sure to exclude it fr..........
解决:
删除 vite.config.ts,恢复正常
不指望官方能修复,失望至极, 希望能帮到一些朋友
背景:
- 项目基于Cli模式的 vite + vue3 + ts + jsx 架构, 使用了 uni-simple-router 和 tsx 插件
- 真机运行时,发现所有通过easycom导入的组件无一例外,全部失效,无法渲染(在失效的页面文件中,随意修改任何东西,HB差异化编译后当前页面恢复正常)
- 折腾研究了很久,本来就不富裕的头发,又掉了一撮。。。。
步骤:
- npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project
- npm install
- HB 导入 src
- **新建文件 src/vite.config.ts
- 安装 @vitejs/plugin-vue-jsx
- vite.config.ts 配置 jsx 插件**
- 安装UI组件库
- 配置 easycom
- 运行到手机 - 标准基座 或者 自定义基座
结果:
所有通过 easycom 导入的组件,都无法渲染
Failed to resolve component: tui-icon If this is a native custom element, make sure to exclude it fr..........
解决:
删除 vite.config.ts,恢复正常
不指望官方能修复,失望至极, 希望能帮到一些朋友
收起阅读 »![](https://img-cdn-tc.dcloud.net.cn/account/identicon/ec9ad38e878fc9b6f49b88ebd96f5adb.png)
原生Component插件开发笔记
目前只做了Android,两天时间,坑很多,后面还要踩ios的坑。
说实话,这个社区已经无力吐槽了。
安卓部分
-
下载离线SDK,使用其中的UNIPLUGIN-HELLO-AS(文中使用HA代替)项目进行扩展
-
开发者中心创建了新的项目,配置证书相关内容
-
更新了整个HA项目中的
appid
、keystore
等配置 -
离线打包成功运行
-
使用AndroidStudio,在HA项目中新建了一个gesture library,包名为
com.morphling.gesture
, 内部只有一个GestureComponent.java
文件。因为没有第三方依赖,所以配置很简单。
build.gradle
配置如下:apply plugin: 'com.android.library' android { compileSdkVersion 29 defaultConfig { minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } repositories { flatDir { dirs 'libs' } } dependencies { compileOnly fileTree(dir: 'libs', include: ['*.jar']) compileOnly fileTree(dir: '../app/libs', include: ['uniapp-v8-release.aar']) compileOnly 'androidx.recyclerview:recyclerview:1.0.0' compileOnly 'androidx.legacy:legacy-support-v4:1.0.0' compileOnly 'androidx.appcompat:appcompat:1.0.0' compileOnly 'com.alibaba:fastjson:1.2.83' }
-
更新了
dcloud_uniplugins.json
,添加如下配置:{ "plugins": [ { "type": "component", "name": "MGesture", "class": "com.morphling.gesture.GestureComponent" } ] }
-
新增测试
ext-gesture.nvue
文件,并配置好pages.json,并生成本地打包APP资源
,然后替换HA项目对应的www文件目录 -
在
AndroidStudio
中run
真机调试,新增的插件可以正常运行 -
按照官网说明,使用gradle编译插件的
.aar
文件,并在已有项目中添加nativeplugins
文件夹,以及相关内容其结构为:nativeplugins └── MGesture ├── android │ ├── gesture-release.aar │ └── libs └── package.json
其中的
package.json
文件内容如下{ "name": "MGesture", "id": "MGesture", "version": "1.0.0", "description": "Gesture Detector Component", "_dp_type":"nativeplugin", "_dp_nativeplugin":{ "android": { "plugins": [ { "type": "component", "name": "MGesture", "class": "com.morphling.gesture.GestureComponent" } ], "integrateType": "aar" } } }
-
提交云打包调试基座,中途没有遇到异常,顺利生成
android_debug.apk
-
使用自定义基座运行模式生成的apk文件,我自己新建的插件不起作用,通过weex查看渲染结果,自定义组件只有一个
div
,没有生成对应的GestureComponent
。 -
请在真机卸载app后重新生成,具体原因我没有分析,但是我终于搞定了。o(╯□╰)o
目前只做了Android,两天时间,坑很多,后面还要踩ios的坑。
说实话,这个社区已经无力吐槽了。
安卓部分
-
下载离线SDK,使用其中的UNIPLUGIN-HELLO-AS(文中使用HA代替)项目进行扩展
-
开发者中心创建了新的项目,配置证书相关内容
-
更新了整个HA项目中的
appid
、keystore
等配置 -
离线打包成功运行
-
使用AndroidStudio,在HA项目中新建了一个gesture library,包名为
com.morphling.gesture
, 内部只有一个GestureComponent.java
文件。因为没有第三方依赖,所以配置很简单。
build.gradle
配置如下:apply plugin: 'com.android.library' android { compileSdkVersion 29 defaultConfig { minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } repositories { flatDir { dirs 'libs' } } dependencies { compileOnly fileTree(dir: 'libs', include: ['*.jar']) compileOnly fileTree(dir: '../app/libs', include: ['uniapp-v8-release.aar']) compileOnly 'androidx.recyclerview:recyclerview:1.0.0' compileOnly 'androidx.legacy:legacy-support-v4:1.0.0' compileOnly 'androidx.appcompat:appcompat:1.0.0' compileOnly 'com.alibaba:fastjson:1.2.83' }
-
更新了
dcloud_uniplugins.json
,添加如下配置:{ "plugins": [ { "type": "component", "name": "MGesture", "class": "com.morphling.gesture.GestureComponent" } ] }
-
新增测试
ext-gesture.nvue
文件,并配置好pages.json,并生成本地打包APP资源
,然后替换HA项目对应的www文件目录 -
在
AndroidStudio
中run
真机调试,新增的插件可以正常运行 -
按照官网说明,使用gradle编译插件的
.aar
文件,并在已有项目中添加nativeplugins
文件夹,以及相关内容其结构为:nativeplugins └── MGesture ├── android │ ├── gesture-release.aar │ └── libs └── package.json
其中的
package.json
文件内容如下{ "name": "MGesture", "id": "MGesture", "version": "1.0.0", "description": "Gesture Detector Component", "_dp_type":"nativeplugin", "_dp_nativeplugin":{ "android": { "plugins": [ { "type": "component", "name": "MGesture", "class": "com.morphling.gesture.GestureComponent" } ], "integrateType": "aar" } } }
-
提交云打包调试基座,中途没有遇到异常,顺利生成
android_debug.apk
-
使用自定义基座运行模式生成的apk文件,我自己新建的插件不起作用,通过weex查看渲染结果,自定义组件只有一个
div
,没有生成对应的GestureComponent
。 -
请在真机卸载app后重新生成,具体原因我没有分析,但是我终于搞定了。o(╯□╰)o