「这是我参与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>