uniapp 踩坑合集

1,595 阅读2分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。

uniappIOS打包

uniapp在ios端每个页面都可以上下拉,阻止方法

pages.json内设置:

{  
    "path": "pages/helpCenter/Index",  
    "style": {  
        "app-plus": {  
        "bounce": "none"  
        }  
    }  
}

uniapp真机时间错误BUG

问题描述

在小程序中使用new Date().toLocaleDateString() api获取时间的时候,在开发工具中显示为当前时间,而在真机中显示为其他地区的时间

BUG产生原因

toLocaleDateString()方法依赖于底层操作系统在格式化日期上。 例如,在美国,月份出现在日期(06/22/2018)之前,而在印度,日期出现在月份(22/06/2018)之前。

解决方案

使用new Date()构造函数来获取年月日后拼接

如果没有输入任何参数,则Date的构造器会依据系统设置的当前时间来创建一个Date对象。

Date和toLocaleDateString()的区别在于一个是获取系统当前设置的时间,一个则是底层操作系统来格式化时间

//具体代码如下
let date = new Date()
date = date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate()
date = date.split('/')
if (date[1] < 10) {
		date[1] = '0' + date[1]
	}
if (date[2] < 10) {
	date[2] = '0' + date[2]
	}
date = date.join('-')

uniapp 打包安卓app文件上传

打开安卓端选取手机文件并上传,返回手机路径:

// #ifdef APP-PLUS
  if (plus.os.name.toLowerCase() != "android") {
    uni.showModal({ title: '提示', content: '仅支持Android平台', success: function(res) {} })
    return false
  }
  let that = this
  let main = plus.android.runtimeMainActivity();
  let Intent = plus.android.importClass("android.content.Intent")

  // 
  let fileIntent = new Intent(Intent.ACTION_GET_CONTENT)
  //fileIntent.setType(“image/*”);//选择图片
  //fileIntent.setType(“audio/*”); //选择音频
  //fileIntent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
  //fileIntent.setType(“video/*;image/*”);//同时选择视频和图片
  fileIntent.setType("*/*"); //无类型限制
  fileIntent.addCategory(Intent.CATEGORY_OPENABLE)
  main.startActivityForResult(fileIntent, 1)
  // 获取回调
  main.onActivityResult = function(requestCode, resultCode, data) {
    let Activity = plus.android.importClass("android.app.Activity")
    let ContentUris = plus.android.importClass("android.content.ContentUris")
    let Cursor = plus.android.importClass("android.database.Cursor")
    let Uri = plus.android.importClass("android.net.Uri")
    let Build = plus.android.importClass("android.os.Build")
    let Environment = plus.android.importClass("android.os.Environment")
    let DocumentsContract = plus.android.importClass("android.provider.DocumentsContract")
    let MediaStore = plus.android.importClass("android.provider.MediaStore")
    let contentResolver = main.getContentResolver()
    plus.android.importClass(contentResolver)
    // 返回路径
    let path = ''
    if (resultCode == Activity.RESULT_OK) {
      let uri = data.getData()
      if ("file" == uri.getScheme().toLowerCase()) { //使用第三方应用打开
        path = uri.getPath()
        return;
      }
      if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { //4.4以后
        path = getPath(this, uri)
      } else { //4.4以下下系统调用方法
        path = getRealPathFromURI(uri)
      }
      // 回调
      that.resultPath(path)
    }
    // 4.4 以上 从Uri 获取文件绝对路径
    function getPath(context, uri) {
      let isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
      let scheme = uri.getScheme().toLowerCase()
      if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
        // ExternalStorageProvider
        if (isExternalStorageDocument(uri)) {
          let docId = DocumentsContract.getDocumentId(uri)
          let split = docId.split(":")
          let type = split[0]
          // 如果是手机内部存储
          if ("primary" == type.toLowerCase()) {
            return Environment.getExternalStorageDirectory() + "/" + split[1]
          } else {
            return '/storage/' + type + "/" + split[1]
          }
        }
        // DownloadsProvider
        else if (isDownloadsDocument(uri)) {
          let id = DocumentsContract.getDocumentId(uri)
          let split = id.split(":")
          return split[1]
        }
        // MediaProvider
        else if (isMediaDocument(uri)) {
          let docId = DocumentsContract.getDocumentId(uri)
          let split = docId.split(":")
          let type = split[0]
          let contentUri = null
          if ("image" == type.toLowerCase()) {
            contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
          } else if ("video" == type.toLowerCase()) {
            contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
          } else if ("audio" == type.toLowerCase()) {
            contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
          }
          let selection = "_id=?"
          let selectionArgs = [split[1]]
          return getDataColumn(context, contentUri, selection, selectionArgs)
        }
      }
      // MediaStore (and general)
      else if ("content" == scheme) {
        return getDataColumn(context, uri, null, null);
      }
      // File
      else if ("file" == scheme) {
        return uri.getPath();
      }
    }
    // 4.4 以下 获取 绝对路径
    function getRealPathFromURI(uri) {
      let res = null
      let proj = [MediaStore.Images.Media.DATA]
      let cursor = contentResolver.query(uri, proj, null, null, null);
      if (null != cursor && cursor.moveToFirst()) {;
        let column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        res = cursor.getString(column_index);
        cursor.close();
      }
      return res;
    }
    // 通过uri 查找出绝对路径
    function getDataColumn(context, uri, selection, selectionArgs) {
      let cursor = null;
      let column = "_data";
      let projection = [column];
      cursor = contentResolver.query(uri, projection, selection, selectionArgs, null);
      if (cursor != null && cursor.moveToFirst()) {
        let column_index = cursor.getColumnIndexOrThrow(column);
        return cursor.getString(column_index);
      }
    }

    function isExternalStorageDocument(uri) {
      return "com.android.externalstorage.documents" == uri.getAuthority() ? true : false
    }

    function isDownloadsDocument(uri) {
      return "com.android.providers.downloads.documents" == uri.getAuthority() ? true : false
    }

    function isMediaDocument(uri) {
      return "com.android.providers.media.documents" == uri.getAuthority() ? true : false
    }
  }
  // #endif
  // #ifndef APP-PLUS
  uni.showModal({
    title: '提示',
    content: '仅支持Android平台',
    success: function(res) {

    }
  })
  // #endif

uniapp 消息推送功能

手动触发推送

plus.push.createMessage(msg.payload.content, url, options)

说明:

在本地直接创建推送消息,并添加到系统消息中心。

参数:

content: ( String ) 必选

消息显示的内容,在系统通知中心中显示的文本内容。

payload: ( String ) 可选

消息承载的数据,可根据业务逻辑自定义数据格式。

options: ( MessageOptions ) 可选

创建消息的额外参数,参考MessageOptions。

测试推送的CID获取代码

想接收推送,手机要打开通知权限

前端需要 clientid 传给后端 clientid 是客户端标识

// 建议 login 时传值给后端
const info = plus.push.getClientInfo()
const CID = info.clientid

uniapp图片上传


<template>
	<view class="context">
		<view v-for="(item,index) in items" :key="index">
			<view class="u-flex user-box u-p-l-30 u-p-r-20 u-p-b-30">
				<view class="u-m-r-10" @click="ChooseImage(item)">
					<u-avatar :src="src" size="140"></u-avatar>
				</view>
			</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				src: '',
				item: '',
				items: [],
				personID: ''
			}
		},
		onLoad() {
			this.getHome()
		},
		methods: {
			// 请求数据
			getHome(item) {
				const that = this
				uni.getStorage({
					key: 'personID',
					success: function(res) {
						const id = res.data
						uni.request({
							url: `http:`, //接口地址
							method: 'get',
							success: (res) => {
								that.items = res.data
								that.src = `http://******* ${res.data[0].ImageUrl}`
							}
						})
					}
				})
			},
			//上传图片
			ChooseImage(item) {
				let self = this;
				uni.chooseImage({
					count: 1, //1
					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
					sourceType: ['album'], //从相册选择
					success: (res) => {
						const tempFilePaths = res.tempFilePaths;
						console.log(tempFilePaths[0])
						const uploadTask = uni.uploadFile({
							url: '',
							filePath: tempFilePaths[0],
							name: 'file',
							success: function(res) {
								let reg = /\\/g;
								let replaceAfter = res.data.replace(reg,'');
								let imageUrl = res.data.slice(26, -3)
								self.bindWare(imageUrl)
							}
						})
					}
				})
			},
			// 更新图片
			bindWare(url) {
				console.log(url)
				const that = this
				const id = that.items[0].ID
				that.items[0].ImageUrl = url
				console.log(that.items)
				uni.request({
					url: ``,
					method: 'PUT',
					data: that.items[0],
					success: (res) => {
						that.getHome()
					}
				})
			}
		}
	};
</script>