HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

在uni-app中对优博讯和新大陆安卓(Android)PDA的条码扫码广播监听(带示例附件)

我们在开发的时候需要获取优博讯PDA的条码扫码内容,根据前人的分享及自己找的一些资料整理示例代码如下,希望能帮助到有需要的人。为了避免刚入门的人无从下手,特增加了附件。

以下是示例,真正在用的时候,建议在app启动之后就开始监听,并通过全局事件来推送给需要的页面,而不是在每个页面都自己去监听,有利于代码的维护和提升性能。全局事件的监听和释放可参考我的另一个帖子:关于uni-app全局事件监听和释放监听的分享

另外优博讯的PDA需要在系统的:设置->扫描->Default->关闭(键盘方式输出) 才能使用广播监听。

onLoad() {  

            page = this;  

            this.title = "开始监听!";  

            var main = plus.android.runtimeMainActivity(); //获取activity    
            var context = plus.android.importClass('android.content.Context'); //上下文    
            var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  
                onReceive: doReceive  
            });  
            var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
            var Intent = plus.android.importClass('android.content.Intent');  
            var filter = new IntentFilter();  

            //针对优博讯安卓PDA-i6300A添加监听,其它优博讯的型号应该一样或类似  
            filter.addAction("android.intent.ACTION_DECODE_DATA"); //监听扫描  

            main.registerReceiver(receiver, filter); //注册监听    

            function doReceive(context, intent) {  

                //通过intent实例引入intent类,方便以后的‘.’操作    
                plus.android.importClass(intent);  

                //条码内容  
                var barcodeBytes = intent.getByteArrayExtra("barcode");  
                var barcode = byteToString(barcodeBytes);  

                //条码长度  
                var barcodeLength = intent.getIntExtra("length", 0);  
                //var myArray = new ArrayBuffer(0);  
                //条码类型  
                var barcodeTypeBytes = intent.getByteExtra("barcodeType", (0 | 0));  
                var barcodeType = byteToString(barcodeTypeBytes);  

                // uni.showModal({  
                //  content: '条码:' + barcode + '\r\n长度:' + barcodeLength + '\r\n类型:' + barcodeType,  
                //  showCancel: false  
                // });  
                page.title = barcode;  
                //console.log(barcode);    
                //main.unregisterReceiver(receiver);//取消监听    
            }  

            function byteToString(arr) {  
                if (typeof arr === 'string') {  
                    return arr;  
                }  
                var str = '',  
                    _arr = arr;  
                for (var i = 0; i < _arr.length; i++) {  
                    var one = _arr[i].toString(2),  
                        v = one.match(/^1+?(?=0)/);  
                    if (v && one.length == 8) {  
                        var bytesLength = v[0].length;  
                        var store = _arr[i].toString(2).slice(7 - bytesLength);  
                        for (var st = 1; st < bytesLength; st++) {  
                            store += _arr[st + i].toString(2).slice(2);  
                        }  
                        str += String.fromCharCode(parseInt(store, 2));  
                        i += bytesLength - 1;  
                    } else {  
                        str += String.fromCharCode(_arr[i]);  
                    }  
                }  
                return str;  
            }  

        }

下面是新大陆PDA的扫码方式

    //新大陆 智联天地 N7000R 获取方法  

    //#ifdef APP-PLUS  

            //this.title = "开始监听!";  

            var main = plus.android.runtimeMainActivity(); //获取activity    

            var context = plus.android.importClass('android.content.Context'); //上下文    

            var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  

                onReceive: doReceive  

            });  

            var IntentFilter = plus.android.importClass('android.content.IntentFilter');  

            var Intent = plus.android.importClass('android.content.Intent');  

            var filter = new IntentFilter();  

            filter.addAction("com.android.server.scannerservice.broadcast"); //监听扫描  

            // filter.addAction("android.intent.extra.SCAN_DATA"); //监听扫描  

            main.registerReceiver(receiver, filter); //注册监听    

            function doReceive(context, intent) {  

                //通过intent实例引入intent类,方便以后的‘.’操作    

                plus.android.importClass(intent);  

                var barcodeBytes1 = intent.getStringExtra("scannerdata");  

                console.log(page.openCustmerScan);  

                if (page.openCustmerScan) {  

                    page.cylinderRecovery.customerId = barcodeBytes1  

                } else {  

                    page.setval(barcodeBytes1)  

                }  

            }  
    //#ifdef APP-PLUS  

            //this.title = "开始监听!";  

            var main = plus.android.runtimeMainActivity(); //获取activity    

            var context = plus.android.importClass('android.content.Context'); //上下文    

            var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  

                onReceive: doReceive  

            });  

            var IntentFilter = plus.android.importClass('android.content.IntentFilter');  

            var Intent = plus.android.importClass('android.content.Intent');  

            var filter = new IntentFilter();  

            filter.addAction("com.android.server.scannerservice.broadcast"); //监听扫描  

            // filter.addAction("android.intent.extra.SCAN_DATA"); //监听扫描  

            main.registerReceiver(receiver, filter); //注册监听    

            function doReceive(context, intent) {  

                //通过intent实例引入intent类,方便以后的‘.’操作    

                plus.android.importClass(intent);  

                var barcodeBytes1 = intent.getStringExtra("scannerdata");  

                console.log(page.openCustmerScan);  

                if (page.openCustmerScan) {  

                    page.cylinderRecovery.customerId = barcodeBytes1  

                } else {  

                    page.setval(barcodeBytes1)  

                }  

            }  

            //#endif  
            //#endif
继续阅读 »

我们在开发的时候需要获取优博讯PDA的条码扫码内容,根据前人的分享及自己找的一些资料整理示例代码如下,希望能帮助到有需要的人。为了避免刚入门的人无从下手,特增加了附件。

以下是示例,真正在用的时候,建议在app启动之后就开始监听,并通过全局事件来推送给需要的页面,而不是在每个页面都自己去监听,有利于代码的维护和提升性能。全局事件的监听和释放可参考我的另一个帖子:关于uni-app全局事件监听和释放监听的分享

另外优博讯的PDA需要在系统的:设置->扫描->Default->关闭(键盘方式输出) 才能使用广播监听。

onLoad() {  

            page = this;  

            this.title = "开始监听!";  

            var main = plus.android.runtimeMainActivity(); //获取activity    
            var context = plus.android.importClass('android.content.Context'); //上下文    
            var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  
                onReceive: doReceive  
            });  
            var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
            var Intent = plus.android.importClass('android.content.Intent');  
            var filter = new IntentFilter();  

            //针对优博讯安卓PDA-i6300A添加监听,其它优博讯的型号应该一样或类似  
            filter.addAction("android.intent.ACTION_DECODE_DATA"); //监听扫描  

            main.registerReceiver(receiver, filter); //注册监听    

            function doReceive(context, intent) {  

                //通过intent实例引入intent类,方便以后的‘.’操作    
                plus.android.importClass(intent);  

                //条码内容  
                var barcodeBytes = intent.getByteArrayExtra("barcode");  
                var barcode = byteToString(barcodeBytes);  

                //条码长度  
                var barcodeLength = intent.getIntExtra("length", 0);  
                //var myArray = new ArrayBuffer(0);  
                //条码类型  
                var barcodeTypeBytes = intent.getByteExtra("barcodeType", (0 | 0));  
                var barcodeType = byteToString(barcodeTypeBytes);  

                // uni.showModal({  
                //  content: '条码:' + barcode + '\r\n长度:' + barcodeLength + '\r\n类型:' + barcodeType,  
                //  showCancel: false  
                // });  
                page.title = barcode;  
                //console.log(barcode);    
                //main.unregisterReceiver(receiver);//取消监听    
            }  

            function byteToString(arr) {  
                if (typeof arr === 'string') {  
                    return arr;  
                }  
                var str = '',  
                    _arr = arr;  
                for (var i = 0; i < _arr.length; i++) {  
                    var one = _arr[i].toString(2),  
                        v = one.match(/^1+?(?=0)/);  
                    if (v && one.length == 8) {  
                        var bytesLength = v[0].length;  
                        var store = _arr[i].toString(2).slice(7 - bytesLength);  
                        for (var st = 1; st < bytesLength; st++) {  
                            store += _arr[st + i].toString(2).slice(2);  
                        }  
                        str += String.fromCharCode(parseInt(store, 2));  
                        i += bytesLength - 1;  
                    } else {  
                        str += String.fromCharCode(_arr[i]);  
                    }  
                }  
                return str;  
            }  

        }

下面是新大陆PDA的扫码方式

    //新大陆 智联天地 N7000R 获取方法  

    //#ifdef APP-PLUS  

            //this.title = "开始监听!";  

            var main = plus.android.runtimeMainActivity(); //获取activity    

            var context = plus.android.importClass('android.content.Context'); //上下文    

            var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  

                onReceive: doReceive  

            });  

            var IntentFilter = plus.android.importClass('android.content.IntentFilter');  

            var Intent = plus.android.importClass('android.content.Intent');  

            var filter = new IntentFilter();  

            filter.addAction("com.android.server.scannerservice.broadcast"); //监听扫描  

            // filter.addAction("android.intent.extra.SCAN_DATA"); //监听扫描  

            main.registerReceiver(receiver, filter); //注册监听    

            function doReceive(context, intent) {  

                //通过intent实例引入intent类,方便以后的‘.’操作    

                plus.android.importClass(intent);  

                var barcodeBytes1 = intent.getStringExtra("scannerdata");  

                console.log(page.openCustmerScan);  

                if (page.openCustmerScan) {  

                    page.cylinderRecovery.customerId = barcodeBytes1  

                } else {  

                    page.setval(barcodeBytes1)  

                }  

            }  
    //#ifdef APP-PLUS  

            //this.title = "开始监听!";  

            var main = plus.android.runtimeMainActivity(); //获取activity    

            var context = plus.android.importClass('android.content.Context'); //上下文    

            var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  

                onReceive: doReceive  

            });  

            var IntentFilter = plus.android.importClass('android.content.IntentFilter');  

            var Intent = plus.android.importClass('android.content.Intent');  

            var filter = new IntentFilter();  

            filter.addAction("com.android.server.scannerservice.broadcast"); //监听扫描  

            // filter.addAction("android.intent.extra.SCAN_DATA"); //监听扫描  

            main.registerReceiver(receiver, filter); //注册监听    

            function doReceive(context, intent) {  

                //通过intent实例引入intent类,方便以后的‘.’操作    

                plus.android.importClass(intent);  

                var barcodeBytes1 = intent.getStringExtra("scannerdata");  

                console.log(page.openCustmerScan);  

                if (page.openCustmerScan) {  

                    page.cylinderRecovery.customerId = barcodeBytes1  

                } else {  

                    page.setval(barcodeBytes1)  

                }  

            }  

            //#endif  
            //#endif
收起阅读 »

关于uni-app全局事件监听和释放监听的分享

我们在使用uni-app开发的时候,需要在某个页面监听全局事件,并且需要再退出页面的时候释放监听,结果发现释放不了页面的监听,并且找了官方和网上的资料没有明确的解决示例。所以分享一下避免大家采坑。我的理解,之前之所以释放监听无效是因为绑定监听和释放监听并没有使用相同的方法。目前可行的解决方法是把要绑定的方法单独定义出来,这样在绑定和释放监听的时候就能确保都是相同的方法,就能真正释放监听的绑定。示例如下,有问题欢迎留言。

官方事件监听文档

// 我的页面    
onLoad(){    
    // 监听事件    
    uni.$on('scancode',this.callback) ;  
},    
onUnload() {    
    // 移除监听事件    
     uni.$off('scancode',this.callback);    
    },  
methods: {  
callback(data) {  
todo.....  
}  
}
继续阅读 »

我们在使用uni-app开发的时候,需要在某个页面监听全局事件,并且需要再退出页面的时候释放监听,结果发现释放不了页面的监听,并且找了官方和网上的资料没有明确的解决示例。所以分享一下避免大家采坑。我的理解,之前之所以释放监听无效是因为绑定监听和释放监听并没有使用相同的方法。目前可行的解决方法是把要绑定的方法单独定义出来,这样在绑定和释放监听的时候就能确保都是相同的方法,就能真正释放监听的绑定。示例如下,有问题欢迎留言。

官方事件监听文档

// 我的页面    
onLoad(){    
    // 监听事件    
    uni.$on('scancode',this.callback) ;  
},    
onUnload() {    
    // 移除监听事件    
     uni.$off('scancode',this.callback);    
    },  
methods: {  
callback(data) {  
todo.....  
}  
}
收起阅读 »

解决Android8.0及以上版本系统通知消息无法显示问题

Native.JS

新手代码写的有点乱。。 之前借鉴了几位大神的代码,在8.0之前非常好用,最近需要投标突然发现自己手机收不到推送消息了,折磨了我一天啊。。
话不多说,放代码,希望对大家有用!!!!

                   var mNotification;  
            var SystemVersion = plus.os.version;    
            var firstVersionNumber = Number(SystemVersion.split('.')[0]);    
            var main = plus.android.runtimeMainActivity();  
            var Context = plus.android.importClass("android.content.Context");  
            var Noti = plus.android.importClass("android.app.Notification");  
            var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
            var nm = main.getSystemService(Context.NOTIFICATION_SERVICE);  

            //var Notification = plus.android.importClass("android.app.Notification");  
            var Intent = plus.android.importClass("android.content.Intent");  
            var PendingIntent = plus.android.importClass("android.app.PendingIntent");  
            var intent = new Intent(main, main.getClass());  
            var pendingIntent = PendingIntent.getActivity(main, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);  
            var r = plus.android.importClass("android.R");  
            if (firstVersionNumber>=8) {  
                Notification = plus.android.importClass("android.support.v4.app.NotificationCompat");    
            } else {    
                Notification = plus.android.importClass("android.app.Notification");    
            }    
            if(firstVersionNumber>=8){//判断当前系统版本在8.0及以上    
                  var NotificationChannel = plus.android.importClass('android.app.NotificationChannel');    
                  var channel = new NotificationChannel("s"+ NotifyID, "1", NotificationManager.IMPORTANCE_HIGH);    
                  nm.createNotificationChannel(channel);  
                  mNotification = new Notification.Builder(main,"s" +NotifyID);    
            }else{    
                  //设为true代表常驻状态栏    
                  //this.mNotificationBuild.setNumber(defaultNumber)   
                  mNotification = new Notification.Builder(main);    
            }    

            mNotification.setContentTitle("xxxxx")  
            mNotification.setContentText(str);  
            mNotification.setSubText(str1);  
            mNotification.setSmallIcon(17301620);  
            mNotification.setDefaults(Noti.DEFAULT_VIBRATE);//声音、闪灯、震动效果,可叠加  
            mNotification.setPriority(Noti.PRIORITY_DEFAULT);//通知优先级  
            mNotification.flags=Notification.FLAG_ONLY_ALERT_ONCE;//发起通知时震动  
            mNotification.setContentIntent(pendingIntent);  
            var mNb = mNotification.build();  
            if(firstVersionNumber>=8){//判断当前系统版本在8.0及以上  
                  nm.notify("s"+ NotifyID,NotifyID, mNb);  
            }else{    
                  nm.notify(NotifyID, mNb);  
            }    
            void plus.device.beep(5);  
            plus.device.vibrate(300);  
            NotifyID  ;  
继续阅读 »

新手代码写的有点乱。。 之前借鉴了几位大神的代码,在8.0之前非常好用,最近需要投标突然发现自己手机收不到推送消息了,折磨了我一天啊。。
话不多说,放代码,希望对大家有用!!!!

                   var mNotification;  
            var SystemVersion = plus.os.version;    
            var firstVersionNumber = Number(SystemVersion.split('.')[0]);    
            var main = plus.android.runtimeMainActivity();  
            var Context = plus.android.importClass("android.content.Context");  
            var Noti = plus.android.importClass("android.app.Notification");  
            var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
            var nm = main.getSystemService(Context.NOTIFICATION_SERVICE);  

            //var Notification = plus.android.importClass("android.app.Notification");  
            var Intent = plus.android.importClass("android.content.Intent");  
            var PendingIntent = plus.android.importClass("android.app.PendingIntent");  
            var intent = new Intent(main, main.getClass());  
            var pendingIntent = PendingIntent.getActivity(main, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);  
            var r = plus.android.importClass("android.R");  
            if (firstVersionNumber>=8) {  
                Notification = plus.android.importClass("android.support.v4.app.NotificationCompat");    
            } else {    
                Notification = plus.android.importClass("android.app.Notification");    
            }    
            if(firstVersionNumber>=8){//判断当前系统版本在8.0及以上    
                  var NotificationChannel = plus.android.importClass('android.app.NotificationChannel');    
                  var channel = new NotificationChannel("s"+ NotifyID, "1", NotificationManager.IMPORTANCE_HIGH);    
                  nm.createNotificationChannel(channel);  
                  mNotification = new Notification.Builder(main,"s" +NotifyID);    
            }else{    
                  //设为true代表常驻状态栏    
                  //this.mNotificationBuild.setNumber(defaultNumber)   
                  mNotification = new Notification.Builder(main);    
            }    

            mNotification.setContentTitle("xxxxx")  
            mNotification.setContentText(str);  
            mNotification.setSubText(str1);  
            mNotification.setSmallIcon(17301620);  
            mNotification.setDefaults(Noti.DEFAULT_VIBRATE);//声音、闪灯、震动效果,可叠加  
            mNotification.setPriority(Noti.PRIORITY_DEFAULT);//通知优先级  
            mNotification.flags=Notification.FLAG_ONLY_ALERT_ONCE;//发起通知时震动  
            mNotification.setContentIntent(pendingIntent);  
            var mNb = mNotification.build();  
            if(firstVersionNumber>=8){//判断当前系统版本在8.0及以上  
                  nm.notify("s"+ NotifyID,NotifyID, mNb);  
            }else{    
                  nm.notify(NotifyID, mNb);  
            }    
            void plus.device.beep(5);  
            plus.device.vibrate(300);  
            NotifyID  ;  
收起阅读 »

真机运行

uniapp

在某个电脑上就完全运行不了真机

在某个电脑上就完全运行不了真机

uni-popup滚动时,父组件跟随滚动

popup

定义CSS

.wos-scroll-no{  
    height:98vh;  
    overflow-y: hidden;  
}  
.wos-scroll-yes{  
    height:auto;  
    overflow-y:auto;  
}

父组件绑定data

<view :class="wosScroll">  
...  
<view>
...  
data() {  
        return {  
            wosScroll:"wos-scroll-yes",  
...

修改uni-popup.vue。找到以下部分加入

open () {  
     this.$parent.wosScroll = 'wos-scroll-no'   //新加入的 ++++++  
      this.$emit('change', {  
        show: true  
      })  
      this.showPopup = true  
      this.$nextTick(() => {  
        setTimeout(() => {  
          this.ani = '' + this.type  
        }, 30)  
      })  
    },  
    close (type) {  
      this.$parent.wosScroll = 'wos-scroll-yes'  //新加入的 +++++++++  
      if (!this.maskClick && type) return  
      this.$emit('change', {  
        show: false  
      })  
      this.ani = ''  
      this.$nextTick(() => {  
        setTimeout(() => {  
          this.showPopup = false  
        }, 300)  
      })  
    }
继续阅读 »

定义CSS

.wos-scroll-no{  
    height:98vh;  
    overflow-y: hidden;  
}  
.wos-scroll-yes{  
    height:auto;  
    overflow-y:auto;  
}

父组件绑定data

<view :class="wosScroll">  
...  
<view>
...  
data() {  
        return {  
            wosScroll:"wos-scroll-yes",  
...

修改uni-popup.vue。找到以下部分加入

open () {  
     this.$parent.wosScroll = 'wos-scroll-no'   //新加入的 ++++++  
      this.$emit('change', {  
        show: true  
      })  
      this.showPopup = true  
      this.$nextTick(() => {  
        setTimeout(() => {  
          this.ani = '' + this.type  
        }, 30)  
      })  
    },  
    close (type) {  
      this.$parent.wosScroll = 'wos-scroll-yes'  //新加入的 +++++++++  
      if (!this.maskClick && type) return  
      this.$emit('change', {  
        show: false  
      })  
      this.ani = ''  
      this.$nextTick(() => {  
        setTimeout(() => {  
          this.showPopup = false  
        }, 300)  
      })  
    }
收起阅读 »

Mac: 关于HBuilderX在 macOS Catalina 10.15新系统上的运行说明

macOS Catalina macos 10.15

.
10月8日凌晨, 苹果正式推送了macOS Catalina 10.15系统。
操作系统主要更新了权限相关方面,为了大家更好使用,小编汇总了一下可能遇到的问题。
.

问题:项目管理器:以前的项目无法展开了,或文件无法保存了

原因: mac 10.15, 访问文稿目录,需要授权

解决方案:

  1. 打开【设置App】-->【安全性与隐私】--> 【隐私】--> 【文件与文件夹】
  2. 找到HBuilderX,勾选复选框

更新:10月16日起,HBuilderX 2.3.3已经通过了苹果的认证,默认即可获得授权,无需再进行额外设置。

继续阅读 »

.
10月8日凌晨, 苹果正式推送了macOS Catalina 10.15系统。
操作系统主要更新了权限相关方面,为了大家更好使用,小编汇总了一下可能遇到的问题。
.

问题:项目管理器:以前的项目无法展开了,或文件无法保存了

原因: mac 10.15, 访问文稿目录,需要授权

解决方案:

  1. 打开【设置App】-->【安全性与隐私】--> 【隐私】--> 【文件与文件夹】
  2. 找到HBuilderX,勾选复选框

更新:10月16日起,HBuilderX 2.3.3已经通过了苹果的认证,默认即可获得授权,无需再进行额外设置。

收起阅读 »

uniapp-小程序支付DOME

支付

DOME已测试,后端代


码,调用,前端使用,数据样例都写在附件里了,测试没问题整理到有道云笔记后导出的pdf

DOME已测试,后端代


码,调用,前端使用,数据样例都写在附件里了,测试没问题整理到有道云笔记后导出的pdf

上一个app的MQTT例子

App

利用plus-websocket和修改后的mqttws31.js实现,看附件代码(代码已删)
官方App端已修复 websocket 问题,可以使用 MQTT.js,示例:https://ext.dcloud.net.cn/plugin?id=854

利用plus-websocket和修改后的mqttws31.js实现,看附件代码(代码已删)
官方App端已修复 websocket 问题,可以使用 MQTT.js,示例:https://ext.dcloud.net.cn/plugin?id=854

mui在线房屋出租租房平台app界面模板

mui

基于mui框架制作的一款在线房屋出租租房平台app界面模板,房屋租赁手机app模板,挺不错的,推荐给大家。

下载地址:https://www.sucaihuo.com/templates/6225.html

继续阅读 »

基于mui框架制作的一款在线房屋出租租房平台app界面模板,房屋租赁手机app模板,挺不错的,推荐给大家。

下载地址:https://www.sucaihuo.com/templates/6225.html

收起阅读 »

点击返回按钮出现提示框,确定的时候才返回

uniapp

有时候我们在编辑页面的时候有这样一个场景,当用户点击返回按钮,给一个弹框,提示是否确定返回,以下是代码实现

onBackPress(options) {  
      // 如果是返回按钮,才做执行  
      if (options.from === 'backbutton') {  
        uni.showModal({  
          title: '提示',  
          content: '确定退出编辑吗?',  
          success: (res) => {  
            if (res.confirm) {  
              uni.navigateBack()  
            }  
          }  
        })  
        // 禁止默认返回  
        return true  
      }  
    },
继续阅读 »

有时候我们在编辑页面的时候有这样一个场景,当用户点击返回按钮,给一个弹框,提示是否确定返回,以下是代码实现

onBackPress(options) {  
      // 如果是返回按钮,才做执行  
      if (options.from === 'backbutton') {  
        uni.showModal({  
          title: '提示',  
          content: '确定退出编辑吗?',  
          success: (res) => {  
            if (res.confirm) {  
              uni.navigateBack()  
            }  
          }  
        })  
        // 禁止默认返回  
        return true  
      }  
    },
收起阅读 »

iOS提交AppStore审核时:提示有其他支付并隐藏功能被拒的处理办法

提示有其他支付并隐藏功能被拒 iOS离线打包

背景提示:数字类产品(比如购买会员等不需要配送实物的商品),Apple规定必须使用苹果IAP应用内支付,给Apple分成30%。打包的时候不要勾选微信或支付宝等其他支付方式。如果你提交的包里包含了微信支付宝等支付的sdk,即使没使用,Appstore也会认为你有隐藏方式,以后会绕过iap,不给Apple分成,因此拒绝你的App上线

  • 应用中如果没有交易功能,不要包含任何支付相关模块和任何支付相关的js代码
  • 应用中如果只包含虚拟物品交易,只能使用苹果应用内支付(IAP),不能使用支付宝和微信支付
  • 应用中如果包含实物交易,可以包含支付宝和微信支付

使用HBuilderX提交云端打包

提交苹果商店审核时,提示“有其他支付并隐藏功能被拒”或者“报PGPay SDK不允许上架的问题”,请按以下方法处理:

  • 如果应用没有交易功能,在manifest.json的“(App)模块权限配置”页的“打包模块配置”项下不要勾选“Payment(支付)”,重新打包提交
  • 如果应用只包含虚拟物品交易,在manifest.json的“(App)SDK配置”页的“支付”项下勾选“Apple应用内支付”,不要勾选支付宝和微信支付。这时需要和苹果沟通,说明的大概意思是:PGPay SDK 的PGPay只是个名字而已,并不是什么支付SDK,并没有违反苹果支付相关的政策。
  • 如果应用包含实物交易,可以使用支付宝和微信支付。这时需要和苹果沟通,说明应用使用支付功能的场景。

使用5+ SDK本地离线打包

按照签名的规则确定应用包含的支付模块,按以下方法确认:

  • 确定工程中是否有微信和支付宝支付的功能,如果没有把不需要的微信和支付宝的相关库删除,删除时参考离线sdk包里的Feature-iOS.xls文件中Payment模块的配置。
    注意:微信SDK有2个,一个是带支付的(libWeChatSDK_pay.a),一个是不带支付的(libWeChatSDK.a),删除时,删除带支付的。但是工程中有用到微信其他的功能需要添加libWeChatSDK.a库以免编译报错
  • 如果工程中没有微信和支付宝的功能,但是有苹果支付的功能需要liblibPayment.a库和libIAPPay.a,只有libIAPPay.a库,工程编译会报错。
  • 如果工程中也没有苹果支付,那么把liblibPayment.a库和libIAPPay.a都删除,删除时参考离线sdk包里的Feature-iOS.xls文件中Payment模块的配置。
  • 如果工程中有libBaiduWalletSDK.a,libpingpppay.a和libpingpp.a这3个库,Pingpp.bundle和BaiduWalletSDKBundle.bundle这2个文件,把它们都删除。
  • 如果删除过程中编译报“_SKStoreProductViewController”这么一个错,需要在工程中添加系统库StoreKit.framework。
  • 如果工程中没有支付功能需把相关的支付的js代码删除。
  • 查看工程中PandoraApi.bundle中feature.plist文件,把Payment节点下的extend节点里的项,按自己的业务情况删除;比如,业务中没有支付宝支付,那就把“alix”这项删除,没有微信支付,就把“weixin”这项删除,如果没有支付功能,把Payment整个节点删除。
  • 如果还是提示“有其他支付并隐藏功能被拒”或者“报PGPay SDK不允许上架的问题”,需要和苹果沟通,说明的大概意思是:PGPay SDK 的PGPay只是个名字而已,并不是什么支付SDK,并没有违反苹果支付相关的政策。

提示这个“报PGPay SDK不允许上架的问题” 在2.3.3.20190924之后的版本会把名字改掉,以便不再报这个上架的问题。

继续阅读 »

背景提示:数字类产品(比如购买会员等不需要配送实物的商品),Apple规定必须使用苹果IAP应用内支付,给Apple分成30%。打包的时候不要勾选微信或支付宝等其他支付方式。如果你提交的包里包含了微信支付宝等支付的sdk,即使没使用,Appstore也会认为你有隐藏方式,以后会绕过iap,不给Apple分成,因此拒绝你的App上线

  • 应用中如果没有交易功能,不要包含任何支付相关模块和任何支付相关的js代码
  • 应用中如果只包含虚拟物品交易,只能使用苹果应用内支付(IAP),不能使用支付宝和微信支付
  • 应用中如果包含实物交易,可以包含支付宝和微信支付

使用HBuilderX提交云端打包

提交苹果商店审核时,提示“有其他支付并隐藏功能被拒”或者“报PGPay SDK不允许上架的问题”,请按以下方法处理:

  • 如果应用没有交易功能,在manifest.json的“(App)模块权限配置”页的“打包模块配置”项下不要勾选“Payment(支付)”,重新打包提交
  • 如果应用只包含虚拟物品交易,在manifest.json的“(App)SDK配置”页的“支付”项下勾选“Apple应用内支付”,不要勾选支付宝和微信支付。这时需要和苹果沟通,说明的大概意思是:PGPay SDK 的PGPay只是个名字而已,并不是什么支付SDK,并没有违反苹果支付相关的政策。
  • 如果应用包含实物交易,可以使用支付宝和微信支付。这时需要和苹果沟通,说明应用使用支付功能的场景。

使用5+ SDK本地离线打包

按照签名的规则确定应用包含的支付模块,按以下方法确认:

  • 确定工程中是否有微信和支付宝支付的功能,如果没有把不需要的微信和支付宝的相关库删除,删除时参考离线sdk包里的Feature-iOS.xls文件中Payment模块的配置。
    注意:微信SDK有2个,一个是带支付的(libWeChatSDK_pay.a),一个是不带支付的(libWeChatSDK.a),删除时,删除带支付的。但是工程中有用到微信其他的功能需要添加libWeChatSDK.a库以免编译报错
  • 如果工程中没有微信和支付宝的功能,但是有苹果支付的功能需要liblibPayment.a库和libIAPPay.a,只有libIAPPay.a库,工程编译会报错。
  • 如果工程中也没有苹果支付,那么把liblibPayment.a库和libIAPPay.a都删除,删除时参考离线sdk包里的Feature-iOS.xls文件中Payment模块的配置。
  • 如果工程中有libBaiduWalletSDK.a,libpingpppay.a和libpingpp.a这3个库,Pingpp.bundle和BaiduWalletSDKBundle.bundle这2个文件,把它们都删除。
  • 如果删除过程中编译报“_SKStoreProductViewController”这么一个错,需要在工程中添加系统库StoreKit.framework。
  • 如果工程中没有支付功能需把相关的支付的js代码删除。
  • 查看工程中PandoraApi.bundle中feature.plist文件,把Payment节点下的extend节点里的项,按自己的业务情况删除;比如,业务中没有支付宝支付,那就把“alix”这项删除,没有微信支付,就把“weixin”这项删除,如果没有支付功能,把Payment整个节点删除。
  • 如果还是提示“有其他支付并隐藏功能被拒”或者“报PGPay SDK不允许上架的问题”,需要和苹果沟通,说明的大概意思是:PGPay SDK 的PGPay只是个名字而已,并不是什么支付SDK,并没有违反苹果支付相关的政策。

提示这个“报PGPay SDK不允许上架的问题” 在2.3.3.20190924之后的版本会把名字改掉,以便不再报这个上架的问题。

收起阅读 »

自定义相机,拍照,拍题

相机权限 拍照 插件

https://ext.dcloud.net.cn/plugin?id=838

启用原生相机进行拍照或者选择相册中的照片,进行二次裁剪

如需5+ 离线打包请联系作者

继续阅读 »

https://ext.dcloud.net.cn/plugin?id=838

启用原生相机进行拍照或者选择相册中的照片,进行二次裁剪

如需5+ 离线打包请联系作者

收起阅读 »