HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

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代上架

收起阅读 »

真是可惜呀:DCloud开发者开放平台仅支持企业实名认证

真是可惜呀:DCloud开发者开放平台仅支持企业实名认证呢!

真是可惜呀:DCloud开发者开放平台仅支持企业实名认证呢!

使用openLocation,iOS端APP高德地图白屏的解决方法(离线打包)

空白 高德地图

搜到了这个问题https://ask.dcloud.net.cn/question/113870,发现跟他的情况一样,特来分享一下。

我是用IOS离线真机调试的,Xcode下报错。
[JS Framework] 当前运行的基座不包含原生插件[mapSearch],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座

我就纳闷了,明明只用了一个openLocation,不涉及nvue啊。
于是,使用官方的云打包试了一下,发现没有问题。

怀疑是基座问题,用了hello-uniapp-master测试了一下openLocation,发现也有这个问题。
没办法,只有一步一步排查。

我一想,安卓下没这个问题,但是IOS下,缺调用了mapSearch。
我尝试把高德地图nvue的几个类库放进去,主要是多了libDCUniMap.a、libDCUniAmap.a

这时,奇迹般地发现报错改了。
[NetworkInfo] Could not successfully update network info for descriptor
网络没权限?百度了一下,把debug改成了false。

继续测试,又报一个错误,也看不懂,但是看了一下Xcode的报错,发现调用了百度地图,DCMap
我在想,明明只引用了一个高德地图,怎么会去调百度呢。

这时看了一下类库,有一个libDCUniBmap.a,搜了一下,竟然搜不到,看名字像百度的,果断删除。
最后把plist里面,LSApplicationQueriesSchemes里面跟baidu有关的都删除。

最后,IOS下地图显示出来了。

综上,发现bug的源泉,在于IOS下面使用高德地图,必须引用nvue那几个类库。

还有问题的话,可以加我QQ:13040交流~~

继续阅读 »

搜到了这个问题https://ask.dcloud.net.cn/question/113870,发现跟他的情况一样,特来分享一下。

我是用IOS离线真机调试的,Xcode下报错。
[JS Framework] 当前运行的基座不包含原生插件[mapSearch],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座

我就纳闷了,明明只用了一个openLocation,不涉及nvue啊。
于是,使用官方的云打包试了一下,发现没有问题。

怀疑是基座问题,用了hello-uniapp-master测试了一下openLocation,发现也有这个问题。
没办法,只有一步一步排查。

我一想,安卓下没这个问题,但是IOS下,缺调用了mapSearch。
我尝试把高德地图nvue的几个类库放进去,主要是多了libDCUniMap.a、libDCUniAmap.a

这时,奇迹般地发现报错改了。
[NetworkInfo] Could not successfully update network info for descriptor
网络没权限?百度了一下,把debug改成了false。

继续测试,又报一个错误,也看不懂,但是看了一下Xcode的报错,发现调用了百度地图,DCMap
我在想,明明只引用了一个高德地图,怎么会去调百度呢。

这时看了一下类库,有一个libDCUniBmap.a,搜了一下,竟然搜不到,看名字像百度的,果断删除。
最后把plist里面,LSApplicationQueriesSchemes里面跟baidu有关的都删除。

最后,IOS下地图显示出来了。

综上,发现bug的源泉,在于IOS下面使用高德地图,必须引用nvue那几个类库。

还有问题的话,可以加我QQ:13040交流~~

收起阅读 »

占位

uni_ad

占位

占位

uni-app动态修改原生导航栏背景颜色属性样式教程

导航栏 导航栏组件 uniapp 教程 uniapp

uni-app动态修改原生导航栏背景颜色属性样式教程:

代码如下:

uni.setNavigationBarColor({  
    frontColor: '#ffffff',  
    backgroundColor: '#15750a',  
    animation: {  
        duration: 400,  
        timingFunc: 'easeIn'  
        }  
})
继续阅读 »

uni-app动态修改原生导航栏背景颜色属性样式教程:

代码如下:

uni.setNavigationBarColor({  
    frontColor: '#ffffff',  
    backgroundColor: '#15750a',  
    animation: {  
        duration: 400,  
        timingFunc: 'easeIn'  
        }  
})
收起阅读 »

uni-app动态隐藏底部tabbar栏教程

tabbar uniapp 教程 uniapp

uni-app动态隐藏底部tabbar栏教程:

代码如下:

uni.hideTabBar();

uni-app动态隐藏底部tabbar栏教程:

代码如下:

uni.hideTabBar();

uni-app动态隐藏导航栏按钮button教程

uniapp uniapp 教程 导航栏 导航栏组件

uni-app动态隐藏导航栏按钮button教程:

代码如下:

var webView = this.$mp.page.$getAppWebview();  
webView.setTitleNViewButtonStyle(0,{  
    width: '0'  
});  
webView.setTitleNViewButtonStyle(1,{  
    width: '0'  
});
继续阅读 »

uni-app动态隐藏导航栏按钮button教程:

代码如下:

var webView = this.$mp.page.$getAppWebview();  
webView.setTitleNViewButtonStyle(0,{  
    width: '0'  
});  
webView.setTitleNViewButtonStyle(1,{  
    width: '0'  
});
收起阅读 »

uni-app动态隐藏原生导航栏教程

导航栏 导航栏组件 uniapp 教程 uniapp

前几天碰到这个问题,记录一下:

var webView = this.$mp.page.$getAppWebview();  
let titleNView = webView.getTitleNView();  
titleNView && titleNView.hide();

代码如上所述。

继续阅读 »

前几天碰到这个问题,记录一下:

var webView = this.$mp.page.$getAppWebview();  
let titleNView = webView.getTitleNView();  
titleNView && titleNView.hide();

代码如上所述。

收起阅读 »