HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

找靠谱前端和后端开发,兼职,可远程办公

混合开发

有兼职项目,需要扫描二维码可加VX沟通:

有兼职项目,需要扫描二维码可加VX沟通:

UNIAPP background=transparent不生效

uniapp

在pages.json里面,在需要透明背景的界面里面加上下面的语句就行了
"backgroundColorTop": "transparent",
"backgroundColorBottom": "transparent",

继续阅读 »

在pages.json里面,在需要透明背景的界面里面加上下面的语句就行了
"backgroundColorTop": "transparent",
"backgroundColorBottom": "transparent",

收起阅读 »

android遍历短信/读取短信

Native.JS

官方Native.js 示例获取所有短信进行遍历的示例有问题 ,一直报TypeError: Cannot read property 'TYPE' of null,自定义调试基座以及权限是没问题的,查找帖子找到如下代码,分享一下,希望官方能看见修改,下面代码经测试无问题 ,帖子转自https://cnbing.net/Detail/8.html,不能评论,表示感谢

    getMassage() {  
                if(plus.os.name === 'Android'){  
                    //不同机型可能获取不全  
                    //查看权限是否已允许  
                    var Context = plus.android.runtimeMainActivity()  
                    var res = plus.android.invoke('android.support.v4.app.ActivityCompat', 'checkSelfPermission', Context,  'android.permission.READ_SMS')  
                    var PERMISSIONS_STORAGE = new Array()  
                    PERMISSIONS_STORAGE.push('android.permission.READ_SMS')   
                    if (res !== '0')   
                    {     
                         plus.android.invoke('android.support.v4.app.ActivityCompat', 'requestPermissions', Context, PERMISSIONS_STORAGE, 1)  
                    } else {      

                    }  
                    var main = plus.android.runtimeMainActivity()  
                    var Uri = plus.android.importClass('android.net.Uri')  
                    var ContactsContract = plus.android.importClass('android.provider.ContactsContract')  
                    var uri = Uri.parse('content://sms/')  
                    var cr = main.getContentResolver()  
                    plus.android.importClass(cr)  
                    var cur = cr.query(uri, null, null, null, null)  
                    plus.android.importClass(cur)  
                    cur.moveToFirst()  
                    var smslist = []  
                    while (cur.moveToNext())   
                    {  
                        var index_Address = cur.getColumnIndex('address')  
                        var address = cur.getString(index_Address)  
                        //短信内容  
                        var index_Body = cur.getColumnIndex('body')  
                        var body = cur.getString(index_Body)  
                        //类型1接收 2发送  
                        var index_Type = cur.getColumnIndex('type')  
                        var type = cur.getString(index_Type)  
                        smslist.push({  
                            address:address,  
                            body:body,  
                            type:type  
                        })  
                    }  
                    console.log(smslist)  
                }else if(plus.os.name === 'iOS'){  
                    console.log('iOS')  
                }  

            },
继续阅读 »

官方Native.js 示例获取所有短信进行遍历的示例有问题 ,一直报TypeError: Cannot read property 'TYPE' of null,自定义调试基座以及权限是没问题的,查找帖子找到如下代码,分享一下,希望官方能看见修改,下面代码经测试无问题 ,帖子转自https://cnbing.net/Detail/8.html,不能评论,表示感谢

    getMassage() {  
                if(plus.os.name === 'Android'){  
                    //不同机型可能获取不全  
                    //查看权限是否已允许  
                    var Context = plus.android.runtimeMainActivity()  
                    var res = plus.android.invoke('android.support.v4.app.ActivityCompat', 'checkSelfPermission', Context,  'android.permission.READ_SMS')  
                    var PERMISSIONS_STORAGE = new Array()  
                    PERMISSIONS_STORAGE.push('android.permission.READ_SMS')   
                    if (res !== '0')   
                    {     
                         plus.android.invoke('android.support.v4.app.ActivityCompat', 'requestPermissions', Context, PERMISSIONS_STORAGE, 1)  
                    } else {      

                    }  
                    var main = plus.android.runtimeMainActivity()  
                    var Uri = plus.android.importClass('android.net.Uri')  
                    var ContactsContract = plus.android.importClass('android.provider.ContactsContract')  
                    var uri = Uri.parse('content://sms/')  
                    var cr = main.getContentResolver()  
                    plus.android.importClass(cr)  
                    var cur = cr.query(uri, null, null, null, null)  
                    plus.android.importClass(cur)  
                    cur.moveToFirst()  
                    var smslist = []  
                    while (cur.moveToNext())   
                    {  
                        var index_Address = cur.getColumnIndex('address')  
                        var address = cur.getString(index_Address)  
                        //短信内容  
                        var index_Body = cur.getColumnIndex('body')  
                        var body = cur.getString(index_Body)  
                        //类型1接收 2发送  
                        var index_Type = cur.getColumnIndex('type')  
                        var type = cur.getString(index_Type)  
                        smslist.push({  
                            address:address,  
                            body:body,  
                            type:type  
                        })  
                    }  
                    console.log(smslist)  
                }else if(plus.os.name === 'iOS'){  
                    console.log('iOS')  
                }  

            },
收起阅读 »

PDA扫码在uniapp中的使用

该方式仅限广播模式使用,使用前请注意是否设置好;
该方法参考别人,但没使用全局监听方式,而是使用每次进出页面重新加载组件的方式.

参考部分

https://ask.dcloud.net.cn/article/37294;  
http://blog.itpub.net/31486267/viewspace-2739999/  

使用部分

<template>  
    <view>  
        <view class="">  
            扫描结果:{{name}}  
        </view>  
        <monitorScanCode v-if="scanCodeIsShow" @resultCode="resultCode"></monitorScanCode>  
    </view>  
</template>  

<script>  
import monitorScanCode from '@/components/monitorScanCode/monitorScanCode.vue';  
export default {  
    data() {  
        return {  
            name:'请扫描',  
            scanCodeIsShow: false //控制监听扫描头 组件重新加载  
        };  
    },  
    components: {  
        monitorScanCode  
    },  
    onLoad() {},  
    onShow: function() {  
        this.scanCodeIsShow = true;  
    },  
    methods: {  
        resultCode(item) {  
            this.name=item;  
            console.log(item, '结果');  
        }  
    },  
    // 页面隐藏  
    onHide() {  
        this.scanCodeIsShow = false;  
    },  
    // 页面卸载  
    onUnload() {  
        this.scanCodeIsShow = false;  
    }  
};  
</script>  

<style lang="scss"></style>

组件部分

<template>  
    <view class="content"></view>  
</template>  

<script>  
var main, receiver;  
var shakeIsShow = false;  
export default {  
    name:'monitorScanCode',  
    data() {  
        return {  
        };  
    },  
    created(option) {  
        this.monitorScan();  
    },  
    // 组件销毁  
    destroyed(){  
        this.cancelScan();  
    },  
    methods: {  
        // 广播监听绑定  
        monitorScan() {  
            // PDA扫描必须设置广播模式  
            main = plus.android.runtimeMainActivity(); //获取activity  
            let IntentFilter = plus.android.importClass('android.content.IntentFilter');  
            let filter = new IntentFilter();  
            filter.addAction('android.intent.ACTION_DECODE_DATA'); //广播动作  

            let that = this;  
            let context = plus.android.importClass('android.content.Context');  
            let Intent = plus.android.importClass('android.content.Intent');  
            receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  
                onReceive: function(context, intent) {  
                    plus.android.importClass(intent); //引入intent类  
                    let data = intent.getStringExtra('barcode_string'); //广播数据标签  
                    that.antiShake(data);  
                }  
            });  
            main.registerReceiver(receiver, filter); //注册监听  
        },  
        //取消监听扫描头  
        cancelScan() {  
            main.unregisterReceiver(receiver);  
        },  
        //防重复  
        antiShake: function(code) {  
            if (shakeIsShow) return false;  
            shakeIsShow = true;  
            setTimeout(function() {  
                shakeIsShow = false;  
            }, 150);  
            this.$emit("resultCode", code)  
        }  
    }  
};  
</script>  

<style>  
page {  
    background-color: #efeff4;  
}  
.content {  
    text-align: center;  
}  
</style>  
继续阅读 »

该方式仅限广播模式使用,使用前请注意是否设置好;
该方法参考别人,但没使用全局监听方式,而是使用每次进出页面重新加载组件的方式.

参考部分

https://ask.dcloud.net.cn/article/37294;  
http://blog.itpub.net/31486267/viewspace-2739999/  

使用部分

<template>  
    <view>  
        <view class="">  
            扫描结果:{{name}}  
        </view>  
        <monitorScanCode v-if="scanCodeIsShow" @resultCode="resultCode"></monitorScanCode>  
    </view>  
</template>  

<script>  
import monitorScanCode from '@/components/monitorScanCode/monitorScanCode.vue';  
export default {  
    data() {  
        return {  
            name:'请扫描',  
            scanCodeIsShow: false //控制监听扫描头 组件重新加载  
        };  
    },  
    components: {  
        monitorScanCode  
    },  
    onLoad() {},  
    onShow: function() {  
        this.scanCodeIsShow = true;  
    },  
    methods: {  
        resultCode(item) {  
            this.name=item;  
            console.log(item, '结果');  
        }  
    },  
    // 页面隐藏  
    onHide() {  
        this.scanCodeIsShow = false;  
    },  
    // 页面卸载  
    onUnload() {  
        this.scanCodeIsShow = false;  
    }  
};  
</script>  

<style lang="scss"></style>

组件部分

<template>  
    <view class="content"></view>  
</template>  

<script>  
var main, receiver;  
var shakeIsShow = false;  
export default {  
    name:'monitorScanCode',  
    data() {  
        return {  
        };  
    },  
    created(option) {  
        this.monitorScan();  
    },  
    // 组件销毁  
    destroyed(){  
        this.cancelScan();  
    },  
    methods: {  
        // 广播监听绑定  
        monitorScan() {  
            // PDA扫描必须设置广播模式  
            main = plus.android.runtimeMainActivity(); //获取activity  
            let IntentFilter = plus.android.importClass('android.content.IntentFilter');  
            let filter = new IntentFilter();  
            filter.addAction('android.intent.ACTION_DECODE_DATA'); //广播动作  

            let that = this;  
            let context = plus.android.importClass('android.content.Context');  
            let Intent = plus.android.importClass('android.content.Intent');  
            receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  
                onReceive: function(context, intent) {  
                    plus.android.importClass(intent); //引入intent类  
                    let data = intent.getStringExtra('barcode_string'); //广播数据标签  
                    that.antiShake(data);  
                }  
            });  
            main.registerReceiver(receiver, filter); //注册监听  
        },  
        //取消监听扫描头  
        cancelScan() {  
            main.unregisterReceiver(receiver);  
        },  
        //防重复  
        antiShake: function(code) {  
            if (shakeIsShow) return false;  
            shakeIsShow = true;  
            setTimeout(function() {  
                shakeIsShow = false;  
            }, 150);  
            this.$emit("resultCode", code)  
        }  
    }  
};  
</script>  

<style>  
page {  
    background-color: #efeff4;  
}  
.content {  
    text-align: center;  
}  
</style>  
收起阅读 »

有项目资源,找兼职的程序员可联系

如题,可加VX沟通:15992432080

如题,可加VX沟通:15992432080

这是用UNiCloud开发的小程序,大家可以交流交流吗

微信小程序

这是用UNiCloud开发的小程序,大家可以交流交流吗

这是用UNiCloud开发的小程序,大家可以交流交流吗

3.2.9版本的条件编译自定义变量不可用,3.2.11却可以使用

HBuilderX
{  

    "uni-app": {  
        "scripts": {  
            "prod": {  
                "title": "生产环境打包",  
                "BROWSER": "Edge",  
                "env": {  
                    "UNI_PLATFORM": "h5",  
                    "ISDEBUG": true,  
                    "PACKTIME":"202109061623"  
                },  
                "define": {  
                    "PROD": true  
                }  
            }  
        }  
    }  
}

使用package.json进行H5打包,内容如上,在3.2.9版本打包后,调用process.env.PACKTIME,会出现undefined。但是在3.2.11版本是正常的。

继续阅读 »
{  

    "uni-app": {  
        "scripts": {  
            "prod": {  
                "title": "生产环境打包",  
                "BROWSER": "Edge",  
                "env": {  
                    "UNI_PLATFORM": "h5",  
                    "ISDEBUG": true,  
                    "PACKTIME":"202109061623"  
                },  
                "define": {  
                    "PROD": true  
                }  
            }  
        }  
    }  
}

使用package.json进行H5打包,内容如上,在3.2.9版本打包后,调用process.env.PACKTIME,会出现undefined。但是在3.2.11版本是正常的。

收起阅读 »

Android离线打包多出一些权限

权限配置

APP上架时,在提交到华为应用商店之后,华为检测app多出了一些敏感权限,

但是在配置中取消这些权限之后,仍然会检测到。

最后发现是一个第三方库引入的。

至于各位多出来的权限可以通过如下路径查找。

app/build/outputs/logs

点击路径下的txt文件, 然后搜索你要查找的权限, 对应权限的下面就会有引入权限的插件名。

继续阅读 »

APP上架时,在提交到华为应用商店之后,华为检测app多出了一些敏感权限,

但是在配置中取消这些权限之后,仍然会检测到。

最后发现是一个第三方库引入的。

至于各位多出来的权限可以通过如下路径查找。

app/build/outputs/logs

点击路径下的txt文件, 然后搜索你要查找的权限, 对应权限的下面就会有引入权限的插件名。

收起阅读 »

uniapp反向代理解决跨域

跨域 uniapp
  1. 修改http请求的baseUrl为本地请求地址,一般(http://localhost:8080)
  2. 在manifest中的h5节点,添加如下配置
  "h5": {  
    "devServer": {  
      "https": false, // 是否启用 https 协议,默认false  
      "port": 8080, // 本地端口号  
      "disableHostCheck": true, // 禁用 Host 检查,默认false  
      "proxy": { // 代理配置  
        "/prod-api": {  
          "target": "http://target.com:8080/prod-api", // 目标接口域名  
          "changeOrigin": true, // 是否跨域  
          "secure": true, // 是否支持https协议的代理  
          "pathRewrite": {  
            "^/prod-api": "/prod-api"  
          } // 这个一定要加,意思就是把你项目中一dev开头的接口自动替换为 target + pathRewrite第二个参数来进行数据的请求(pathRewrite没有第二个参数的话直接为target)  
        }  
      }  
    }  
  }
继续阅读 »
  1. 修改http请求的baseUrl为本地请求地址,一般(http://localhost:8080)
  2. 在manifest中的h5节点,添加如下配置
  "h5": {  
    "devServer": {  
      "https": false, // 是否启用 https 协议,默认false  
      "port": 8080, // 本地端口号  
      "disableHostCheck": true, // 禁用 Host 检查,默认false  
      "proxy": { // 代理配置  
        "/prod-api": {  
          "target": "http://target.com:8080/prod-api", // 目标接口域名  
          "changeOrigin": true, // 是否跨域  
          "secure": true, // 是否支持https协议的代理  
          "pathRewrite": {  
            "^/prod-api": "/prod-api"  
          } // 这个一定要加,意思就是把你项目中一dev开头的接口自动替换为 target + pathRewrite第二个参数来进行数据的请求(pathRewrite没有第二个参数的话直接为target)  
        }  
      }  
    }  
  }
收起阅读 »

公告:阿里云服务空间云存储容量上限调整周知

uniCloud

一、 背景:
uniCloud阿里云的服务空间是纯免费的,尤其是云存储提供的免费CDN功能很受开发者的青睐,但也不可避免的被用于公共图床等业务。为了避免资源滥用,阿里云云存储将做出一些调整。

二、 调整:
预计自2021年12月6日起,阿里云服务空间云存储容量将设置阈值,届时单个服务空间上限为10GB,超过阈值后将无法上传文件。
如果您的业务需要更多的云存储资源,请将如下信息发送到service@dcloud.io进行申请,我们会根据情况进行报备及审核。

公司信息  
负责人  
联系电话  
公司介绍  
业务场景 // 与申请资源相关的业务场景  
用户规模  
申请spaceId  
申请资源 // 申请云存储容量时务必写明需要申请多大容量  
申请日期

阿里云服务空间具体限制详见: https://uniapp.dcloud.net.cn/uniCloud/price?id=aliyun

注:服务空间云存储文件列表页面可查看云存储当前用量以及容量阈值

继续阅读 »

一、 背景:
uniCloud阿里云的服务空间是纯免费的,尤其是云存储提供的免费CDN功能很受开发者的青睐,但也不可避免的被用于公共图床等业务。为了避免资源滥用,阿里云云存储将做出一些调整。

二、 调整:
预计自2021年12月6日起,阿里云服务空间云存储容量将设置阈值,届时单个服务空间上限为10GB,超过阈值后将无法上传文件。
如果您的业务需要更多的云存储资源,请将如下信息发送到service@dcloud.io进行申请,我们会根据情况进行报备及审核。

公司信息  
负责人  
联系电话  
公司介绍  
业务场景 // 与申请资源相关的业务场景  
用户规模  
申请spaceId  
申请资源 // 申请云存储容量时务必写明需要申请多大容量  
申请日期

阿里云服务空间具体限制详见: https://uniapp.dcloud.net.cn/uniCloud/price?id=aliyun

注:服务空间云存储文件列表页面可查看云存储当前用量以及容量阈值

收起阅读 »

开发一个APP需要多少钱?那些便宜的软件是怎么做出来的?

高效的开发效率

传统的方式开发app:

首先需要1个把app的样子给你画出来的UI设计师。然后,你的app是跑在手机上的,主流的手机平台有安卓和苹果两种。一般这里会安排2个安卓,2个苹果,合计4名移动端软件开发工程师。

整个软件,不光是运行在我们手机上的那部分,他的数据是需要在服务器上存储和运算。这里就又需要1个服务端的软件开发工程师,1个维持服务器能够持续正常地运转的运维工程师。

其他呢,实际上还需要项目经理、产品经理等。这里假设我们用最简的结构,你自己来负责刚刚提到的一群人的协作和需求的传达,也就是自己兼任产品和项目经理。

那这里也需要用到4+2=6个程序员。这类高新技术人才的工资一般在1-3万元左右,我们取中间值也就是按1.5万来算,那么6个人就需要9万元/一个月。一款软件从开发、测试再到验收,怎么也需要2个月以上。那假设你只用了2个月,那这里一共需要程序员工资:18万元左右。
加上前面说的美工,一个公司还要场地租金,职工社保等成本。做这么一个原生app的开发最少得20万起步。
就这还只是比较顺利的理想情况,发布app的第一个版本的费用。后续,还要运维升级等。然后项目按照刚刚这个组织结构坚持个1年,光技术研发团队的成本就已经上百万了。假设此时,如果没有做出点业绩,小公司也就已经倒闭了。

但是,如果使用 uni-app + uniCloud 框架

用js一门语言,开发1套代码,然后通过免费的编译技术,一次性得到:安卓APP、苹果APP,H5手机端网页,各大小程序端,如:微信小程序、抖音小程序、快手小程序、支付宝小程序等。
并且uniCloud的底层是DCloud联合阿里云和腾讯云基于serverless研发的免运维的服务器。
这样原来需要安卓、苹果、服务端开发、服务端运维,4类工程师共同协作才能完成的工作,现在一个前端工程师就能胜任。独立完成,免去多人之间协作的沟通和管理成本。

另外这款框架,拥有强大的插件生态,让你大部分功能都无需自己开发,大到,视频通话、人脸识别,小到登陆注册、发送短信验证码等,直接导入自己的工程组装一下即可。
前面提到的6人3个月才能完成的工作,现在2个js工程师2个月即可完成。从项目的开发,到后期的更新升级一直受益。整体可节约了不止10倍的开发和运维成本。

继续阅读 »

传统的方式开发app:

首先需要1个把app的样子给你画出来的UI设计师。然后,你的app是跑在手机上的,主流的手机平台有安卓和苹果两种。一般这里会安排2个安卓,2个苹果,合计4名移动端软件开发工程师。

整个软件,不光是运行在我们手机上的那部分,他的数据是需要在服务器上存储和运算。这里就又需要1个服务端的软件开发工程师,1个维持服务器能够持续正常地运转的运维工程师。

其他呢,实际上还需要项目经理、产品经理等。这里假设我们用最简的结构,你自己来负责刚刚提到的一群人的协作和需求的传达,也就是自己兼任产品和项目经理。

那这里也需要用到4+2=6个程序员。这类高新技术人才的工资一般在1-3万元左右,我们取中间值也就是按1.5万来算,那么6个人就需要9万元/一个月。一款软件从开发、测试再到验收,怎么也需要2个月以上。那假设你只用了2个月,那这里一共需要程序员工资:18万元左右。
加上前面说的美工,一个公司还要场地租金,职工社保等成本。做这么一个原生app的开发最少得20万起步。
就这还只是比较顺利的理想情况,发布app的第一个版本的费用。后续,还要运维升级等。然后项目按照刚刚这个组织结构坚持个1年,光技术研发团队的成本就已经上百万了。假设此时,如果没有做出点业绩,小公司也就已经倒闭了。

但是,如果使用 uni-app + uniCloud 框架

用js一门语言,开发1套代码,然后通过免费的编译技术,一次性得到:安卓APP、苹果APP,H5手机端网页,各大小程序端,如:微信小程序、抖音小程序、快手小程序、支付宝小程序等。
并且uniCloud的底层是DCloud联合阿里云和腾讯云基于serverless研发的免运维的服务器。
这样原来需要安卓、苹果、服务端开发、服务端运维,4类工程师共同协作才能完成的工作,现在一个前端工程师就能胜任。独立完成,免去多人之间协作的沟通和管理成本。

另外这款框架,拥有强大的插件生态,让你大部分功能都无需自己开发,大到,视频通话、人脸识别,小到登陆注册、发送短信验证码等,直接导入自己的工程组装一下即可。
前面提到的6人3个月才能完成的工作,现在2个js工程师2个月即可完成。从项目的开发,到后期的更新升级一直受益。整体可节约了不止10倍的开发和运维成本。

收起阅读 »