HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

关于热更新的实现

在App.vue文件里onLaunch: function () {}方法实现如下:

          //判断客户端,根据业务来判断你是否需要传此参数 ,不要删掉即可  
         var clent=uni.getSystemInfoSync().platform  
         var client_category=2  
          if(clent=='android'){  
             client_category=2  
          }  
          if(clent=='ios'){  
             client_category=1  
          }   

plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {       
        // console.log("widgetInfo.version:"+widgetInfo.version)  
    uni.request({    
        url:'https://url/api/get_versions',  
        data: {    
            "version": widgetInfo.version,    
       "client_category":client_category      
        },    

        success: (result) => {   
            var data = result.data;    
            // is_update 是否热更新  
           //wgt_url  热更新包地址  
            if ((data.is_update==true) &&(data.wgt_url != '' ))) {    
                // uni.showLoading({  
                //  title:'努力加载中...'  
                // })  
                // console.log("data.is_update :"+data.is_update)  
                // console.log("data.wgt_url  :"+data.wgt_url  )  
                uni.downloadFile({    
                    url: data.wgt_url,    
                    success: (downloadResult) => {    
                        if (downloadResult.statusCode === 200) {    
                            plus.runtime.install(downloadResult.tempFilePath, {    
                                force: false    
                            }, function() {    
                                  // uni.hideLoading()  
                                  plus.runtime.restart();    
                            }, function(e) {    
                                // console.log("热更新:"+JSON.stringify(e))  
                            });    
                        }   

                    }    
                });    
            }    
        } ,  
    });    
});  
继续阅读 »

在App.vue文件里onLaunch: function () {}方法实现如下:

          //判断客户端,根据业务来判断你是否需要传此参数 ,不要删掉即可  
         var clent=uni.getSystemInfoSync().platform  
         var client_category=2  
          if(clent=='android'){  
             client_category=2  
          }  
          if(clent=='ios'){  
             client_category=1  
          }   

plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {       
        // console.log("widgetInfo.version:"+widgetInfo.version)  
    uni.request({    
        url:'https://url/api/get_versions',  
        data: {    
            "version": widgetInfo.version,    
       "client_category":client_category      
        },    

        success: (result) => {   
            var data = result.data;    
            // is_update 是否热更新  
           //wgt_url  热更新包地址  
            if ((data.is_update==true) &&(data.wgt_url != '' ))) {    
                // uni.showLoading({  
                //  title:'努力加载中...'  
                // })  
                // console.log("data.is_update :"+data.is_update)  
                // console.log("data.wgt_url  :"+data.wgt_url  )  
                uni.downloadFile({    
                    url: data.wgt_url,    
                    success: (downloadResult) => {    
                        if (downloadResult.statusCode === 200) {    
                            plus.runtime.install(downloadResult.tempFilePath, {    
                                force: false    
                            }, function() {    
                                  // uni.hideLoading()  
                                  plus.runtime.restart();    
                            }, function(e) {    
                                // console.log("热更新:"+JSON.stringify(e))  
                            });    
                        }   

                    }    
                });    
            }    
        } ,  
    });    
});  
收起阅读 »

ios定位--持续定位--看官方和前辈们的文章总结

1.首先要在manifest.js开启ios后台运行能力:location
注意: 需要打自定义基座才能测试息屏操作
(ios的自定义基座安装到手机是个坑,简单的说下经验:ios证书分发布dist和开发证书dev)
自己测试当然要打dev开发证书----并且要在ios开发团队加入你测试机的id,不然你打了ios自定义基座,也装不上;
2.代码:


var watchId ; // 全局定义  

onLoad(){  
            if(that.isPhone==='android'){  
                // android手机--获取gps---这里我android和ios使用的不是一个方法定位  
                this.getLocationPermission();  
            }else{  
// ios定位  
                this.getIosLocation();  
            }  

}  

onUnload(){  
// 页面卸载--停止监听位置变化  
plus.geolocation.clearWatch(watchId);   

}  

methods:{  
            getIosLocation(){  
                console.log('我是ios 定位')  
                /**    
                 * 判断是否开启定位    
                 * @param {Object} isTask    
                 */    
                var result = permision.judgeIosPermission('location')  
                console.log(result);  
                if(result){  
                    // uni.showModal({  
                    //  content:'后台定位已开启',  
                    //  showCancel: false  
                    // });  
                    console.log('后台定位已开启')  
                }else{  
                    console.log("手机系统的定位没有打开");    
                    //  定位没有开启时  提示用户是否开启    
                     plus.nativeUI.confirm("定位权限没有开启,是否去开启?", function(e) {      
                        if (e.index == 1) {      
                            var UIApplication = plus.ios.importClass("UIApplication");      
                            var application2 = UIApplication.sharedApplication();      
                            var NSURL2 = plus.ios.importClass("NSURL");                            
                            var setting2 = NSURL2.URLWithString("app-settings:"); // 打开应用权限    
                            application2.openURL(setting2);      
                            plus.ios.deleteObject(setting2);      
                            plus.ios.deleteObject(NSURL2);      
                            plus.ios.deleteObject(application2);      
                        }      
                    }, {      
                        "buttons": ["不开启", "去设置"],      
                        "verticalAlign": "center"      
                    });      
                }  
                /**  
                 * 开启定位    
                 * @param {Object} options    
                 */    
                               // 这一步可以不要---我想获取一个点,过滤掉第一个点--而然并没有什么用---最后还是要后端纠偏一下  
                uni.getLocation({  
                    type: 'gcj02',  
                    success: function (res) {  
                        console.log('当前位置的经度:' + res.longitude);  
                        console.log('当前位置的纬度:' + res.latitude);  
                        oldLatitude = res.latitude;  
                        oldLongitude = res.longitude;  
                    }  
                });  

                // 开始监听  
                /* geocode: (Boolean 类型 )是否解析地址信息;coordsType: (String 类型 )指定获取的定位数据坐标系类型;maximumAge: (Number 类型 )获取位置信息的间隔时间;是否高精确度获取位置信息  
                高精度获取表示需要使用更多的系统资源,默认值为false。 */  
                watchId = plus.geolocation.watchPosition( function ( res ) {    
                    /* altitudeAccuracy:高度; heading: (Number 类型 )表示设备移动的方向 ;altitudeAccuracy: (Number 类型 )海拔的精确度信息*/  
                    console.log( "监听位置变化信息:" );    
                    console.log( JSON.stringify(res) );  
                    let result = res.coords;  
                    // console.log(gps.length)  

                }, function ( e ) {    
                    console.log( "监听位置变化信息失败:"+e.message );    
                }, {'enableHighAccuracy':true,'geocode': false,'maximumAge':2000, 'provider': 'amap'} );    

            },  

}
继续阅读 »

1.首先要在manifest.js开启ios后台运行能力:location
注意: 需要打自定义基座才能测试息屏操作
(ios的自定义基座安装到手机是个坑,简单的说下经验:ios证书分发布dist和开发证书dev)
自己测试当然要打dev开发证书----并且要在ios开发团队加入你测试机的id,不然你打了ios自定义基座,也装不上;
2.代码:


var watchId ; // 全局定义  

onLoad(){  
            if(that.isPhone==='android'){  
                // android手机--获取gps---这里我android和ios使用的不是一个方法定位  
                this.getLocationPermission();  
            }else{  
// ios定位  
                this.getIosLocation();  
            }  

}  

onUnload(){  
// 页面卸载--停止监听位置变化  
plus.geolocation.clearWatch(watchId);   

}  

methods:{  
            getIosLocation(){  
                console.log('我是ios 定位')  
                /**    
                 * 判断是否开启定位    
                 * @param {Object} isTask    
                 */    
                var result = permision.judgeIosPermission('location')  
                console.log(result);  
                if(result){  
                    // uni.showModal({  
                    //  content:'后台定位已开启',  
                    //  showCancel: false  
                    // });  
                    console.log('后台定位已开启')  
                }else{  
                    console.log("手机系统的定位没有打开");    
                    //  定位没有开启时  提示用户是否开启    
                     plus.nativeUI.confirm("定位权限没有开启,是否去开启?", function(e) {      
                        if (e.index == 1) {      
                            var UIApplication = plus.ios.importClass("UIApplication");      
                            var application2 = UIApplication.sharedApplication();      
                            var NSURL2 = plus.ios.importClass("NSURL");                            
                            var setting2 = NSURL2.URLWithString("app-settings:"); // 打开应用权限    
                            application2.openURL(setting2);      
                            plus.ios.deleteObject(setting2);      
                            plus.ios.deleteObject(NSURL2);      
                            plus.ios.deleteObject(application2);      
                        }      
                    }, {      
                        "buttons": ["不开启", "去设置"],      
                        "verticalAlign": "center"      
                    });      
                }  
                /**  
                 * 开启定位    
                 * @param {Object} options    
                 */    
                               // 这一步可以不要---我想获取一个点,过滤掉第一个点--而然并没有什么用---最后还是要后端纠偏一下  
                uni.getLocation({  
                    type: 'gcj02',  
                    success: function (res) {  
                        console.log('当前位置的经度:' + res.longitude);  
                        console.log('当前位置的纬度:' + res.latitude);  
                        oldLatitude = res.latitude;  
                        oldLongitude = res.longitude;  
                    }  
                });  

                // 开始监听  
                /* geocode: (Boolean 类型 )是否解析地址信息;coordsType: (String 类型 )指定获取的定位数据坐标系类型;maximumAge: (Number 类型 )获取位置信息的间隔时间;是否高精确度获取位置信息  
                高精度获取表示需要使用更多的系统资源,默认值为false。 */  
                watchId = plus.geolocation.watchPosition( function ( res ) {    
                    /* altitudeAccuracy:高度; heading: (Number 类型 )表示设备移动的方向 ;altitudeAccuracy: (Number 类型 )海拔的精确度信息*/  
                    console.log( "监听位置变化信息:" );    
                    console.log( JSON.stringify(res) );  
                    let result = res.coords;  
                    // console.log(gps.length)  

                }, function ( e ) {    
                    console.log( "监听位置变化信息失败:"+e.message );    
                }, {'enableHighAccuracy':true,'geocode': false,'maximumAge':2000, 'provider': 'amap'} );    

            },  

}
收起阅读 »

iOS 提交App Store 审核被拒3.1.1和解决记录

移动APP

被拒原因:
Guideline 3.1.1 - Business - Payments - In-App Purchase

We found that your app allows users to purchase digital content or services to be used outside of your app, which is not appropriate for the App Store.

Next Steps

We encourage you to review your app concept and incorporate different content and features that are in compliance with the App Store Review Guidelines.

Please see attached screenshots for details.

被拒图片链接:https://iosapps-ssl.itunes.apple.com/itunes-assets/Purple114/v4/a1/17/52/a117528e-ca1b-2bbf-8432-c92f0362299f/attachment.Screenshot-0812-151026.png?accessKey=1597635277_8963727770388354402_QLcaesOGIHCrOnw2LLARMmAR%2FXQ3h18pWeRyKAJ%2B8nz6SlRYo9x9wuOt%2FDjnSTjpOpQyqfu%2FDOlb4SwFtK%2FjeUYopCbAes5AX1H9wHkI8A6ryVyQBFfYHDcKSb4o4XyWGcsmsJnfZG6Z2pXtBND7MQXCD%2FIiFAsNNpiXZoeV4%2B0GmVZYf4Qb0%2ByPzWvL%2BCDp

解决:把购买数字内容或服务的数据先屏蔽掉,等审核通过后,再由后台打开之前屏蔽的数据(我的这个被拒原因是因为爱奇艺会员,所以我先把搜索的‘爱奇艺’返回的数据为空,等审核通过后再恢复数据)

继续阅读 »

被拒原因:
Guideline 3.1.1 - Business - Payments - In-App Purchase

We found that your app allows users to purchase digital content or services to be used outside of your app, which is not appropriate for the App Store.

Next Steps

We encourage you to review your app concept and incorporate different content and features that are in compliance with the App Store Review Guidelines.

Please see attached screenshots for details.

被拒图片链接:https://iosapps-ssl.itunes.apple.com/itunes-assets/Purple114/v4/a1/17/52/a117528e-ca1b-2bbf-8432-c92f0362299f/attachment.Screenshot-0812-151026.png?accessKey=1597635277_8963727770388354402_QLcaesOGIHCrOnw2LLARMmAR%2FXQ3h18pWeRyKAJ%2B8nz6SlRYo9x9wuOt%2FDjnSTjpOpQyqfu%2FDOlb4SwFtK%2FjeUYopCbAes5AX1H9wHkI8A6ryVyQBFfYHDcKSb4o4XyWGcsmsJnfZG6Z2pXtBND7MQXCD%2FIiFAsNNpiXZoeV4%2B0GmVZYf4Qb0%2ByPzWvL%2BCDp

解决:把购买数字内容或服务的数据先屏蔽掉,等审核通过后,再由后台打开之前屏蔽的数据(我的这个被拒原因是因为爱奇艺会员,所以我先把搜索的‘爱奇艺’返回的数据为空,等审核通过后再恢复数据)

收起阅读 »

每次重启编辑器。开发html的时候,使用运行到浏览器,都无法打开配置的配置好的ip端口和地址

调试 css js

操作步骤:
1、win10打开电脑wifi 配置上这个地址192.168.137.1:8848
2、重启编辑器
3、打开htm页面,点击运行到chrome,页面404

预期结果:
每次重启编辑器,点击运行html文件到chrome,希望能直接成功

实际结果:
1、运行出来页面404
2、必须重置这个配置项,先运行一次
3、再将配置配回去,才能跑起来

bug描述:
每次重启编辑器。开发html的时候,使用运行到浏览器,都无法打开配置的配置好的ip端口和地址
如:192.168.137.1:8848

必须进入运行配置,将这条配置删除,先用127.0.0.1的先跑一次,在把配置修改成192.168.137.1:8848,才能在浏览器中运行。
每次重启编辑器都要
每次重启编辑器
每次都要。这个bug能修复吗

继续阅读 »

操作步骤:
1、win10打开电脑wifi 配置上这个地址192.168.137.1:8848
2、重启编辑器
3、打开htm页面,点击运行到chrome,页面404

预期结果:
每次重启编辑器,点击运行html文件到chrome,希望能直接成功

实际结果:
1、运行出来页面404
2、必须重置这个配置项,先运行一次
3、再将配置配回去,才能跑起来

bug描述:
每次重启编辑器。开发html的时候,使用运行到浏览器,都无法打开配置的配置好的ip端口和地址
如:192.168.137.1:8848

必须进入运行配置,将这条配置删除,先用127.0.0.1的先跑一次,在把配置修改成192.168.137.1:8848,才能在浏览器中运行。
每次重启编辑器都要
每次重启编辑器
每次都要。这个bug能修复吗

收起阅读 »

uniapp离线打包配置电话权限

拨打电话 Array.prototype.slice called

<uses-permission android:name="android.permission.CALL_PHONE"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

继续阅读 »

<uses-permission android:name="android.permission.CALL_PHONE"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

收起阅读 »

uniapp uni-list-item click传参

目前list item 传入实体参数 存在 undefined 的问题

看了实现原理,通过props 设置属性解决问题

思路:
变量参数的值总是undefined ,始终传不到方法里,所以就想通过 属性传值
但是通过在 list item 中直接设置属性取值没用,因为原事件$event 无法读取出设置的属性值,所以就想了一个办法把值直接放入原事件中

步骤1:
在原组件里 找到props 属性设置,添加自己的参数属性,例如我这边是 orderId ,设置值类型以及默认值

步骤2:
还是在原组件里,找到调用click 事件的地方,修改参数为原事件($event)以及自己所要传的参数

步骤3:重写原组件的 onclick 事件,将自己的参数写入原事件中

步骤4:最后在使用组件是,所调用的方法里面 使用 let _orderId=$event.target.dataset.orderId 将参数取出

继续阅读 »

目前list item 传入实体参数 存在 undefined 的问题

看了实现原理,通过props 设置属性解决问题

思路:
变量参数的值总是undefined ,始终传不到方法里,所以就想通过 属性传值
但是通过在 list item 中直接设置属性取值没用,因为原事件$event 无法读取出设置的属性值,所以就想了一个办法把值直接放入原事件中

步骤1:
在原组件里 找到props 属性设置,添加自己的参数属性,例如我这边是 orderId ,设置值类型以及默认值

步骤2:
还是在原组件里,找到调用click 事件的地方,修改参数为原事件($event)以及自己所要传的参数

步骤3:重写原组件的 onclick 事件,将自己的参数写入原事件中

步骤4:最后在使用组件是,所调用的方法里面 使用 let _orderId=$event.target.dataset.orderId 将参数取出

收起阅读 »

山东大学(章丘)在线教育研究院招聘uniapp开发人员

uniapp 招聘

在线教育,前景广阔,坐标济南,tel18615221325,同wechat

在线教育,前景广阔,坐标济南,tel18615221325,同wechat

跨端总结,感觉webview方案还是被很多应用市场不认可

移动APP uniapp

用uni-app做了一个跨端APP,APP不小,算是中型,但是审核碰到很多问题。

  1. IOS审核,被拒4.2.2,说是类似于web应用,实际有用到消息推送、社交分享、APP跳转等原生APP特性,但是确实是基于APP-VUE(没使用NVUE),改了好几版,一直都是4.2.2,没有截图,每次审核结果都是同样的废话,苹果审核真的坑,5.0,5.1.1 3.2.1 4.2.2. 4.2.3...
  2. 小米审核不过,说是网页打包,最后附上其他4家应用市场的上架截图才给过

另外webview的性能确实堪忧,下拉刷新即使我用上renderjs,还是会有卡顿(即使在我的IPhone11上),另外scroll-view的性能也是惨不忍睹,元素一多,经常会闪烁、卡顿、元素消失。

目前考虑把这个APP改为APP-NVUE了,估计又要踩不少坑了(到时候移植h5和各大小程序平台也是个不小的工作量)

对比目前跨端方案:

  1. uni-app
  2. react native
  3. flutter

uni-app优势主要是开发门槛、跨端、生态(还是有不少插件、另外云打包也能降低门槛),缺点的话APP-VUE性能不佳、市场不认可,APP-NVUE还不成熟,很多不支持。

react native 和 app-nvue类似,之前用RN写过一个APP,说实在不太喜欢这种转原生的方案

flutter是基于Skia自渲染,不依靠原生组件,自定义渲染方案和组件,flutter方案算是未来比较有潜力的方案,不过缺点也比较明显,web开发者的学习成本、生态不成熟,缺少一些常用的组件、库,轮子可以造,但是太耗费时间的,项目不等人。

继续阅读 »

用uni-app做了一个跨端APP,APP不小,算是中型,但是审核碰到很多问题。

  1. IOS审核,被拒4.2.2,说是类似于web应用,实际有用到消息推送、社交分享、APP跳转等原生APP特性,但是确实是基于APP-VUE(没使用NVUE),改了好几版,一直都是4.2.2,没有截图,每次审核结果都是同样的废话,苹果审核真的坑,5.0,5.1.1 3.2.1 4.2.2. 4.2.3...
  2. 小米审核不过,说是网页打包,最后附上其他4家应用市场的上架截图才给过

另外webview的性能确实堪忧,下拉刷新即使我用上renderjs,还是会有卡顿(即使在我的IPhone11上),另外scroll-view的性能也是惨不忍睹,元素一多,经常会闪烁、卡顿、元素消失。

目前考虑把这个APP改为APP-NVUE了,估计又要踩不少坑了(到时候移植h5和各大小程序平台也是个不小的工作量)

对比目前跨端方案:

  1. uni-app
  2. react native
  3. flutter

uni-app优势主要是开发门槛、跨端、生态(还是有不少插件、另外云打包也能降低门槛),缺点的话APP-VUE性能不佳、市场不认可,APP-NVUE还不成熟,很多不支持。

react native 和 app-nvue类似,之前用RN写过一个APP,说实在不太喜欢这种转原生的方案

flutter是基于Skia自渲染,不依靠原生组件,自定义渲染方案和组件,flutter方案算是未来比较有潜力的方案,不过缺点也比较明显,web开发者的学习成本、生态不成熟,缺少一些常用的组件、库,轮子可以造,但是太耗费时间的,项目不等人。

收起阅读 »

自研短视频, 八大主题上线

主题 短视频

插件地址:https://ext.dcloud.net.cn/plugin?id=2165#detail

为满足多种风格的App,添加更改主题功能,提供以下八大主题

  1. deep_blue,深蓝色;
  2. sky_blue天蓝色;
  3. purple,浅紫色;
  4. deep_purple,深紫色;
  5. red,浅红色;
  6. deep_red,深红色;
  7. pink,粉红色;
  8. default,默认黄色;

继续阅读 »

插件地址:https://ext.dcloud.net.cn/plugin?id=2165#detail

为满足多种风格的App,添加更改主题功能,提供以下八大主题

  1. deep_blue,深蓝色;
  2. sky_blue天蓝色;
  3. purple,浅紫色;
  4. deep_purple,深紫色;
  5. red,浅红色;
  6. deep_red,深红色;
  7. pink,粉红色;
  8. default,默认黄色;

收起阅读 »

动态switch状态

switch uniapp

根据后台返回的值设置switch开关状态。
一开始是通过class来改变开关状态的,实际运行发现并不可行。然后改为了':checked',就可以了。
以下为例子

<template>  
    <view>  
        <button @click="changeSwitch()">改变状态</button>  
        <switch :checked="areaPosterSwitch"></switch>  
    </view>  
</template>  
<script>  
    var _this;  
    export default {  
        data() {  
            return {  
                //默认开关状态为“关”  
                areaPosterSwitch: true, // false  
            }  
        },  
        mounted() {  
            _this = this;  
        },  
        methods: {  
            changeSwitch() {  
                _this.areaPosterSwitch = !_this.areaPosterSwitch;  
            },  
        }  

    }  
</script>  

在这里插入图片描述

继续阅读 »

根据后台返回的值设置switch开关状态。
一开始是通过class来改变开关状态的,实际运行发现并不可行。然后改为了':checked',就可以了。
以下为例子

<template>  
    <view>  
        <button @click="changeSwitch()">改变状态</button>  
        <switch :checked="areaPosterSwitch"></switch>  
    </view>  
</template>  
<script>  
    var _this;  
    export default {  
        data() {  
            return {  
                //默认开关状态为“关”  
                areaPosterSwitch: true, // false  
            }  
        },  
        mounted() {  
            _this = this;  
        },  
        methods: {  
            changeSwitch() {  
                _this.areaPosterSwitch = !_this.areaPosterSwitch;  
            },  
        }  

    }  
</script>  

在这里插入图片描述

收起阅读 »

sqlite可否在开发时就可以使用

sqlite只能在app安装后才能使用,我有一些原始数据希望能导入到数据库中,现在不能在开发阶段导入,很不方便,开发调试阶段有无办法导入呢?谢谢!

sqlite只能在app安装后才能使用,我有一些原始数据希望能导入到数据库中,现在不能在开发阶段导入,很不方便,开发调试阶段有无办法导入呢?谢谢!