HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

美团饿了么外卖CPS小程序 外卖分销小程序

外卖分销小程序,自定义用户级别,自定义分佣比例!
今年最赚钱的小程序!

我们都知道,目前两家巨头饿了么和美团点外卖都可以获得返现,其中饿了么是返利6%,美团是返利3-5%,具体要根据活动来。

也就是说按正常一个人用户点餐,你可以获得每笔外卖的CPS返利佣金,而且外卖的用户粘性极高,已经成了很多淘客的首选。
从核心功能方面来说,主要还是实现自动跟单返利,获得CPS交易佣金、自定义用户等级和分佣比例,自定义用户的升级条件,引导用户完成自购和分享。这样的公众号和小程序渠道,在微信生态下是非常好的裂变,可以迅速获得用户群做社群运营。
喜欢的找我 q 691618012
看下小程序页面:




继续阅读 »

外卖分销小程序,自定义用户级别,自定义分佣比例!
今年最赚钱的小程序!

我们都知道,目前两家巨头饿了么和美团点外卖都可以获得返现,其中饿了么是返利6%,美团是返利3-5%,具体要根据活动来。

也就是说按正常一个人用户点餐,你可以获得每笔外卖的CPS返利佣金,而且外卖的用户粘性极高,已经成了很多淘客的首选。
从核心功能方面来说,主要还是实现自动跟单返利,获得CPS交易佣金、自定义用户等级和分佣比例,自定义用户的升级条件,引导用户完成自购和分享。这样的公众号和小程序渠道,在微信生态下是非常好的裂变,可以迅速获得用户群做社群运营。
喜欢的找我 q 691618012
看下小程序页面:




收起阅读 »

千万不要买QQ号为:392716797的源码,这个人就是个骗子

上传者:作者: 392716797@qq.com
湖南邵阳人肖敏 QQ昵称:永不言败☞澎湃小伙

在本社区上传有 : 微信支付(原生小程序),抽签小程序(原生小程序),小红书(原生小程序),美团外卖(原生小程序),外卖优惠券(原生小程序),消费优惠券汇总(原生小程序),美团微信登录。

该作者抓取别人小程序源码放在上面,要么是挂羊头卖狗肉,发一个垃圾源码给你,要么是中途让你各种加钱,反正各种坑

继续阅读 »

上传者:作者: 392716797@qq.com
湖南邵阳人肖敏 QQ昵称:永不言败☞澎湃小伙

在本社区上传有 : 微信支付(原生小程序),抽签小程序(原生小程序),小红书(原生小程序),美团外卖(原生小程序),外卖优惠券(原生小程序),消费优惠券汇总(原生小程序),美团微信登录。

该作者抓取别人小程序源码放在上面,要么是挂羊头卖狗肉,发一个垃圾源码给你,要么是中途让你各种加钱,反正各种坑

收起阅读 »

uniapp跳转第三方应用后, 粘贴板设置的内容丢失

bug反馈 uniapp
// 第一步  
uni.setClipboardData({  
    data: this.info[key]['value'],  
})  
// 第二步  
plus.runtime.openURL(this.info[key].value, (res) => {  
    console.log(res)  
    uni.showToast({  
        title: '打开失败',  
        icon: 'none'  
    })  
})

代码如上图,
第一步复制成功, 在第三方应用内粘贴, 粘贴不了内容
如果只执行第一步, 然后手动打开应用,去粘贴. 则有内容

继续阅读 »
// 第一步  
uni.setClipboardData({  
    data: this.info[key]['value'],  
})  
// 第二步  
plus.runtime.openURL(this.info[key].value, (res) => {  
    console.log(res)  
    uni.showToast({  
        title: '打开失败',  
        icon: 'none'  
    })  
})

代码如上图,
第一步复制成功, 在第三方应用内粘贴, 粘贴不了内容
如果只执行第一步, 然后手动打开应用,去粘贴. 则有内容

收起阅读 »

uniapp map组件iOS APP nvue@updated @regionchange事件的触发机制

App 5+App开发 移动APP iOS nvue uniapp map 地图

MAP组件文档上确实对于@updated @regionchange在APP及APP-NVUE的支持情况没有写(也就是应该不支持),但实际其实是支持的,并且在安卓端支持得蛮好的,这里就不详细讨论安卓的部分了。

iOS那边就比较怪异了,目前测下来,这俩事件也确实都是可以触发的。
btw这边先提一句:安卓和iOS两边regionchange事件的参数是有略微差别的,安卓那边来获取拖拽起始和结束是这样:

onRegionChange(e) {  
    swich(e.type) {  
        case 'begin':  
            //处理起始事件  
        case 'end':  
            //处理结束事件  
    }  
}

而iOS这边是这样:

onRegionChange(e) {  
    swich(e.detail.type) {  
        case 'begin':  
            //处理起始事件  
        case 'end':  
            //处理结束事件  
    }  
}

扯回主要想讲的怪异行为,也就是这俩事件的触发条件在iOS端还挺特殊的

  1. 必须等@updated事件触发过之后,@regionchange事件才可以被触发,不然在地图上拖动完全不会触发@regionchange事件;也就是:一旦成功触发过@updated事件,@regionchange事件就可以完全正常监听了
  2. 然而奇怪的就是@updated事件并不是次次都能在刚进入页面加载完地图后就自动触发
    2.1. 目前的尝试1:在地图显示出来之后快速拖动地图使地图移动较远距离(慢慢拖动就完全没用,应该是快速移动到一片地图完全没有预载好的区块导致重新渲染)可以触发@updated
    2.2. 目前的尝试2:在地图显示出来之后缩放地图(大概是scale值发生了变化,慢慢缩放也可以,通过代码修改scale值也可以)也可以触发@updated
    2.3. 目前的尝试3:在地图显示出来之后通过代码改变地图中心到很远的地方并不能触发与2.1相同的结果(通过setTimeout延迟触发也不行,通过mapContext.moveToLocation和直接改变map组件的latitude和longitude都不行)

总结:要在iOS的nvue中完美使用map组件的@regionchange需要先成功触发@updated,可以参考以下代码:

<map :id="mapId" :latitude="latitude" :longitude="longitude" :scale="mapScale"  
            @regionchange="onMapRegionChange" @updated="onMapFinish" />  

data: function() {  
    return {  
        // 深圳的经纬度  
        latitude: 22.547,  
        longitude: 114.085947,  
        mapId: 'whatever',  
        mapScale: 17,  
    }  
},  
methods: {  

    onMapRegionChange: function(e) {  
        let type = '';  
        const { platform } = uni.getSystemInfoSync();  
        switch (platform) {  
            case 'android':  
                type = e.type;  
                break;  
            case 'ios':  
                type = e.detail.type;  
                break;  
        }  
        if (type === 'begin') {  
            // 处理拖拽开始时的逻辑  
        }  
        else if (type === 'end') {  
            // 处理拖拽结束时的逻辑  
        }  
    },  
    onMapFinish: function() {  
        console.log('现在可以开始监听@regionchange了');  
    },  
},  
onLoad: function() {  
    uni.showLoading();  
    uni.getLocation({  
        type: 'gcj02',  
        success: async (data) => {  
            uni.hideLoading();  
            console.log('getLocation', data);  
            this.mapScale = 18;  
            this.latitude = data.latitude;  
            this.longitude = data.longitude;  
        },  
        fail: (e) => {  
            uni.hideLoading();  
            console.log('getLocation fail', e);  
            this.mapScale = 18;  
        },  
    });  
}

P.S. 仅代表HBuilderX 3.0.5,iOS 14以上,其他情况也许会略有不同

继续阅读 »

MAP组件文档上确实对于@updated @regionchange在APP及APP-NVUE的支持情况没有写(也就是应该不支持),但实际其实是支持的,并且在安卓端支持得蛮好的,这里就不详细讨论安卓的部分了。

iOS那边就比较怪异了,目前测下来,这俩事件也确实都是可以触发的。
btw这边先提一句:安卓和iOS两边regionchange事件的参数是有略微差别的,安卓那边来获取拖拽起始和结束是这样:

onRegionChange(e) {  
    swich(e.type) {  
        case 'begin':  
            //处理起始事件  
        case 'end':  
            //处理结束事件  
    }  
}

而iOS这边是这样:

onRegionChange(e) {  
    swich(e.detail.type) {  
        case 'begin':  
            //处理起始事件  
        case 'end':  
            //处理结束事件  
    }  
}

扯回主要想讲的怪异行为,也就是这俩事件的触发条件在iOS端还挺特殊的

  1. 必须等@updated事件触发过之后,@regionchange事件才可以被触发,不然在地图上拖动完全不会触发@regionchange事件;也就是:一旦成功触发过@updated事件,@regionchange事件就可以完全正常监听了
  2. 然而奇怪的就是@updated事件并不是次次都能在刚进入页面加载完地图后就自动触发
    2.1. 目前的尝试1:在地图显示出来之后快速拖动地图使地图移动较远距离(慢慢拖动就完全没用,应该是快速移动到一片地图完全没有预载好的区块导致重新渲染)可以触发@updated
    2.2. 目前的尝试2:在地图显示出来之后缩放地图(大概是scale值发生了变化,慢慢缩放也可以,通过代码修改scale值也可以)也可以触发@updated
    2.3. 目前的尝试3:在地图显示出来之后通过代码改变地图中心到很远的地方并不能触发与2.1相同的结果(通过setTimeout延迟触发也不行,通过mapContext.moveToLocation和直接改变map组件的latitude和longitude都不行)

总结:要在iOS的nvue中完美使用map组件的@regionchange需要先成功触发@updated,可以参考以下代码:

<map :id="mapId" :latitude="latitude" :longitude="longitude" :scale="mapScale"  
            @regionchange="onMapRegionChange" @updated="onMapFinish" />  

data: function() {  
    return {  
        // 深圳的经纬度  
        latitude: 22.547,  
        longitude: 114.085947,  
        mapId: 'whatever',  
        mapScale: 17,  
    }  
},  
methods: {  

    onMapRegionChange: function(e) {  
        let type = '';  
        const { platform } = uni.getSystemInfoSync();  
        switch (platform) {  
            case 'android':  
                type = e.type;  
                break;  
            case 'ios':  
                type = e.detail.type;  
                break;  
        }  
        if (type === 'begin') {  
            // 处理拖拽开始时的逻辑  
        }  
        else if (type === 'end') {  
            // 处理拖拽结束时的逻辑  
        }  
    },  
    onMapFinish: function() {  
        console.log('现在可以开始监听@regionchange了');  
    },  
},  
onLoad: function() {  
    uni.showLoading();  
    uni.getLocation({  
        type: 'gcj02',  
        success: async (data) => {  
            uni.hideLoading();  
            console.log('getLocation', data);  
            this.mapScale = 18;  
            this.latitude = data.latitude;  
            this.longitude = data.longitude;  
        },  
        fail: (e) => {  
            uni.hideLoading();  
            console.log('getLocation fail', e);  
            this.mapScale = 18;  
        },  
    });  
}

P.S. 仅代表HBuilderX 3.0.5,iOS 14以上,其他情况也许会略有不同

收起阅读 »

uniapp对接网易七鱼客服

uniapp插件

网易七鱼客服发布免费插件链接 https://ext.dcloud.net.cn/plugin?id=3818
对接过程中有问题可私信!

网易七鱼客服发布免费插件链接 https://ext.dcloud.net.cn/plugin?id=3818
对接过程中有问题可私信!

在 uniapp 中使用 tailwindcss

uniapp

崮生的 uni-app 最佳实践

代码仓库

tailwindcss

! 值得注意的是微信小程序并不支持一些 CSS 选择器还有他的 wxss 不支持 \ 所以如果直接使用 tailwindcss 会报错类似于图中这样的错 :image.png

  • 幸运的是 tailwindcss 支持自定义 separator
  • 但是在类名中包含 . 的又需要 \. 这样的形式去声明类名而且貌似没有办法自定义这个, 所以在这种情况下我复制了 'tailwindcss/defaultConfig' 中的配置将 \ 全部改成了 _
  • image.png这种语法 wxss 也不支持.... 这里不是 CSS 类名修改可以避免的,就只能去corePlugins禁用相关的插件
    • 禁用了 space divideWidth divideStyle divideOpacity
  • CSS 的类名是允许以数字开头的,但需要进行转义,而 screens 配置中有一个 2xl 这个 key 会在类名的最前面出现,于是 tailwind 转义为 \32xl 这里就又有了 \ 所以这里也需要 改一下
  • 本 demo 对 tailwind 进行了如上定制,所以在使用的时候需要注意这些点

效果

image.png

image.png

image.png

相关 commit 记录


by 崮生 from 崮生 • 一些随笔,欢迎 赞助本文
本文欢迎分享与聚合,全文转载未经授权( 联系我)不许可。

神仙散棒槌

继续阅读 »

崮生的 uni-app 最佳实践

代码仓库

tailwindcss

! 值得注意的是微信小程序并不支持一些 CSS 选择器还有他的 wxss 不支持 \ 所以如果直接使用 tailwindcss 会报错类似于图中这样的错 :image.png

  • 幸运的是 tailwindcss 支持自定义 separator
  • 但是在类名中包含 . 的又需要 \. 这样的形式去声明类名而且貌似没有办法自定义这个, 所以在这种情况下我复制了 'tailwindcss/defaultConfig' 中的配置将 \ 全部改成了 _
  • image.png这种语法 wxss 也不支持.... 这里不是 CSS 类名修改可以避免的,就只能去corePlugins禁用相关的插件
    • 禁用了 space divideWidth divideStyle divideOpacity
  • CSS 的类名是允许以数字开头的,但需要进行转义,而 screens 配置中有一个 2xl 这个 key 会在类名的最前面出现,于是 tailwind 转义为 \32xl 这里就又有了 \ 所以这里也需要 改一下
  • 本 demo 对 tailwind 进行了如上定制,所以在使用的时候需要注意这些点

效果

image.png

image.png

image.png

相关 commit 记录


by 崮生 from 崮生 • 一些随笔,欢迎 赞助本文
本文欢迎分享与聚合,全文转载未经授权( 联系我)不许可。

神仙散棒槌

收起阅读 »

在线接单, 5k优惠1k,1w优惠2k,2w优惠4k,以此类推,承接H5、小程序、、PC端网站、后台系统、UI等外包

Vue JavaScript 外包 uniapp

年前下单,年后开工,享受满减优惠,
5k-1k,1w-2k,2w-4k,以此类推,

承接UI、H5、小程序、、PC端网站、后台系统等产品

vx:web9688

微信

继续阅读 »

年前下单,年后开工,享受满减优惠,
5k-1k,1w-2k,2w-4k,以此类推,

承接UI、H5、小程序、、PC端网站、后台系统等产品

vx:web9688

微信

收起阅读 »

html5+ Push遇到的问题

Push

最近公司有一个push的需求,于是开始研究如何着手push。
UniPush开通指南 - DCloud问答 https://ask.dcloud.net.cn/article/35716
UniPush使用指南 - DCloud问答 https://ask.dcloud.net.cn/article/35622
Unipush常见问题 - DCloud问答 https://ask.dcloud.net.cn/article/36611
Push推送开发指南 - DCloud问答 https://ask.dcloud.net.cn/article/34
android离线打包指南-https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/push?id=unipush
我的项目是html5+用android离线打包。
unipush是结合各大第三方推送的推送插件,所以只需要看android离线打包指南中的unipush或个推即可,切记不要看个推官网api,我就踩坑了。
我的android离线打包SDK因为是19年年初下载的,所以没有unipush推送包,需要从新的android离线SDK中复制一个aps-unipush-release.aar
并且按照指示配置相关配置。如果你遇到的情况是:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.tomorrow.vs-8D5K3eSp_JmeMn1E4-jzdA==/base.apk"],nativeLibraryDirectories=[/data/app/com.tomorrow.vs-8D5K3eSp_JmeMn1E4-jzdA==/lib/arm64, /data/app/com.tomorrow.vs-8D5K3eSp_JmeMn1E4-jzdA==/base.apk!/lib/arm64-v8a, /system/lib64, /product/lib64]]] couldn't find "libmsec.so"
那就需要在build.gradle中加上
android {
ndk {
// 设置支持的SO库架构
abiFilters 'x86','armeabi-v7a'
}
}
}
tips:
1.尝试使用个推官网api配置,踩坑!

  1. 尝试使用unipush,从新版android离线SDK复制unipush包,包冲突,需要删除其他推送包,只保留2个即可。编译通过,打开app失败,上文错误,踩坑。
  2. 尝试使用html5+的个推,按照文档配置后cid获取不到,踩坑!
  3. 后续遇到任何问题,我还会继续补充。
继续阅读 »

最近公司有一个push的需求,于是开始研究如何着手push。
UniPush开通指南 - DCloud问答 https://ask.dcloud.net.cn/article/35716
UniPush使用指南 - DCloud问答 https://ask.dcloud.net.cn/article/35622
Unipush常见问题 - DCloud问答 https://ask.dcloud.net.cn/article/36611
Push推送开发指南 - DCloud问答 https://ask.dcloud.net.cn/article/34
android离线打包指南-https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/push?id=unipush
我的项目是html5+用android离线打包。
unipush是结合各大第三方推送的推送插件,所以只需要看android离线打包指南中的unipush或个推即可,切记不要看个推官网api,我就踩坑了。
我的android离线打包SDK因为是19年年初下载的,所以没有unipush推送包,需要从新的android离线SDK中复制一个aps-unipush-release.aar
并且按照指示配置相关配置。如果你遇到的情况是:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.tomorrow.vs-8D5K3eSp_JmeMn1E4-jzdA==/base.apk"],nativeLibraryDirectories=[/data/app/com.tomorrow.vs-8D5K3eSp_JmeMn1E4-jzdA==/lib/arm64, /data/app/com.tomorrow.vs-8D5K3eSp_JmeMn1E4-jzdA==/base.apk!/lib/arm64-v8a, /system/lib64, /product/lib64]]] couldn't find "libmsec.so"
那就需要在build.gradle中加上
android {
ndk {
// 设置支持的SO库架构
abiFilters 'x86','armeabi-v7a'
}
}
}
tips:
1.尝试使用个推官网api配置,踩坑!

  1. 尝试使用unipush,从新版android离线SDK复制unipush包,包冲突,需要删除其他推送包,只保留2个即可。编译通过,打开app失败,上文错误,踩坑。
  2. 尝试使用html5+的个推,按照文档配置后cid获取不到,踩坑!
  3. 后续遇到任何问题,我还会继续补充。
收起阅读 »

unipush 常见问题总结

unipush

Q: uni-app 标准基座调试时,可以收到推送消息,打包之后收不到

A:
uni-app 标准基座使用的是 HBuilder基座的应用信息
打包使用的是 开发者自己的应用信息。

开发者需要开通按照手册开通 unipush功能,以及相关厂商配置

Q:uni-app 自定义基座调试时,可以收到推送消息,打包之后收不到

A:
自定义基座的应用信息,与打包应用信息是一致的。
如果自定义基座可以收到消息,打包之后无法收到。 大概率是打包过程中的 包名/签名配置错误导致。

继续阅读 »

Q: uni-app 标准基座调试时,可以收到推送消息,打包之后收不到

A:
uni-app 标准基座使用的是 HBuilder基座的应用信息
打包使用的是 开发者自己的应用信息。

开发者需要开通按照手册开通 unipush功能,以及相关厂商配置

Q:uni-app 自定义基座调试时,可以收到推送消息,打包之后收不到

A:
自定义基座的应用信息,与打包应用信息是一致的。
如果自定义基座可以收到消息,打包之后无法收到。 大概率是打包过程中的 包名/签名配置错误导致。

收起阅读 »

iPhone ios14.3基座不运行解决方法

uniapp

环境:
电脑系统win10,手机ios14.3

  解决办法:使用管理员权限运行HBuilder

环境:
电脑系统win10,手机ios14.3

  解决办法:使用管理员权限运行HBuilder

uni-app设置缓存时间 指定缓存时间过期自动移除

缓存
let cacheMap =  new Map()  
let timeoutDefault = 86400 // 设置默认超时时间,单位秒 3600*24  

function isTimeout (name) {  
  const data = cacheMap.get(name)  
  if (!data) return true  
  if (data.timeout === 0) return false   
  const currentTime = Date.now()  
  const overTime = (currentTime - data.createTime) / 1000  
  if (overTime > data.timeout) {  
    cacheMap.delete(name)  
    if (name.startsWith('_')) {  
      try {  
        uni.removeStorageSync(name)  
      } catch (e) {  
        console.log(e)  
      }  
    }  
    return true  
  }  
  return false  
}  

class CacheCell {  
  constructor (data, timeout) {  
    this.data = data  
    this.timeout = timeout // 设置超时时间,单位秒  
    this.createTime = Date.now() // 对象创建时候的时间  
  }  
}  

class MinCache {  
  constructor (timeout) {  
    try {  
      const res = uni.getStorageInfoSync()  
      res.keys.forEach(name => {  
        try {  
          const value = uni.getStorageSync(name)  
          cacheMap.set(name, value)  
        } catch (e) {  
          console.log(e)  
        }  
      })  
    } catch (e) {  
      console.log(e)  
    }  
    timeoutDefault = timeout  
  }  

  /**  
   * 设置缓存数据  
   * @param {Any} name 缓存的key, 以下划线命名表示永久缓存到Storage  
   * @param {Any} data 缓存的数据  
   * @param {Number} timeout 缓存时间(秒),默认86400秒即一天,0表示永久缓存  
   */  
  set (name, data, timeout = timeoutDefault) {  
    const cachecell = new CacheCell(data, timeout)  
    let cache = null  
    if (name.startsWith('_')) {  
      try {  
        uni.setStorageSync(name, cachecell)  
        cache = cacheMap.set(name, cachecell)  
      } catch (e) {  
        console.log(e)  
      }  
    } else {  
      cache = cacheMap.set(name, cachecell)  
    }  
    return cache  
  }  
  get (name) {  
    return isTimeout(name) ? null : cacheMap.get(name).data  
  }  
  delete (name) {  
    let value = false  
    if (name.startsWith('_')) {  
      try {  
        uni.removeStorageSync(name)  
        value = cacheMap.delete(name)  
      } catch (e) {  
        console.log(e)  
      }  
    } else {  
      value = cacheMap.delete(name)  
    }  
    return value  
  }  
  has (name) {  
    return !isTimeout(name)  
  }  
  clear () {  
    let value = false  
    try {  
      uni.clearStorageSync()  
      cacheMap.clear()  
      value = true  
    } catch (e) {  
      console.log(e)  
    }  
    return value  
  }  
}  

MinCache.install = function (Vue, {timeout = 86400} = {}) {  
  Vue.prototype.$cache = new MinCache(timeout)  
}  

export default MinCache
// 注册缓存器  
Vue.use(MinCache)

使用方法
this.$cache.set('name', '值')

原文链接
https://juejin.cn/post/6844903870448009223

继续阅读 »
let cacheMap =  new Map()  
let timeoutDefault = 86400 // 设置默认超时时间,单位秒 3600*24  

function isTimeout (name) {  
  const data = cacheMap.get(name)  
  if (!data) return true  
  if (data.timeout === 0) return false   
  const currentTime = Date.now()  
  const overTime = (currentTime - data.createTime) / 1000  
  if (overTime > data.timeout) {  
    cacheMap.delete(name)  
    if (name.startsWith('_')) {  
      try {  
        uni.removeStorageSync(name)  
      } catch (e) {  
        console.log(e)  
      }  
    }  
    return true  
  }  
  return false  
}  

class CacheCell {  
  constructor (data, timeout) {  
    this.data = data  
    this.timeout = timeout // 设置超时时间,单位秒  
    this.createTime = Date.now() // 对象创建时候的时间  
  }  
}  

class MinCache {  
  constructor (timeout) {  
    try {  
      const res = uni.getStorageInfoSync()  
      res.keys.forEach(name => {  
        try {  
          const value = uni.getStorageSync(name)  
          cacheMap.set(name, value)  
        } catch (e) {  
          console.log(e)  
        }  
      })  
    } catch (e) {  
      console.log(e)  
    }  
    timeoutDefault = timeout  
  }  

  /**  
   * 设置缓存数据  
   * @param {Any} name 缓存的key, 以下划线命名表示永久缓存到Storage  
   * @param {Any} data 缓存的数据  
   * @param {Number} timeout 缓存时间(秒),默认86400秒即一天,0表示永久缓存  
   */  
  set (name, data, timeout = timeoutDefault) {  
    const cachecell = new CacheCell(data, timeout)  
    let cache = null  
    if (name.startsWith('_')) {  
      try {  
        uni.setStorageSync(name, cachecell)  
        cache = cacheMap.set(name, cachecell)  
      } catch (e) {  
        console.log(e)  
      }  
    } else {  
      cache = cacheMap.set(name, cachecell)  
    }  
    return cache  
  }  
  get (name) {  
    return isTimeout(name) ? null : cacheMap.get(name).data  
  }  
  delete (name) {  
    let value = false  
    if (name.startsWith('_')) {  
      try {  
        uni.removeStorageSync(name)  
        value = cacheMap.delete(name)  
      } catch (e) {  
        console.log(e)  
      }  
    } else {  
      value = cacheMap.delete(name)  
    }  
    return value  
  }  
  has (name) {  
    return !isTimeout(name)  
  }  
  clear () {  
    let value = false  
    try {  
      uni.clearStorageSync()  
      cacheMap.clear()  
      value = true  
    } catch (e) {  
      console.log(e)  
    }  
    return value  
  }  
}  

MinCache.install = function (Vue, {timeout = 86400} = {}) {  
  Vue.prototype.$cache = new MinCache(timeout)  
}  

export default MinCache
// 注册缓存器  
Vue.use(MinCache)

使用方法
this.$cache.set('name', '值')

原文链接
https://juejin.cn/post/6844903870448009223

收起阅读 »

uni-app开发iOS App上架App Store详细教程

Appstore上传 上架 iOS打包 Appstore

1、申请苹果开发者账号(点此查看苹果开发者账号申请教程

2、使用官方Hbuilder X打包出iOS App,建议勾选上代码原生混淆

3、使用官方工具,application loader上传IPA包至App Store构建,需要application loader安装包的,可以联系我:

QQ:1481983952,专业App代上架

4、填写iOS App资料,比如,logo,预览图,描述,关键词,定价,隐私政策,等等

5、提交审核,审核一般情况是当天晚上审核,凌晨出结果,审核团队在美国,时差不一样

6、如果被拒,根据苹果团队返回的guideline,可以制定修改计划

7、对于那些业务模式本身有问题的,比如金融App、游戏租号App、色情App等App Store不允许存在的App,建议使用马甲上架,uni-app制作马甲还是挺简单的,分为过审

面和提审面

8、如果对于uni-app上架苹果商店审核有任何疑问的,或者审核被拒的,需要特殊渠道上架的,可以联系我:

QQ:1481983952,专业App代上架

QQ:1481983952,专业App代上架

继续阅读 »

1、申请苹果开发者账号(点此查看苹果开发者账号申请教程

2、使用官方Hbuilder X打包出iOS App,建议勾选上代码原生混淆

3、使用官方工具,application loader上传IPA包至App Store构建,需要application loader安装包的,可以联系我:

QQ:1481983952,专业App代上架

4、填写iOS App资料,比如,logo,预览图,描述,关键词,定价,隐私政策,等等

5、提交审核,审核一般情况是当天晚上审核,凌晨出结果,审核团队在美国,时差不一样

6、如果被拒,根据苹果团队返回的guideline,可以制定修改计划

7、对于那些业务模式本身有问题的,比如金融App、游戏租号App、色情App等App Store不允许存在的App,建议使用马甲上架,uni-app制作马甲还是挺简单的,分为过审

面和提审面

8、如果对于uni-app上架苹果商店审核有任何疑问的,或者审核被拒的,需要特殊渠道上架的,可以联系我:

QQ:1481983952,专业App代上架

QQ:1481983952,专业App代上架

收起阅读 »