HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

5+ app 保存海报图片至手机相册

/**  
* this.posterUrl  海报 base64 图片  
*/  
let fileName = 'share'  
      var bitmap = new plus.nativeObj.Bitmap('share')  
      bitmap.loadBase64Data(this.posterUrl, function(e) {  
        console.log('加载Base64图片数据成功')  
        // 如果传入文件名称为空,则直接设置APP名称为文件名称  
        if (fileName === undefined) {  
          fileName = plus.runtime.name  
        }  

        fileName = fileName+ +(new Date) + '.png'  

        bitmap.save('_doc/' + fileName, {}, function(i) {  
          console.log('保存图片成功:' + JSON.stringify(i))  
          plus.gallery.save(i.target, function(e) {  
            console.log('保存图片成功:' + JSON.stringify(e))  
            Toast(`图片保存到:${e.file}`)  
          }, function() {  
            Toast(`图片保存失败`)  
          })  
        }, function(e) {  
          console.log('保存图片失败:' + JSON.stringify(e))  
          Toast(`图片保存失败`)  
        })  
      }, function(e) {  
        console.log('加载Base64图片数据失败:' + JSON.stringify(e))  
        Toast(`图片保存失败`)  
      })
继续阅读 »
/**  
* this.posterUrl  海报 base64 图片  
*/  
let fileName = 'share'  
      var bitmap = new plus.nativeObj.Bitmap('share')  
      bitmap.loadBase64Data(this.posterUrl, function(e) {  
        console.log('加载Base64图片数据成功')  
        // 如果传入文件名称为空,则直接设置APP名称为文件名称  
        if (fileName === undefined) {  
          fileName = plus.runtime.name  
        }  

        fileName = fileName+ +(new Date) + '.png'  

        bitmap.save('_doc/' + fileName, {}, function(i) {  
          console.log('保存图片成功:' + JSON.stringify(i))  
          plus.gallery.save(i.target, function(e) {  
            console.log('保存图片成功:' + JSON.stringify(e))  
            Toast(`图片保存到:${e.file}`)  
          }, function() {  
            Toast(`图片保存失败`)  
          })  
        }, function(e) {  
          console.log('保存图片失败:' + JSON.stringify(e))  
          Toast(`图片保存失败`)  
        })  
      }, function(e) {  
        console.log('加载Base64图片数据失败:' + JSON.stringify(e))  
        Toast(`图片保存失败`)  
      })
收起阅读 »

uni-app微信公众号支付和分享,特别是ios下的配置,完美解决

uniapp 教程

一、支付

由于在ios中uni-app发布的应用是单应用,不管访问哪个页面,始终记录的是首次进来的那个页面。

这样的话,在微信支付签名时会报签名不对的错误。怎么解决?

老王的解决方案是在main.js下加上以下代码:

//#ifdef H5  

app.$router.afterEach((to, from) => {  

const u = navigator.userAgent.toLowerCase()  

if (u.indexOf("like mac os x") < 0 || u.match(/MicroMessenger/i) != 'micromessenger') return  

if (to.path !== global.location.pathname) {  

location.assign(config.h5_addr + to.fullPath);  

}  

})  

//#endif

什么意思呢?支付无非就是要当前页的链接到后台签名,这个页面需要配置到微信支付授权目录。

这段代码就是通过vue全局钩子函数,动态改变浏览器地址。

自此,支付问题完美解决。

二、分享

分享的话比较麻烦一点,解决方案倒还比较简单,就是判断跳转后的页面是否是分享页面,如果是的,就用window.location.href跳转。但是要实现公用的话,就需要封装方法。app内的所有跳转都走全局跳转,封装一个全局函数,然后在全局函数里定义需要分享的页面链接,跳转前判断是不是分享页面。

//判断是否分享页面  

if (shareLinks.indexOf(p) > -1) {  

//公众号  

// #ifdef H5  

window.location.href = config.app_url + config.h5_addr + url;  

return;  

// #endif  

}  

// 普通页面  

uni.navigateTo({  

url: url  

});

至此,完美解决了uni-app在ios下的公众号分享跟支付问题。

继续阅读 »

一、支付

由于在ios中uni-app发布的应用是单应用,不管访问哪个页面,始终记录的是首次进来的那个页面。

这样的话,在微信支付签名时会报签名不对的错误。怎么解决?

老王的解决方案是在main.js下加上以下代码:

//#ifdef H5  

app.$router.afterEach((to, from) => {  

const u = navigator.userAgent.toLowerCase()  

if (u.indexOf("like mac os x") < 0 || u.match(/MicroMessenger/i) != 'micromessenger') return  

if (to.path !== global.location.pathname) {  

location.assign(config.h5_addr + to.fullPath);  

}  

})  

//#endif

什么意思呢?支付无非就是要当前页的链接到后台签名,这个页面需要配置到微信支付授权目录。

这段代码就是通过vue全局钩子函数,动态改变浏览器地址。

自此,支付问题完美解决。

二、分享

分享的话比较麻烦一点,解决方案倒还比较简单,就是判断跳转后的页面是否是分享页面,如果是的,就用window.location.href跳转。但是要实现公用的话,就需要封装方法。app内的所有跳转都走全局跳转,封装一个全局函数,然后在全局函数里定义需要分享的页面链接,跳转前判断是不是分享页面。

//判断是否分享页面  

if (shareLinks.indexOf(p) > -1) {  

//公众号  

// #ifdef H5  

window.location.href = config.app_url + config.h5_addr + url;  

return;  

// #endif  

}  

// 普通页面  

uni.navigateTo({  

url: url  

});

至此,完美解决了uni-app在ios下的公众号分享跟支付问题。

收起阅读 »

上海互联网公司招uniapp开发偏app原生方向的,有意的联系

坐标:上海西藏北路,主要负责uniapp开发app兼容和插件等方面的工作,薪酬范围在15-20k。有意的请联系我。

坐标:上海西藏北路,主要负责uniapp开发app兼容和插件等方面的工作,薪酬范围在15-20k。有意的请联系我。

有没有人觉得hb的git插件太难用了

多人开发就不能差太多版本,冲突,冲突,合并也合并不了

比起idea,webstorm,eclipse差远了

多人开发就不能差太多版本,冲突,冲突,合并也合并不了

比起idea,webstorm,eclipse差远了

微信支付失败,返回错误信息只有{"errMsg":"requestPayment:fail errors"}

在uniapp 微信支付时,一直提示报错,配置信息都没问题,并且没有类似于-1的状态提示,那么有可能是uniapp端支付代码的参数顺序有问题
uni.requestPayment({
provider: 'wxpay',
orderInfo: obj,
success: res=> {
success && success(res)
},
fail: res=> {
console.log(res)
fail && fail(res)
}
});
{
"appid": "wxxxxxxxxxxxxx",
"noncestr": "84FB3E2B75B04343921985C4DB75BC45",
"package": "Sign=WXPay",
"partnerid": "000000000",
"prepayid": "wx1514411xxxxxxxxxxxxxxxxxx699386300",
"sign": "62FD6A3EF48CE76AFD2XXB0D9C70EEDD",
"timestamp": "1594795179"
}
这组数据看着没问题(部分隐私信息已修改),并且签名经过官方效验没问题,
微信签名效验地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1
经过测试,发现,发生错误的原因是因为sgin的顺序没有在最后,目前未测试其他参数的顺序是否影响支付成功。请大家一定要注意参数的顺序,3天的时间就因为这个参数浪费了,惨痛的教训啊
微信app支付文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

继续阅读 »

在uniapp 微信支付时,一直提示报错,配置信息都没问题,并且没有类似于-1的状态提示,那么有可能是uniapp端支付代码的参数顺序有问题
uni.requestPayment({
provider: 'wxpay',
orderInfo: obj,
success: res=> {
success && success(res)
},
fail: res=> {
console.log(res)
fail && fail(res)
}
});
{
"appid": "wxxxxxxxxxxxxx",
"noncestr": "84FB3E2B75B04343921985C4DB75BC45",
"package": "Sign=WXPay",
"partnerid": "000000000",
"prepayid": "wx1514411xxxxxxxxxxxxxxxxxx699386300",
"sign": "62FD6A3EF48CE76AFD2XXB0D9C70EEDD",
"timestamp": "1594795179"
}
这组数据看着没问题(部分隐私信息已修改),并且签名经过官方效验没问题,
微信签名效验地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1
经过测试,发现,发生错误的原因是因为sgin的顺序没有在最后,目前未测试其他参数的顺序是否影响支付成功。请大家一定要注意参数的顺序,3天的时间就因为这个参数浪费了,惨痛的教训啊
微信app支付文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

收起阅读 »

开发Android插件,报错 is not accessible from ...TypeModuleFactory 问题解决方案

Android uniapp原生插件 uniapp

最近升级到了Andoroid Studio 4.0,然后开发插件时遇到的一个小问题

本来一切流程照常,和以前创建Android原生插件一样新建了Module,但是跑起来的时候,调用任何原生方法都报这个错
代码、详细报错如下

java.lang.Class"\<"com.fenger.uniplugin.uniplugin_easyprotector.easyProtector> is not accessible from java.lang.Class"\<"com.taobao.weex.common.TypeModuleFactory>

2020-07-15 12:44:26.429 2905-2960/com.dapaoxiaoyingxiong.game E/weex: easy-protector module build instace failed.java.lang.IllegalAccessException: java.lang.Class<com.fenger.uniplugin.uniplugin_easyprotector.easyProtector> is not accessible from java.lang.Class<com.taobao.weex.common.TypeModuleFactory>  
        at java.lang.Class.newInstance(Native Method)  
        at com.taobao.weex.common.TypeModuleFactory.buildInstance(TypeModuleFactory.java:79)  
        at com.taobao.weex.bridge.WXModuleManager.findModule(WXModuleManager.java:284)  
        at com.taobao.weex.bridge.WXModuleManager.callModuleMethod(WXModuleManager.java:213)  
        at com.taobao.weex.bridge.WXBridgeManager.callModuleMethod(WXBridgeManager.java:518)  
        at com.taobao.weex.bridge.WXBridgeManager.callNativeModule(WXBridgeManager.java:700)  
        at com.taobao.weex.bridge.WXBridge.callNativeModule(WXBridge.java:371)  
        at com.taobao.weex.base.SystemMessageHandler.nativeRunWork(Native Method)  
        at com.taobao.weex.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:104)  
        at android.os.Handler.dispatchMessage(Handler.java:106)  
        at android.os.Looper.loop(Looper.java:173)  
        at android.os.HandlerThread.run(HandlerThread.java:65)

看提示以为是继承出了问题
但是修改为继承:com.taobao.weex.common.WXModule 还是 com.taobao.weex.WXSDKEngine.DestroyableModule 都还仍然报这个错

折腾了几个小时后,仔细对比,发现和以前自己开发的插件 只有一个差别:
以前的Module建的Class ide自动使用了public修饰
升级到了Andoroid Studio 4.0后,ide默认没有public修饰Class
遂用public 修饰 Class之后,一切调用运行正常
很隐蔽的一个小坑,记录一下

继续阅读 »

最近升级到了Andoroid Studio 4.0,然后开发插件时遇到的一个小问题

本来一切流程照常,和以前创建Android原生插件一样新建了Module,但是跑起来的时候,调用任何原生方法都报这个错
代码、详细报错如下

java.lang.Class"\<"com.fenger.uniplugin.uniplugin_easyprotector.easyProtector> is not accessible from java.lang.Class"\<"com.taobao.weex.common.TypeModuleFactory>

2020-07-15 12:44:26.429 2905-2960/com.dapaoxiaoyingxiong.game E/weex: easy-protector module build instace failed.java.lang.IllegalAccessException: java.lang.Class<com.fenger.uniplugin.uniplugin_easyprotector.easyProtector> is not accessible from java.lang.Class<com.taobao.weex.common.TypeModuleFactory>  
        at java.lang.Class.newInstance(Native Method)  
        at com.taobao.weex.common.TypeModuleFactory.buildInstance(TypeModuleFactory.java:79)  
        at com.taobao.weex.bridge.WXModuleManager.findModule(WXModuleManager.java:284)  
        at com.taobao.weex.bridge.WXModuleManager.callModuleMethod(WXModuleManager.java:213)  
        at com.taobao.weex.bridge.WXBridgeManager.callModuleMethod(WXBridgeManager.java:518)  
        at com.taobao.weex.bridge.WXBridgeManager.callNativeModule(WXBridgeManager.java:700)  
        at com.taobao.weex.bridge.WXBridge.callNativeModule(WXBridge.java:371)  
        at com.taobao.weex.base.SystemMessageHandler.nativeRunWork(Native Method)  
        at com.taobao.weex.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:104)  
        at android.os.Handler.dispatchMessage(Handler.java:106)  
        at android.os.Looper.loop(Looper.java:173)  
        at android.os.HandlerThread.run(HandlerThread.java:65)

看提示以为是继承出了问题
但是修改为继承:com.taobao.weex.common.WXModule 还是 com.taobao.weex.WXSDKEngine.DestroyableModule 都还仍然报这个错

折腾了几个小时后,仔细对比,发现和以前自己开发的插件 只有一个差别:
以前的Module建的Class ide自动使用了public修饰
升级到了Andoroid Studio 4.0后,ide默认没有public修饰Class
遂用public 修饰 Class之后,一切调用运行正常
很隐蔽的一个小坑,记录一下

收起阅读 »

云账户:个人开发者提现说明

提现 广告联盟 插件市场 云账户

现在插件市场和广告联盟面向个人开发者提供新的提现选项了——云账户(天津)。

云账户介绍

云账户综合服务平台为全国共享经济平台企业和个体经营者提供共享经济综合服务。

1、通过云账户收款完全合法,是按经营所得缴个税后的合法收入,有完税证明,这部分收入是经营所得,无需和工资薪金所得等综合所得进行汇算清缴,个人税赋降低。法律依据:小规模纳税人税收优惠政策。

2、通过云账户收款DCloud将不再代扣代缴劳务个人所得税,而是由云账户代缴1%的税费、并由云账户收取6.1%的服务费(服务费由云账户收取,DCloud 不收取任何费用)后的金额是开发者的实际收入。

如何通过云账户收款

DCloud 已开通线上启用云账户的功能,通过下面页面补充财务信息后会自动启用云账户,选择以下任意一种方式即可

智能节税方案

DCloud在处理个人开发者提现申请时,会根据账单金额自动选择税费最优的打款方式。根据目前的个人劳务所得税计算方法,当月收入低于1200元时,使用银行打款税费最低,超过1200元时使用云账户收款税费更低。

如何开通云账户

当开发者的提现申请满足云账户打款条件时,DCloud会向云账户发起付款申请,如果开发者尚未开通云账户,此时会收到云账户的服务开通短信,开发者按照短信提示开通相关服务即可。使用云账户收款时,开发者需要在云账户 APP 进行线上签约、注册。开发者可以在“应用宝”中搜索“云账户”进行下载安装,或者当使用云账户收款时,云账户会通过短信方式,将下载链接发送到开发者手机号。

使用方法:下载云账户APP,选择线上签约--线上注册--获得收入。如有相关问题,可发送邮件到market@dcloud.io进行咨询。

注意:请务必保证在开发者中心绑定的手机号是有效的手机号,并请留意该手机的短信。以免遗漏短信影响您的收款。

其他问题

Q: 云账户是什么公司的?可靠吗?
A: 云账户是天津的公司,网址:https://www.yunzhanghu.com/,是业内普通使用的兼职服务平台,比如很多直播App的主播打赏,都是通过云账户支付。

Q: 云账户开通个体工商户,影响上班的薪资个税吗?
A: 个体工商户申报的是生产经营所得,和个税没关系

继续阅读 »

现在插件市场和广告联盟面向个人开发者提供新的提现选项了——云账户(天津)。

云账户介绍

云账户综合服务平台为全国共享经济平台企业和个体经营者提供共享经济综合服务。

1、通过云账户收款完全合法,是按经营所得缴个税后的合法收入,有完税证明,这部分收入是经营所得,无需和工资薪金所得等综合所得进行汇算清缴,个人税赋降低。法律依据:小规模纳税人税收优惠政策。

2、通过云账户收款DCloud将不再代扣代缴劳务个人所得税,而是由云账户代缴1%的税费、并由云账户收取6.1%的服务费(服务费由云账户收取,DCloud 不收取任何费用)后的金额是开发者的实际收入。

如何通过云账户收款

DCloud 已开通线上启用云账户的功能,通过下面页面补充财务信息后会自动启用云账户,选择以下任意一种方式即可

智能节税方案

DCloud在处理个人开发者提现申请时,会根据账单金额自动选择税费最优的打款方式。根据目前的个人劳务所得税计算方法,当月收入低于1200元时,使用银行打款税费最低,超过1200元时使用云账户收款税费更低。

如何开通云账户

当开发者的提现申请满足云账户打款条件时,DCloud会向云账户发起付款申请,如果开发者尚未开通云账户,此时会收到云账户的服务开通短信,开发者按照短信提示开通相关服务即可。使用云账户收款时,开发者需要在云账户 APP 进行线上签约、注册。开发者可以在“应用宝”中搜索“云账户”进行下载安装,或者当使用云账户收款时,云账户会通过短信方式,将下载链接发送到开发者手机号。

使用方法:下载云账户APP,选择线上签约--线上注册--获得收入。如有相关问题,可发送邮件到market@dcloud.io进行咨询。

注意:请务必保证在开发者中心绑定的手机号是有效的手机号,并请留意该手机的短信。以免遗漏短信影响您的收款。

其他问题

Q: 云账户是什么公司的?可靠吗?
A: 云账户是天津的公司,网址:https://www.yunzhanghu.com/,是业内普通使用的兼职服务平台,比如很多直播App的主播打赏,都是通过云账户支付。

Q: 云账户开通个体工商户,影响上班的薪资个税吗?
A: 个体工商户申报的是生产经营所得,和个税没关系

收起阅读 »

动态修改app应用图标

要求:5+SDK离线打包方式。 iOS 10.3及以上。
思路:在5+SDK离线工程中新增应用图标,在工程info.plist文件新增图标内容,新增一个原生页面(ViewControllers),在原生页面中写修改应用图标代码(步骤3),在js中通过跳转原生页面来修改应用图标,跳转原生页面代码(步骤4)。
安卓的思路也大致一样,通过跳转原生页面来操作应用图标修改。

  1. 配置icons,在工程中新增一个icons应用图标文件,并添加要更改的icon。(可添加多个尺寸和多种类型的icon)

  2. 配置info.plist

  1. 通过代码触发事件来修改应用图标。

    
    - (void)changeAppIconWithName:(NSString *)iconName {  
    if (![[UIApplication sharedApplication] supportsAlternateIcons]) {  
        return;  
    }  
    
    if ([iconName isEqualToString:@""]) {  
        iconName = nil;  
    }  
    [[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {  
        if (error) {  
            NSLog(@"更换app图标发生错误了 : %@",error);  
        }  
    }];  
    }  
    [self changeAppIconWithName:@"rain"];  


4.  js跳转原生页面  
/*  
  //ViewControllers为要跳转的原生页面  
            var newVCobj = plus.ios.newObject("ViewControllers");  
            var UIApplicationClass = plus.ios.importClass("UIApplication");  
            var UIAppObj = UIApplicationClass.sharedApplication();  
            var del = plus.ios.invoke(UIAppObj,"delegate");  
            var appWindowObj = plus.ios.invoke(del,"window");  
            var appRootController = plus.ios.invoke(appWindowObj,"rootViewController");  

            //从底部向上弹出方式跳转。  
            plus.ios.invoke(appRootController,"presentViewController:animated:completion:",newVCobj,"YES",null);  

            //带有原生导航的跳转方式,跳转动画为从右到左滑入。  
//          plus.ios.invoke(appRootController,"pushViewController:animated:",newVCobj,"YES");  

//如需传值  
//js注册通知进行js与oc传值  defaultsName为通知名, 1234为需要传的值,  原生实现通知方法进行值接收。  
            SetUserDefault("defaultsName", "1234");  

//注册通知进行js传值到oc界面  
        function SetUserDefault(key, value)    
        {    
            if (typeof value != 'undefined' && typeof key === "string")    
            {    
                var UserDefaultsClass = plus.ios.importClass("NSUserDefaults");    
                var standardUserDefaults = UserDefaultsClass.standardUserDefaults();    
                plus.ios.invoke(standardUserDefaults, "setObject:forKey:", value, key);    
                plus.ios.invoke(standardUserDefaults,"synchronize");    
            }    
        }   

//oc页面实现通知接收传值方法  
NSUserDefaults* pDefDefaults = [NSUserDefaults standardUserDefaults];  
    if (pDefDefaults) {  
        NSString* pString =  [pDefDefaults objectForKey:@"defaultsName"];  
        NSLog(@"这里是js通知所传的值:%@",pString);  
    }  

返过来,oc要给js传值也可以通过发送通知进行传值。  

*/  

demo:下方  
继续阅读 »

要求:5+SDK离线打包方式。 iOS 10.3及以上。
思路:在5+SDK离线工程中新增应用图标,在工程info.plist文件新增图标内容,新增一个原生页面(ViewControllers),在原生页面中写修改应用图标代码(步骤3),在js中通过跳转原生页面来修改应用图标,跳转原生页面代码(步骤4)。
安卓的思路也大致一样,通过跳转原生页面来操作应用图标修改。

  1. 配置icons,在工程中新增一个icons应用图标文件,并添加要更改的icon。(可添加多个尺寸和多种类型的icon)

  2. 配置info.plist

  1. 通过代码触发事件来修改应用图标。

    
    - (void)changeAppIconWithName:(NSString *)iconName {  
    if (![[UIApplication sharedApplication] supportsAlternateIcons]) {  
        return;  
    }  
    
    if ([iconName isEqualToString:@""]) {  
        iconName = nil;  
    }  
    [[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {  
        if (error) {  
            NSLog(@"更换app图标发生错误了 : %@",error);  
        }  
    }];  
    }  
    [self changeAppIconWithName:@"rain"];  


4.  js跳转原生页面  
/*  
  //ViewControllers为要跳转的原生页面  
            var newVCobj = plus.ios.newObject("ViewControllers");  
            var UIApplicationClass = plus.ios.importClass("UIApplication");  
            var UIAppObj = UIApplicationClass.sharedApplication();  
            var del = plus.ios.invoke(UIAppObj,"delegate");  
            var appWindowObj = plus.ios.invoke(del,"window");  
            var appRootController = plus.ios.invoke(appWindowObj,"rootViewController");  

            //从底部向上弹出方式跳转。  
            plus.ios.invoke(appRootController,"presentViewController:animated:completion:",newVCobj,"YES",null);  

            //带有原生导航的跳转方式,跳转动画为从右到左滑入。  
//          plus.ios.invoke(appRootController,"pushViewController:animated:",newVCobj,"YES");  

//如需传值  
//js注册通知进行js与oc传值  defaultsName为通知名, 1234为需要传的值,  原生实现通知方法进行值接收。  
            SetUserDefault("defaultsName", "1234");  

//注册通知进行js传值到oc界面  
        function SetUserDefault(key, value)    
        {    
            if (typeof value != 'undefined' && typeof key === "string")    
            {    
                var UserDefaultsClass = plus.ios.importClass("NSUserDefaults");    
                var standardUserDefaults = UserDefaultsClass.standardUserDefaults();    
                plus.ios.invoke(standardUserDefaults, "setObject:forKey:", value, key);    
                plus.ios.invoke(standardUserDefaults,"synchronize");    
            }    
        }   

//oc页面实现通知接收传值方法  
NSUserDefaults* pDefDefaults = [NSUserDefaults standardUserDefaults];  
    if (pDefDefaults) {  
        NSString* pString =  [pDefDefaults objectForKey:@"defaultsName"];  
        NSLog(@"这里是js通知所传的值:%@",pString);  
    }  

返过来,oc要给js传值也可以通过发送通知进行传值。  

*/  

demo:下方  
收起阅读 »

uni-app使用心得

百度地图

我要吐槽一下。
我接触uni-app是朋友介绍的,去年合伙做了一个项目,我负责app端,朋友说这样开发太费事,就说起了Dcloud.
说实话uni-app开发起来很方便,尤其是对于我这种非科班出身,擅长哪种语言完全取决于项目。
这几天做了个小项目,单纯一个地图操作app,客户要求用百度地图的接口,我也擅长用百度地图。
最后用了map组件,开发很方便,一两天做出来很轻松,最后最后最后发现map只支持gcj02坐标系,百度的坐标是BD09,最后只能找插件转换,转换完成后偏差太大,别说客户接受不了,我这边也没法给客户解释,所以在艰难的考虑后放弃dcloud,转为原生的,想想苹果就头疼。

如果我说的哪个地方不对,希望大家批评,最好能解决我上面说的问题。谢谢

继续阅读 »

我要吐槽一下。
我接触uni-app是朋友介绍的,去年合伙做了一个项目,我负责app端,朋友说这样开发太费事,就说起了Dcloud.
说实话uni-app开发起来很方便,尤其是对于我这种非科班出身,擅长哪种语言完全取决于项目。
这几天做了个小项目,单纯一个地图操作app,客户要求用百度地图的接口,我也擅长用百度地图。
最后用了map组件,开发很方便,一两天做出来很轻松,最后最后最后发现map只支持gcj02坐标系,百度的坐标是BD09,最后只能找插件转换,转换完成后偏差太大,别说客户接受不了,我这边也没法给客户解释,所以在艰难的考虑后放弃dcloud,转为原生的,想想苹果就头疼。

如果我说的哪个地方不对,希望大家批评,最好能解决我上面说的问题。谢谢

收起阅读 »

发布微信小程序失败.

uniapp

麻烦各位大神帮忙看看这个要怎么解决

麻烦各位大神帮忙看看这个要怎么解决