HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

图片添加文字水印-安卓

NJS
export function addWatermark(tempFilePath, gText) {  
        let Resources = plus.android.importClass('android.content.res.Resources')  
    let Bitmap = plus.android.importClass('android.graphics.Bitmap')  
    let BitmapFactory = plus.android.importClass('android.graphics.BitmapFactory')  
    let Canvas = plus.android.importClass('android.graphics.Canvas')  
    let Paint = plus.android.importClass('android.graphics.Paint')  
    let Color = plus.android.importClass('android.graphics.Color')  
    let TextPaint = plus.android.importClass('android.text.TextPaint')  
    let Layout = plus.android.importClass('android.text.Layout')  
    let StaticLayout = plus.android.importClass('android.text.StaticLayout')  
    let BufferedOutputStream = plus.android.importClass('java.io.BufferedOutputStream')  
    let File = plus.android.importClass('java.io.File')  
    let FileOutputStream = plus.android.importClass('java.io.FileOutputStream')  

    let filePath = plus.io.convertLocalFileSystemURL(tempFilePath)  
    let options = new BitmapFactory.Options()  
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;  
    let bitmap = BitmapFactory.decodeFile(filePath, options);  

    // 画图  
    let main =  plus.android.runtimeMainActivity()  
    let application = main.getApplication()  
    let resources =  application.getResources()  
    let displayMetrics = resources.getDisplayMetrics()  
    let scale =  plus.android.getAttribute(displayMetrics, 'density' )   
    let bitmapConfig = bitmap.getConfig();  
    bitmapConfig = Bitmap.Config.ARGB_8888;  
    bitmap = bitmap.copy(bitmapConfig, true);  
    let canvas = new Canvas(bitmap);  
    let paint = new TextPaint(Paint.ANTI_ALIAS_FLAG);  
    // 设置颜色  
    paint.setColor(Color.WHITE);  
    paint.setTextSize((16 * scale));  
    paint.setShadowLayer(1, 0, 1, Color.WHITE);  
    let textWidth = canvas.getWidth() - (16 * scale);  
    // text-align: ALIGN_NORMAL,ALIGN_OPPOSITE,ALIGN_CENTER,ALIGN_LEFT,ALIGN_RIGHT;  
    let textLayout = new StaticLayout(  
        gText, paint, textWidth, Layout.Alignment.ALIGN_CENTER, 1, 0, false);  
    let textHeight = textLayout.getHeight();  
    canvas.save();  
    // 计算画的位置  
    canvas.translate(0, canvas.getHeight() - textHeight);  
    textLayout.draw(canvas);  
    canvas.restore();  
    let file = new File(filePath);  
    let bos = new BufferedOutputStream(new FileOutputStream(file));  
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);  
    bos.flush();  
    bos.close();  
}  

叠加地址和日期 使用\n可以折行,叠加位置可以自己计算

        addWaterMark(tempFilePath) {  
            return new Promise((resolve, reject) => {  
                uni.getLocation({  
                    geocode: true,  
                    success: ({ address: { city, district, street, streetNum, poiName } }) => {  
                        const address = city + district + street + streetNum + poiName  
                        const date = dayjs().format('YYYY-MM-DD HH:mm')  
                        addWatermark(tempFilePath, `${address}\n${date}`)  
                        resolve(tempFilePath)  
                    }  
                })  
            })  
        }

继续阅读 »
export function addWatermark(tempFilePath, gText) {  
        let Resources = plus.android.importClass('android.content.res.Resources')  
    let Bitmap = plus.android.importClass('android.graphics.Bitmap')  
    let BitmapFactory = plus.android.importClass('android.graphics.BitmapFactory')  
    let Canvas = plus.android.importClass('android.graphics.Canvas')  
    let Paint = plus.android.importClass('android.graphics.Paint')  
    let Color = plus.android.importClass('android.graphics.Color')  
    let TextPaint = plus.android.importClass('android.text.TextPaint')  
    let Layout = plus.android.importClass('android.text.Layout')  
    let StaticLayout = plus.android.importClass('android.text.StaticLayout')  
    let BufferedOutputStream = plus.android.importClass('java.io.BufferedOutputStream')  
    let File = plus.android.importClass('java.io.File')  
    let FileOutputStream = plus.android.importClass('java.io.FileOutputStream')  

    let filePath = plus.io.convertLocalFileSystemURL(tempFilePath)  
    let options = new BitmapFactory.Options()  
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;  
    let bitmap = BitmapFactory.decodeFile(filePath, options);  

    // 画图  
    let main =  plus.android.runtimeMainActivity()  
    let application = main.getApplication()  
    let resources =  application.getResources()  
    let displayMetrics = resources.getDisplayMetrics()  
    let scale =  plus.android.getAttribute(displayMetrics, 'density' )   
    let bitmapConfig = bitmap.getConfig();  
    bitmapConfig = Bitmap.Config.ARGB_8888;  
    bitmap = bitmap.copy(bitmapConfig, true);  
    let canvas = new Canvas(bitmap);  
    let paint = new TextPaint(Paint.ANTI_ALIAS_FLAG);  
    // 设置颜色  
    paint.setColor(Color.WHITE);  
    paint.setTextSize((16 * scale));  
    paint.setShadowLayer(1, 0, 1, Color.WHITE);  
    let textWidth = canvas.getWidth() - (16 * scale);  
    // text-align: ALIGN_NORMAL,ALIGN_OPPOSITE,ALIGN_CENTER,ALIGN_LEFT,ALIGN_RIGHT;  
    let textLayout = new StaticLayout(  
        gText, paint, textWidth, Layout.Alignment.ALIGN_CENTER, 1, 0, false);  
    let textHeight = textLayout.getHeight();  
    canvas.save();  
    // 计算画的位置  
    canvas.translate(0, canvas.getHeight() - textHeight);  
    textLayout.draw(canvas);  
    canvas.restore();  
    let file = new File(filePath);  
    let bos = new BufferedOutputStream(new FileOutputStream(file));  
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);  
    bos.flush();  
    bos.close();  
}  

叠加地址和日期 使用\n可以折行,叠加位置可以自己计算

        addWaterMark(tempFilePath) {  
            return new Promise((resolve, reject) => {  
                uni.getLocation({  
                    geocode: true,  
                    success: ({ address: { city, district, street, streetNum, poiName } }) => {  
                        const address = city + district + street + streetNum + poiName  
                        const date = dayjs().format('YYYY-MM-DD HH:mm')  
                        addWatermark(tempFilePath, `${address}\n${date}`)  
                        resolve(tempFilePath)  
                    }  
                })  
            })  
        }

收起阅读 »

iOS开发者账号到期续费流程(2020)

iOS iOS打包

iOS开发者账号在到期的前一个月即可续费,如果到期没有续费APP将会下架,在App Store无法搜索

1、登录苹果开发者中心

有这个红色提示说明该续费了

会要求先到Apple Developer这个应用验证下资料才能进入续费页面。

2、在苹果手机App Store搜索Apple Developer并安装上(需要iOS12.4系统以上,不然搜不到这个app)

3、登录苹果账号填写相资料验证(先到手机设置那边登录开发者账号)

3、输入申请人姓名、身份证号、电话(中文输入)

人脸识别,拍个自拍照

4、验证好了资料返回苹果开发者中心

点击红色处,进入付款页面。

输入visa信用卡信息及地址信息!

确认付款提示下图,即完成了付款!

iOS上架辅助工具分享推荐

Appuploader可以辅助在Windows、linux或mac系统直接申请iOS证书p12,及上传ipa到App Store,最方便在Windows开发上架没有苹果Mac电脑的开发者!

继续阅读 »

iOS开发者账号在到期的前一个月即可续费,如果到期没有续费APP将会下架,在App Store无法搜索

1、登录苹果开发者中心

有这个红色提示说明该续费了

会要求先到Apple Developer这个应用验证下资料才能进入续费页面。

2、在苹果手机App Store搜索Apple Developer并安装上(需要iOS12.4系统以上,不然搜不到这个app)

3、登录苹果账号填写相资料验证(先到手机设置那边登录开发者账号)

3、输入申请人姓名、身份证号、电话(中文输入)

人脸识别,拍个自拍照

4、验证好了资料返回苹果开发者中心

点击红色处,进入付款页面。

输入visa信用卡信息及地址信息!

确认付款提示下图,即完成了付款!

iOS上架辅助工具分享推荐

Appuploader可以辅助在Windows、linux或mac系统直接申请iOS证书p12,及上传ipa到App Store,最方便在Windows开发上架没有苹果Mac电脑的开发者!

收起阅读 »

团队开发uni-app,定制开发APP项目

App uniapp 5+App开发

团队开发uni-app,定制开发APP项目
团队2012年成立,专业开发APP定制开发项目、开发流程和所需内容
1.需求确认;

  1. UI设计图确认
  2. 前端切图代码
  3. 后台搭建
  4. 测试
  5. 上线前测试
  6. 填充内容
  7. 准备上线
    壹伍8③②11五零99
继续阅读 »

团队开发uni-app,定制开发APP项目
团队2012年成立,专业开发APP定制开发项目、开发流程和所需内容
1.需求确认;

  1. UI设计图确认
  2. 前端切图代码
  3. 后台搭建
  4. 测试
  5. 上线前测试
  6. 填充内容
  7. 准备上线
    壹伍8③②11五零99
收起阅读 »

团队开发APP定制开发、蓝牙称对接APP开发、硬件对接

5+App开发 uniapp App 移动APP

app定制开发、对接APP定制开发、团队开发、小团队定制开发
1.域名、服务器购买,域名ICP备案

  1. 需求沟通,确认工期和报价;
  2. UI设计图确认
  3. 前端切图代码编写
  4. 后台搭建
  5. 上线前测试
  6. 填充内容
  7. 完成上线
    壹伍⑧3二①150九玖
继续阅读 »

app定制开发、对接APP定制开发、团队开发、小团队定制开发
1.域名、服务器购买,域名ICP备案

  1. 需求沟通,确认工期和报价;
  2. UI设计图确认
  3. 前端切图代码编写
  4. 后台搭建
  5. 上线前测试
  6. 填充内容
  7. 完成上线
    壹伍⑧3二①150九玖
收起阅读 »

uni-app支持快应用-webview版,欢迎体验

vivo 华为 小程序 快应用

快应用是基于手机硬件平台的新型应用形态,标准由国内主流手机厂商联合制定。

快应用可以认为是手机硬件厂商的小程序,但和微信、支付宝等小程序又有较大不同:

  • 微信、支付宝、百度、字节跳动等各家小程序架构设计接近,开发规范接近,都是基于webview渲染,布局方式一致,开发者开发不同小程序时,学习成本较低,且可借助跨端框架或转换器快速实现多平台发行。
  • 快应用是单独的架构设计,单独的开发规范,基于 Native 原生渲染(相比web,布局上有更多限制),有额外的学习成本,且项目代码不易与 Web、小程序等相互复用

这些差异,严重制约了快应用生态的发展,参与的开发者少,提交的快应用的数量也很少,不过几千款,与微信的百万级应用数差距很大。

为此,vivo、华为等厂积极探索,推出快应用(webview 版)(为叙述方便,下文统称为「快应用」),它同小程序一样,采取 Webview 渲染方式,使得开发者没有额外学习成本(有 Web、小程序开发经验即可),能够使用 Web 上各种能力,同时令用户有良好应用访问体验。

uni-app在第一时间跟进了快应用新引擎适配,目前已在 uni-app 的 vue-cli 版中,和HBuilderX 2.7.12+版本,发布了对快应用-webview版的适配。

创建项目

  1. 在HBuilderX 2.7.12+中新建uni-app项目,可以直接运行到快应用。需先按照快应用的开发工具,分快应用联盟版和快应用华为版,需要分别安装。

  2. cli方式创建项目

# npm script  
# 全局安装vue-cli  
$ npm install -g @vue/cli  
# 创建uni-app项目,会提示选择项目模板,初次接触建议选择 hello uni-app 模板  
$ vue create -p dcloudio/uni-preset-vue#alpha my-project  
# 进入项目目录  
$ cd my-project
# dev 模式,编译预览/联盟(仅vivo oppo支持)  
$ npm run dev:quickapp-webview-union  
# build 模式,发行打包  
$ npm run build:quickapp-webview-union
# dev 模式,编译预览/华为  
$ npm run dev:quickapp-webview-huawei  
# build 模式,发行打包  
$ npm run build:quickapp-webview-huawei

编译目录为: dist\(dev|build)\quickapp-webview-union

预览测试

  1. 下载开发者工具

  2. 启动开发者工具,打开编译后的项目目录:dist\(dev|build)\quickapp-webview

  3. 在pc模拟器上,可直接看到开发效果。

  4. 手机真机预览方式:将手机与电脑成功连接,并打开“开发者调试”模式。点击顶部菜单的运行按钮,开发者工具会通过USB自动安装调试 apk 到手机上,并自动启动基座进行测试

发布

vivo
https://dev.vivo.com.cn/distribute/quickApp

华为
https://developer.huawei.com/consumer/cn/console

manifest.json 配置

// vivo / oppo  
"quickapp-webview-union": {  
    "icon": "/static/logo.png",  
    "package": "com.example.demo",  
    "minPlatformVersion": 1062, //最小平台支持 vivo/oppo >= 1062  
    "versionName": "1.0.0",  
    "versionCode": 1,  
},  
// 华为  
"quickapp-webview-huawei" : {  
    "icon" : "/static/logo.png",  
    "package" : "com.example.demo",  
    "minPlatformVersion" : 1070,//最小平台支持 >= 1070  
    "versionName" : "1.0.0",  
    "versionCode" : 1  
}

sign 证书配置

sign放到项目根目录,编译后自动拷贝到 .quickapp/sign,每次编译完成时会删除.quickapp,避免证书丢失

快应用平台文档(平台独有api使用条件编译调用)

华为:https://developer.huawei.com/consumer/cn/doc/development/quickApp-References/webview-frame-overview
vivo/oppo:https://qapp-chimera.vivo.com.cn/framework/index.html

欢迎共研

所有快应用适配代码,均已开源在github,欢迎star鼓励!也欢迎加入QQ群交流:148203425。

如果你对原生渲染的快应用适配感兴趣,也欢迎参与社区共研,详见 https://ask.dcloud.net.cn/article/37145

继续阅读 »

快应用是基于手机硬件平台的新型应用形态,标准由国内主流手机厂商联合制定。

快应用可以认为是手机硬件厂商的小程序,但和微信、支付宝等小程序又有较大不同:

  • 微信、支付宝、百度、字节跳动等各家小程序架构设计接近,开发规范接近,都是基于webview渲染,布局方式一致,开发者开发不同小程序时,学习成本较低,且可借助跨端框架或转换器快速实现多平台发行。
  • 快应用是单独的架构设计,单独的开发规范,基于 Native 原生渲染(相比web,布局上有更多限制),有额外的学习成本,且项目代码不易与 Web、小程序等相互复用

这些差异,严重制约了快应用生态的发展,参与的开发者少,提交的快应用的数量也很少,不过几千款,与微信的百万级应用数差距很大。

为此,vivo、华为等厂积极探索,推出快应用(webview 版)(为叙述方便,下文统称为「快应用」),它同小程序一样,采取 Webview 渲染方式,使得开发者没有额外学习成本(有 Web、小程序开发经验即可),能够使用 Web 上各种能力,同时令用户有良好应用访问体验。

uni-app在第一时间跟进了快应用新引擎适配,目前已在 uni-app 的 vue-cli 版中,和HBuilderX 2.7.12+版本,发布了对快应用-webview版的适配。

创建项目

  1. 在HBuilderX 2.7.12+中新建uni-app项目,可以直接运行到快应用。需先按照快应用的开发工具,分快应用联盟版和快应用华为版,需要分别安装。

  2. cli方式创建项目

# npm script  
# 全局安装vue-cli  
$ npm install -g @vue/cli  
# 创建uni-app项目,会提示选择项目模板,初次接触建议选择 hello uni-app 模板  
$ vue create -p dcloudio/uni-preset-vue#alpha my-project  
# 进入项目目录  
$ cd my-project
# dev 模式,编译预览/联盟(仅vivo oppo支持)  
$ npm run dev:quickapp-webview-union  
# build 模式,发行打包  
$ npm run build:quickapp-webview-union
# dev 模式,编译预览/华为  
$ npm run dev:quickapp-webview-huawei  
# build 模式,发行打包  
$ npm run build:quickapp-webview-huawei

编译目录为: dist\(dev|build)\quickapp-webview-union

预览测试

  1. 下载开发者工具

  2. 启动开发者工具,打开编译后的项目目录:dist\(dev|build)\quickapp-webview

  3. 在pc模拟器上,可直接看到开发效果。

  4. 手机真机预览方式:将手机与电脑成功连接,并打开“开发者调试”模式。点击顶部菜单的运行按钮,开发者工具会通过USB自动安装调试 apk 到手机上,并自动启动基座进行测试

发布

vivo
https://dev.vivo.com.cn/distribute/quickApp

华为
https://developer.huawei.com/consumer/cn/console

manifest.json 配置

// vivo / oppo  
"quickapp-webview-union": {  
    "icon": "/static/logo.png",  
    "package": "com.example.demo",  
    "minPlatformVersion": 1062, //最小平台支持 vivo/oppo >= 1062  
    "versionName": "1.0.0",  
    "versionCode": 1,  
},  
// 华为  
"quickapp-webview-huawei" : {  
    "icon" : "/static/logo.png",  
    "package" : "com.example.demo",  
    "minPlatformVersion" : 1070,//最小平台支持 >= 1070  
    "versionName" : "1.0.0",  
    "versionCode" : 1  
}

sign 证书配置

sign放到项目根目录,编译后自动拷贝到 .quickapp/sign,每次编译完成时会删除.quickapp,避免证书丢失

快应用平台文档(平台独有api使用条件编译调用)

华为:https://developer.huawei.com/consumer/cn/doc/development/quickApp-References/webview-frame-overview
vivo/oppo:https://qapp-chimera.vivo.com.cn/framework/index.html

欢迎共研

所有快应用适配代码,均已开源在github,欢迎star鼓励!也欢迎加入QQ群交流:148203425。

如果你对原生渲染的快应用适配感兴趣,也欢迎参与社区共研,详见 https://ask.dcloud.net.cn/article/37145

收起阅读 »

解决scroll-view下拉刷新无法正常恢复的问题

下拉刷新 scroll_view
关于scroll-view组件的下拉刷新,无论是uni-app还是微信小程序,官方都说得不是很明白,有一个非常关键的关键规则没说清楚,组件属性例子:

refresher-triggered="triggered" @refresherrefresh="onRefresh" @refresherrestore="onRestore" scrolltolower="loadMore"

1.通过程序将triggered设为true时,将触发onRefresh;
2.不管triggered为何值,在界面中下拉,也会触发onRefresh,但不会自动改变triggered值(不能双向绑定,这是问题的根本原因);
3.onRefresh执行完毕,不会自动触发onRestore(这是问题的表现),使得刷新图标一直显示,必须是triggered由true变为false,才会触发onRestore并隐藏刷新图标;如果triggered一直为false,或一直为true,都不会触发。

解决办法:
1.在进入onRefresh后,如果triggered为false,则将它置为true,当执行完你的刷新操作(通常是获取新的数据)后,将triggered置为false
2.由于上一步中将triggered置为true,会再次触发onRefresh,故需再增加一个_freshing,表示是否正在执行刷新操作,在onRefresh中做判断,如_freshing为true,不执行刷新操作直接返回。

如果scroll-view有多个,要每个用自己的 triggered和refreshing来控制。

代码如下,和官方差不多,注意有关键的几个细节不同。

<script>  
    export default {  
        data() {  
            return {  
                triggered: false,  
                _freshing: false  
            }  
        },  
        onLoad() {  
            this._freshing = false;  
            setTimeout(() => {  
                this.triggered = true;//触发onRefresh来加载自己的数据,如果不用这种方式,不要在此改变triggered的值  
            }, 1000)  
        },  
        methods: {  
            onPulling(e) {  
                console.log("onpulling", e);  
            },  
            onRefresh() {  
                if (this._freshing) return;  
                this._freshing = true;  
                if (!this.triggered)//界面下拉触发,triggered可能不是true,要设为true  
                    this.triggered = true;  
                setTimeout(() => {  
                    this.triggered = false;//触发onRestore,并关闭刷新图标  
                    this._freshing = false;  
                }, 3000)  
            },  
            onRestore() {  
                console.log("onRestore");  
            },  
            onAbort() {  
                console.log("onAbort");  
            }  
        }  
    }  
</script>
继续阅读 »
关于scroll-view组件的下拉刷新,无论是uni-app还是微信小程序,官方都说得不是很明白,有一个非常关键的关键规则没说清楚,组件属性例子:

refresher-triggered="triggered" @refresherrefresh="onRefresh" @refresherrestore="onRestore" scrolltolower="loadMore"

1.通过程序将triggered设为true时,将触发onRefresh;
2.不管triggered为何值,在界面中下拉,也会触发onRefresh,但不会自动改变triggered值(不能双向绑定,这是问题的根本原因);
3.onRefresh执行完毕,不会自动触发onRestore(这是问题的表现),使得刷新图标一直显示,必须是triggered由true变为false,才会触发onRestore并隐藏刷新图标;如果triggered一直为false,或一直为true,都不会触发。

解决办法:
1.在进入onRefresh后,如果triggered为false,则将它置为true,当执行完你的刷新操作(通常是获取新的数据)后,将triggered置为false
2.由于上一步中将triggered置为true,会再次触发onRefresh,故需再增加一个_freshing,表示是否正在执行刷新操作,在onRefresh中做判断,如_freshing为true,不执行刷新操作直接返回。

如果scroll-view有多个,要每个用自己的 triggered和refreshing来控制。

代码如下,和官方差不多,注意有关键的几个细节不同。

<script>  
    export default {  
        data() {  
            return {  
                triggered: false,  
                _freshing: false  
            }  
        },  
        onLoad() {  
            this._freshing = false;  
            setTimeout(() => {  
                this.triggered = true;//触发onRefresh来加载自己的数据,如果不用这种方式,不要在此改变triggered的值  
            }, 1000)  
        },  
        methods: {  
            onPulling(e) {  
                console.log("onpulling", e);  
            },  
            onRefresh() {  
                if (this._freshing) return;  
                this._freshing = true;  
                if (!this.triggered)//界面下拉触发,triggered可能不是true,要设为true  
                    this.triggered = true;  
                setTimeout(() => {  
                    this.triggered = false;//触发onRestore,并关闭刷新图标  
                    this._freshing = false;  
                }, 3000)  
            },  
            onRestore() {  
                console.log("onRestore");  
            },  
            onAbort() {  
                console.log("onAbort");  
            }  
        }  
    }  
</script>
收起阅读 »

uniapp项目在微信和企业微信浏览器获取经纬度

uniapp项目在微信和企业微信浏览器获取经纬度

前段时间开发一个uniapp项目遇到了问题,在微信和企业微信没法调起获取地理位置的方法,uniapp官方方法uni.getLocation,但在pc和普通浏览器可以调起获取地位置的提示,查了很多都不管用,没有考虑用微信的SDK,经过一下午的尝试,找到了一种解决方式。

解决办法

manifest.json文件里配置腾讯地图的key

再把 uni.getLocation 方法的 type 改成 <kbd>gcj02</kbd> 类型,就可以了

                     // 获取位置  
            getLocation() {           
                let that  = this;             
                uni.showLoading({  
                    title: '加载中'  
                });  
                // console.log("获取经纬度")  
                    uni.getLocation({  
                        type:'gcj02',  
                        success: function (res) {  
                            console.log('当前位置的经度:' + res.longitude);  
                            console.log('当前位置的纬度:' + res.latitude);       
                        },  
                        fail:function(res){                   
                            uni.showToast({  
                                title: '获取位置失败',  
                                icon:'none',  
                                duration: 2000  
                            });  

                        }  
                    });  

                setTimeout(function () {  
                    uni.hideLoading();  
                }, 2000);             

            },
继续阅读 »

uniapp项目在微信和企业微信浏览器获取经纬度

前段时间开发一个uniapp项目遇到了问题,在微信和企业微信没法调起获取地理位置的方法,uniapp官方方法uni.getLocation,但在pc和普通浏览器可以调起获取地位置的提示,查了很多都不管用,没有考虑用微信的SDK,经过一下午的尝试,找到了一种解决方式。

解决办法

manifest.json文件里配置腾讯地图的key

再把 uni.getLocation 方法的 type 改成 <kbd>gcj02</kbd> 类型,就可以了

                     // 获取位置  
            getLocation() {           
                let that  = this;             
                uni.showLoading({  
                    title: '加载中'  
                });  
                // console.log("获取经纬度")  
                    uni.getLocation({  
                        type:'gcj02',  
                        success: function (res) {  
                            console.log('当前位置的经度:' + res.longitude);  
                            console.log('当前位置的纬度:' + res.latitude);       
                        },  
                        fail:function(res){                   
                            uni.showToast({  
                                title: '获取位置失败',  
                                icon:'none',  
                                duration: 2000  
                            });  

                        }  
                    });  

                setTimeout(function () {  
                    uni.hideLoading();  
                }, 2000);             

            },
收起阅读 »

uni-app转微信小程序中,.wxs文件中不支持跨端编译~因为微信小程序里不支持new Date

小程序 wxs

uni-app转微信小程序中,.wxs文件中不支持跨端编译~因为微信小程序里不支持new Date,
var lessTime = function(time,num = 0,show_firstDay = true) {
if(num > 0 || !show_firstDay) {
return true;
}
if(!time) {
return false;
}
//#ifdef APP-PLUS
var date = new Date();
//#endif

//#ifdef MP-WEIXIN  
var date = getDate();  
//#endif  

var hour = parseFloat(time.split(':')[0]);  
var minute = parseFloat(time.split(':')[1]);  

if(hour > date.getHours() || (hour == date.getHours() && minute - date.getMinutes() >= 20)) {  
    return true  
}  
return false;  

}

继续阅读 »

uni-app转微信小程序中,.wxs文件中不支持跨端编译~因为微信小程序里不支持new Date,
var lessTime = function(time,num = 0,show_firstDay = true) {
if(num > 0 || !show_firstDay) {
return true;
}
if(!time) {
return false;
}
//#ifdef APP-PLUS
var date = new Date();
//#endif

//#ifdef MP-WEIXIN  
var date = getDate();  
//#endif  

var hour = parseFloat(time.split(':')[0]);  
var minute = parseFloat(time.split(':')[1]);  

if(hour > date.getHours() || (hour == date.getHours() && minute - date.getMinutes() >= 20)) {  
    return true  
}  
return false;  

}

收起阅读 »

uni-app编译为微信小程序时,component组件里的样式带scoped,编译后引入该组件的页面无法点击,仿佛整个页面就是一张图,写法<style scoped>

css

uni-app编译为微信小程序时,component组件里的样式带scoped,编译后引入该组件的页面无法点击,仿佛整个页面就是一张图,写法<style scoped>,因为有几个页面引入了7-8个组件,今天差点怀疑人生,什么错都没报。最后把代码回退了~

继续阅读 »

uni-app编译为微信小程序时,component组件里的样式带scoped,编译后引入该组件的页面无法点击,仿佛整个页面就是一张图,写法<style scoped>,因为有几个页面引入了7-8个组件,今天差点怀疑人生,什么错都没报。最后把代码回退了~

收起阅读 »

HBuilder X 更新后未检测到手机或模拟器的解决方法

安装检测 iOS真机运行失败 HBuilderX HBuilder 真机调试

更新了 HBuilder X 后发现运行手机或模拟器检测不到设备,更新前是可以的。
然后网上搜索各种解决办法,尝试一些教程,先是 Android 设备,这个配置一下 ADB路径设置 后可以识别了。但是对于 iOS 设备而言,却总是无法识别。
而 HBuilder、iTunes、爱思助手、iTools、Windows系统便携设备都能连接识别设备。然后尝试 重新安装 iTunes、重新安装驱动、重启电脑、清除系统垃圾、重启手机、更换数据线、更换USB插口、尝试多台iOS设备......各种折腾都无法识别。最后重新安装 HBuilder X 也不行,但是重新安装 HBuilder X 发现它的配置文件依然存在,然后就想到删除它的配置文件及它的临时缓存文件,终于成功识别出iOS设备了。

分享方法:
删除 HBuilder X 配置文件,进入 C:\Users\ {系统用户名} \AppData\Roaming 这个文件夹,找到 HBuilder X 命名的文件夹删除。
删除 HBuilder X 临时文件,进入 C:\Users\ {系统用户名} \AppData\Local\Temp 这个文件夹,找到 HBuilder X 命名的文件夹删除。
还有个是存放很多图标的,想删除干净点,可以在 AppData 文件夹下的其他各个文件夹内搜索找到 HBuilder X 命名的文件夹删除。
然后重新打开 HBuilder X ,重新设置配置。

如果需要配置 Android 设备的 ADB :
先打开一个编辑页面,然后打开顶部菜单,运行(R) - 运行到手机或模拟器(N) - ADB路径设置(A) - 运行配置 - 手机/模拟器运行配置 下的 adb路径(为空为默认路径) - 浏览 ,选择 HBuilder X 安装目录下的 plugins/launcher/tools/adbs/ ,里面有 1.0.31 和 1.0.36 版本,按需打开选择 adb.exe 按打开,然保存即可。
有时候还不能默认或经常断开或者出现 error:device offline 提示,可以打开 adb.exe 所在目录,按键盘 Shift + 鼠标右键点击空白处选择菜单中的 在此处打开命令窗口(W) ,在 cmd 窗口中按下面命令顺序逐条运行一次,然后拔出设备,再重新连接数据线:

adb resset
adb kill-server
adb start-server
adb devices

以上是本人遇到的问题及解决方法,分享下心得,希望帮助到有需要的朋友。

继续阅读 »

更新了 HBuilder X 后发现运行手机或模拟器检测不到设备,更新前是可以的。
然后网上搜索各种解决办法,尝试一些教程,先是 Android 设备,这个配置一下 ADB路径设置 后可以识别了。但是对于 iOS 设备而言,却总是无法识别。
而 HBuilder、iTunes、爱思助手、iTools、Windows系统便携设备都能连接识别设备。然后尝试 重新安装 iTunes、重新安装驱动、重启电脑、清除系统垃圾、重启手机、更换数据线、更换USB插口、尝试多台iOS设备......各种折腾都无法识别。最后重新安装 HBuilder X 也不行,但是重新安装 HBuilder X 发现它的配置文件依然存在,然后就想到删除它的配置文件及它的临时缓存文件,终于成功识别出iOS设备了。

分享方法:
删除 HBuilder X 配置文件,进入 C:\Users\ {系统用户名} \AppData\Roaming 这个文件夹,找到 HBuilder X 命名的文件夹删除。
删除 HBuilder X 临时文件,进入 C:\Users\ {系统用户名} \AppData\Local\Temp 这个文件夹,找到 HBuilder X 命名的文件夹删除。
还有个是存放很多图标的,想删除干净点,可以在 AppData 文件夹下的其他各个文件夹内搜索找到 HBuilder X 命名的文件夹删除。
然后重新打开 HBuilder X ,重新设置配置。

如果需要配置 Android 设备的 ADB :
先打开一个编辑页面,然后打开顶部菜单,运行(R) - 运行到手机或模拟器(N) - ADB路径设置(A) - 运行配置 - 手机/模拟器运行配置 下的 adb路径(为空为默认路径) - 浏览 ,选择 HBuilder X 安装目录下的 plugins/launcher/tools/adbs/ ,里面有 1.0.31 和 1.0.36 版本,按需打开选择 adb.exe 按打开,然保存即可。
有时候还不能默认或经常断开或者出现 error:device offline 提示,可以打开 adb.exe 所在目录,按键盘 Shift + 鼠标右键点击空白处选择菜单中的 在此处打开命令窗口(W) ,在 cmd 窗口中按下面命令顺序逐条运行一次,然后拔出设备,再重新连接数据线:

adb resset
adb kill-server
adb start-server
adb devices

以上是本人遇到的问题及解决方法,分享下心得,希望帮助到有需要的朋友。

收起阅读 »

终于和UniAPP说再见了

uniapp

本人的APP终于用上AS开发工具开发原生APP,用上AS开发才知道开发出来的APP运行速度比uniapp开发出来的APP运行速度快多了。
说下本人对uniapp的见解:
uniapp完全是前端程序员的选择,本人是一名PHP程序员不擅长前端技术用uniapp开发出一个app升级了几次版本终于转到原生安卓开发,由于本人不擅长前端技术在开发uniapp上到处找前端框架希望能套进去做个比较漂亮像样的APPUI框架经过长时间的寻找终于找到一家像样UI库付了300大洋下载框架套进自己的APP总算发布版本。但是他的框架也不是一应俱全结果等我升级APP加功能的时候发现问题有来了,想要的功能界面人家没有自己也不会做插件市场有是有但不完全符合自己的逻辑又不会改升级想法只能搁下。
如果你是一名后端的程序员不太会html js等uniapp就不太适合你,uniapp界面制作完全是用html css js呈现的而原生app界面制作是靠托拉不需要html css js等知识,换句话说不懂web前端也能做出漂亮的UI界面换在uniapp上制作界面必须精通web前端。
我总结下:uniapp是前端的产品后端程序员不要以为uniapp就能解决你能做app的问题,如果拿uniapp做APP必须要擅长html css js php或者任何一门后端语言才能做出app换做开发原生app制作UI界面是不需要技术基础的当然要完全做出一个app只需要懂JAVA语言就行。
最后要说的:uniapp官方解释很多uniapp知识我简单说一句,uniapp就是用html css做的渲染实际它没有窗口就是一张html页面,uniapp也不是二进制其实就是把htnl打包封装成apk文件,如果uniapp官方能把打包apk技术放出来基本上开发者能在本地打包apk,当然这个是uniapp的盈利点是不可能放出来,像这样的打包平台百度搜索一大把不过都是付费的,哈哈哈。
最后还想说一句:选择uniapp开发app那么你就要放弃安卓本身带的一些高级功能,目前uniapp还无法实现uniapp高级功能。

uniapp再见,前端开发者再见!

继续阅读 »

本人的APP终于用上AS开发工具开发原生APP,用上AS开发才知道开发出来的APP运行速度比uniapp开发出来的APP运行速度快多了。
说下本人对uniapp的见解:
uniapp完全是前端程序员的选择,本人是一名PHP程序员不擅长前端技术用uniapp开发出一个app升级了几次版本终于转到原生安卓开发,由于本人不擅长前端技术在开发uniapp上到处找前端框架希望能套进去做个比较漂亮像样的APPUI框架经过长时间的寻找终于找到一家像样UI库付了300大洋下载框架套进自己的APP总算发布版本。但是他的框架也不是一应俱全结果等我升级APP加功能的时候发现问题有来了,想要的功能界面人家没有自己也不会做插件市场有是有但不完全符合自己的逻辑又不会改升级想法只能搁下。
如果你是一名后端的程序员不太会html js等uniapp就不太适合你,uniapp界面制作完全是用html css js呈现的而原生app界面制作是靠托拉不需要html css js等知识,换句话说不懂web前端也能做出漂亮的UI界面换在uniapp上制作界面必须精通web前端。
我总结下:uniapp是前端的产品后端程序员不要以为uniapp就能解决你能做app的问题,如果拿uniapp做APP必须要擅长html css js php或者任何一门后端语言才能做出app换做开发原生app制作UI界面是不需要技术基础的当然要完全做出一个app只需要懂JAVA语言就行。
最后要说的:uniapp官方解释很多uniapp知识我简单说一句,uniapp就是用html css做的渲染实际它没有窗口就是一张html页面,uniapp也不是二进制其实就是把htnl打包封装成apk文件,如果uniapp官方能把打包apk技术放出来基本上开发者能在本地打包apk,当然这个是uniapp的盈利点是不可能放出来,像这样的打包平台百度搜索一大把不过都是付费的,哈哈哈。
最后还想说一句:选择uniapp开发app那么你就要放弃安卓本身带的一些高级功能,目前uniapp还无法实现uniapp高级功能。

uniapp再见,前端开发者再见!

收起阅读 »

iOS uni微信支付无法唤醒App

需要配置
1:
liblibPayment.a
libwxpay.a
libWeChatSDK_pay.a
liblibPayment.a
libalixpayment.a

2 info.plist
中配置UniversalLinks

3:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<string>mqq</string>
<string>wechat</string>
<string>weixin</string>
<string>hbuilder</string>
<string>streamapp</string>
<string>weixinULAPI</string>
<string>alipay</string>
<string>safepay</string>
<string>cydia</string>
</array>
</plist>

4 url types

5
feature.plist <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>class</key>
<string>PGPlatbyManager</string>
<key>global</key>
<true/>
<key>extend</key>
<dict>
<key>alix</key>
<string>PGAlixPay</string>
<key>weixin</key>
<string>PGWXPay</string>
</dict>
</dict>
</plist>
继续阅读 »

需要配置
1:
liblibPayment.a
libwxpay.a
libWeChatSDK_pay.a
liblibPayment.a
libalixpayment.a

2 info.plist
中配置UniversalLinks

3:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<string>mqq</string>
<string>wechat</string>
<string>weixin</string>
<string>hbuilder</string>
<string>streamapp</string>
<string>weixinULAPI</string>
<string>alipay</string>
<string>safepay</string>
<string>cydia</string>
</array>
</plist>

4 url types

5
feature.plist <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>class</key>
<string>PGPlatbyManager</string>
<key>global</key>
<true/>
<key>extend</key>
<dict>
<key>alix</key>
<string>PGAlixPay</string>
<key>weixin</key>
<string>PGWXPay</string>
</dict>
</dict>
</plist>
收起阅读 »