From 2189d61df9e330e2dbb6347c6332fc62d9a2de62 Mon Sep 17 00:00:00 2001 From: scout <1134087124@qq.com> Date: Thu, 5 Sep 2024 10:58:10 +0800 Subject: [PATCH 1/2] config --- config/index.js | 2 +- files/android/readme.md | 2 +- manifest.json | 2 +- package-lock.json | 6 + .../changelog.md | 4 + .../package.json | 114 ++++++++++++++++ .../readme.md | 95 ++++++++++++++ .../utssdk/app-android/AndroidManifest.xml | 3 + .../utssdk/app-android/config.json | 3 + .../utssdk/app-android/index.uts | 124 ++++++++++++++++++ .../res/anim/popupwindow_enter.xml | 6 + .../app-android/res/anim/popupwindow_exit.xml | 5 + .../drawable/dcloud_permission_background.xml | 6 + .../utssdk/interface.uts | 19 +++ 14 files changed, 388 insertions(+), 3 deletions(-) create mode 100644 package-lock.json create mode 100644 uni_modules/uni-registerRequestPermissionTips/changelog.md create mode 100644 uni_modules/uni-registerRequestPermissionTips/package.json create mode 100644 uni_modules/uni-registerRequestPermissionTips/readme.md create mode 100644 uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/AndroidManifest.xml create mode 100644 uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/config.json create mode 100644 uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/index.uts create mode 100644 uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_enter.xml create mode 100644 uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_exit.xml create mode 100644 uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/drawable/dcloud_permission_background.xml create mode 100644 uni_modules/uni-registerRequestPermissionTips/utssdk/interface.uts diff --git a/config/index.js b/config/index.js index 68c3127..fb4af04 100644 --- a/config/index.js +++ b/config/index.js @@ -10,7 +10,7 @@ const configs = { }, test: { apiBaseUrl: 'https://warehouse.szjixun.cn/oa_backend', - h5Url:'http://114.218.158.24:8042/#/' + h5Url:'https://192.168.88.29:8080/#/' }, prod: { apiBaseUrl: 'https://oa-a.szjixun.cn/api', diff --git a/files/android/readme.md b/files/android/readme.md index 63211a5..cdec49d 100644 --- a/files/android/readme.md +++ b/files/android/readme.md @@ -1,3 +1,3 @@ -Android 包名 : uni.UNI70C49A3 +Android 包名 : uni.UNI4796942 证书别名:oaapp 密钥密码:12345678 diff --git a/manifest.json b/manifest.json index 9a93b38..2dd4b0c 100644 --- a/manifest.json +++ b/manifest.json @@ -21,7 +21,7 @@ "Camera" : {}, "Geolocation" : {}, "Maps" : {}, - "Push" : {} + "LivePusher" : {} }, /* 应用发布信息 */ "distribute" : { diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5947201 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "oa-base", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/uni_modules/uni-registerRequestPermissionTips/changelog.md b/uni_modules/uni-registerRequestPermissionTips/changelog.md new file mode 100644 index 0000000..22e4a32 --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/changelog.md @@ -0,0 +1,4 @@ +## 1.0.1(2024-05-30) +修复云打包可能报错的bug +## 1.0.0(2024-03-09) +支持全局监听权限申请。当申请权限时,会在页面顶部显示申请权限的目的。 diff --git a/uni_modules/uni-registerRequestPermissionTips/package.json b/uni_modules/uni-registerRequestPermissionTips/package.json new file mode 100644 index 0000000..2221f8e --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/package.json @@ -0,0 +1,114 @@ +{ + "id": "uni-registerRequestPermissionTips", + "displayName": "uni-registerRequestPermissionTips", + "version": "1.0.1", + "description": "支持android平台全局监听权限的申请。当申请权限时,会在页面顶部显示申请权限的目的。主要解决上架华为应用市场审核要求:APP在调用终端权限时,应同步告知用户申请该权限的目的。", + "keywords": [ + "权限", + "权限申请", + "上架", + "华为" + ], + "repository": "", + "engines": { + "HBuilderX": "^4.0" + }, + "dcloudext": { + "type": "uts", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + ], + "uni-ext-api": { + "uni": { + "registerRequestPermissionTipsListener": { + "name": "registerRequestPermissionTipsListener", + "app": { + "js": false, + "kotlin": true, + "swift": false + } + }, + "unregisterRequestPermissionTipsListener": { + "name": "unregisterRequestPermissionTipsListener", + "app": { + "js": false, + "kotlin": true, + "swift": false + } + }, + "setRequestPermissionTips": { + "name": "setRequestPermissionTips", + "app": { + "js": false, + "kotlin": true, + "swift": false + } + } + } + }, + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-android": "y", + "app-ios": "n" + }, + "H5-mobile": { + "Safari": "n", + "Android Browser": "n", + "微信浏览器(Android)": "n", + "QQ浏览器(Android)": "n" + }, + "H5-pc": { + "Chrome": "n", + "IE": "n", + "Edge": "n", + "Firefox": "n", + "Safari": "n" + }, + "小程序": { + "微信": "n", + "阿里": "n", + "百度": "n", + "字节跳动": "n", + "QQ": "n", + "钉钉": "n", + "快手": "n", + "飞书": "n", + "京东": "n" + }, + "快应用": { + "华为": "n", + "联盟": "n" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-registerRequestPermissionTips/readme.md b/uni_modules/uni-registerRequestPermissionTips/readme.md new file mode 100644 index 0000000..2357b46 --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/readme.md @@ -0,0 +1,95 @@ +## registerRequestPermissionTipsListener(listener?) +注册权限监听事件 +## unregisterRequestPermissionTipsListener(listener?) +取消注册权限监听事件 + +## RequestPermissionTipsListener的属性值 +|名称 |类型 |描述 |必填 | +|:-- |:-- |:-- |:-- | +|onRequest |(permissions:Array)=>void |申请系统权限回调,permissions为触发权限申请的所有权限 |否 | +|onConfirm |(permissions:Array)=>void |弹出系统权限授权框回调,permissions为触发弹出权限授权框的所有权限 |否 | +|onComplete |(permissions:UTSJSONObject)=>void |权限申请完成回调,permissions包括权限及权限的状态。`grant`为权限已获取,`denied`为权限已拒绝 |否 | + +## setRequestPermissionTips(UTSJSONObject) +设置权限监听的说明。支持针对权限设置具体的说明。 + +参考:`{"android.permission.CAMERA":"

相机权限申请说明

"}` + +安卓权限列表可参考[谷歌官方文档](https://developer.android.com/reference/android/Manifest.permission)。 + +权限申请说明基于原生TextView实现,可以实现加载html内容,支持的标签及属性可参考: +``` +:加粗文本。 +:斜体文本。 +:下划线文本。 +:上标文本。 +:下标文本。 +:等宽字体文本。 +:放大字体。 +:缩小字体。 +:带有删除线的文本。 +

:段落。 +

:块级容器。 +

:区域标题元素。 +
    ,
      ,
    1. :无序列表和有序列表。 +
      :换行。 +:设置文本颜色和大小。 +``` + +## 示例 + +``` + +``` \ No newline at end of file diff --git a/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/AndroidManifest.xml b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/AndroidManifest.xml new file mode 100644 index 0000000..a807709 --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/config.json b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/config.json new file mode 100644 index 0000000..bf95925 --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/config.json @@ -0,0 +1,3 @@ +{ + "minSdkVersion": "21" +} \ No newline at end of file diff --git a/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/index.uts b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/index.uts new file mode 100644 index 0000000..120fd81 --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/index.uts @@ -0,0 +1,124 @@ +import { UnregisterRequestPermissionTipsListener, RegisterRequestPermissionTipsListener, RequestPermissionTipsListener, SetRequestPermissionTips } from "../interface"; +import RelativeLayout from 'android.widget.RelativeLayout'; +import LinearLayout from 'android.widget.LinearLayout'; +import Color from 'android.graphics.Color'; +import TextView from 'android.widget.TextView'; +import ViewGroup from 'android.view.ViewGroup'; +import Activity from 'android.app.Activity'; +import HashMap from 'java.util.HashMap'; +import AnimationUtils from 'android.view.animation.AnimationUtils'; +import R from 'io.dcloud.uts.permissionrequest.R' +import Html from 'android.text.Html'; +import View from 'android.view.View'; +import Context from 'android.content.Context'; +import WindowManager from 'android.view.WindowManager'; + +let PermissionTipsView : View | null = null +let permissionTips : HashMap = new HashMap() +var permissionListener : RequestPermissionListener | null = null +var listener : RequestPermissionTipsListener | null = null +export const unregisterRequestPermissionTipsListener : UnregisterRequestPermissionTipsListener = (_ : RequestPermissionTipsListener | null) => { + listener = null; + if (permissionListener != null) { + permissionListener!.stop() + permissionListener = null + } + if (PermissionTipsView != null) { + if (PermissionTipsView!.getParent() != null) { + PermissionTipsView!.setAnimation(null); + ((PermissionTipsView!.getParent()) as ViewGroup).removeView(PermissionTipsView) + } + PermissionTipsView = null + } +} + +export const registerRequestPermissionTipsListener : RegisterRequestPermissionTipsListener = (l : RequestPermissionTipsListener | null) => { + listener = l + if (permissionListener == null) { + permissionListener = uni.createRequestPermissionListener() + permissionListener!.onRequest((permissions : Array) => { + if (listener != null) + listener!.onRequest?.invoke(permissions) + }) + permissionListener!.onConfirm((permissions : Array) => { + let activity = UTSAndroid.getUniActivity()! + if (PermissionTipsView != null && PermissionTipsView!.getParent() != null) { + PermissionTipsView!.setAnimation(null); + ((PermissionTipsView!.getParent()) as ViewGroup).removeView(PermissionTipsView) + } + if (permissions.length > 0) { + PermissionTipsView = createPermissionWindow(activity, permissions); + if (PermissionTipsView != null) { + (activity.findViewById(android.R.id.content) as ViewGroup).addView(PermissionTipsView!) + } + } + if (listener != null) + listener!.onConfirm?.invoke(permissions) + + }) + permissionListener!.onComplete((permissions : Array) => { + // clearTimeout(timeoutRequestId) + let activity = UTSAndroid.getUniActivity()! + if (PermissionTipsView != null) { + PermissionTipsView!.setAnimation(AnimationUtils.loadAnimation(activity, R.anim.popupwindow_exit)); + ((PermissionTipsView!.getParent()) as ViewGroup).removeView(PermissionTipsView!) + PermissionTipsView = null + } + if (listener != null) { + var permissionStatus = {} + for (var p in permissions) { + permissionStatus[p] = UTSAndroid.checkSystemPermissionGranted(UTSAndroid.getUniActivity()!, [p]) ? "grant" : "denied" + } + listener!.onComplete?.invoke(permissionStatus) + } + }) + } +} + +export const setRequestPermissionTips : SetRequestPermissionTips = (tips : UTSJSONObject) => { + permissionTips.clear() + for (var k in tips) { + permissionTips.put(k, tips[k] != null ? tips[k].toString() : "") + } +} + +function createPermissionWindow(activity : Activity, permissions : Array) : ViewGroup | null { + let rootView = new RelativeLayout(activity); + rootView.setBackgroundColor(Color.TRANSPARENT); + let backgroundView = new LinearLayout(activity); + backgroundView.setPadding(30, 0, 30, 30); + backgroundView.setOrientation(1) + backgroundView.setBackgroundResource(R.drawable.dcloud_permission_background); + let permissionTipsList : Array = new Array() + for (var p in permissions) { + if (permissionTips.containsKey(p) && permissionTipsList.indexOf(permissionTips.get(p)) == -1) { + permissionTipsList.push(permissionTips.get(p)!) + } + } + for (var p in permissionTipsList) { + let text = new TextView(activity); + text.setText(Html.fromHtml(p, Html.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING)) + text.setPadding(0, 30, 0, 0) + text.setTextSize((5 * getScale()).toFloat()) + text.setTextColor(Color.BLACK) + backgroundView.addView(text) + } + if (backgroundView.getChildCount() == 0) { + return null; + } + let rll = new RelativeLayout.LayoutParams(-1, -2) + rll.topMargin = (UTSAndroid.getStatusBarHeight() * getScale()).toInt(); + rll.leftMargin = 30; + rll.rightMargin = 30; + rll.bottomMargin = 30; + rootView.addView(backgroundView, rll) + rootView.setAnimation(AnimationUtils.loadAnimation(activity, R.anim.popupwindow_enter)); + return rootView; +} + +function getScale() : Float { + if (UTSAndroid.getUniActivity() != null) { + return UTSAndroid.getUniActivity()!.resources.displayMetrics.scaledDensity + } + return (0 as number).toFloat(); +} \ No newline at end of file diff --git a/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_enter.xml b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_enter.xml new file mode 100644 index 0000000..37e9c6f --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_enter.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_exit.xml b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_exit.xml new file mode 100644 index 0000000..5054a98 --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/anim/popupwindow_exit.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/drawable/dcloud_permission_background.xml b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/drawable/dcloud_permission_background.xml new file mode 100644 index 0000000..80238cc --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/utssdk/app-android/res/drawable/dcloud_permission_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/uni_modules/uni-registerRequestPermissionTips/utssdk/interface.uts b/uni_modules/uni-registerRequestPermissionTips/utssdk/interface.uts new file mode 100644 index 0000000..aacabe0 --- /dev/null +++ b/uni_modules/uni-registerRequestPermissionTips/utssdk/interface.uts @@ -0,0 +1,19 @@ +export type RequestPermissionTipsListener = { + onRequest ?: ((permissions : Array) => void) | null, + onConfirm ?: ((permission : Array) => void) | null, + onComplete ?: ((permissions : UTSJSONObject) => void) | null +} + + +export type RegisterRequestPermissionTipsListener = (listener : RequestPermissionTipsListener | null) => void +export type UnregisterRequestPermissionTipsListener = (listener : RequestPermissionTipsListener | null) => void +export type SetRequestPermissionTips = (tips : UTSJSONObject) => void + +export interface Uni { + + registerRequestPermissionTipsListener : RegisterRequestPermissionTipsListener, + + unregisterRequestPermissionTipsListener : UnregisterRequestPermissionTipsListener + + setRequestPermissionTips : SetRequestPermissionTips +} \ No newline at end of file From 0b813cfee09df8165352588a1b3b61e5a703b2b9 Mon Sep 17 00:00:00 2001 From: scout <1134087124@qq.com> Date: Fri, 6 Sep 2024 16:30:50 +0800 Subject: [PATCH 2/2] 12 --- files/ios/dev.p12 | Bin 0 -> 3241 bytes files/ios/dis.p12 | Bin 0 -> 3353 bytes files/ios/oa_dis_20240713.mobileprovision | Bin 0 -> 12532 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 files/ios/dev.p12 create mode 100644 files/ios/dis.p12 create mode 100644 files/ios/oa_dis_20240713.mobileprovision diff --git a/files/ios/dev.p12 b/files/ios/dev.p12 new file mode 100644 index 0000000000000000000000000000000000000000..6f7a27fdb997e7e55109d719d026f3e73080a526 GIT binary patch literal 3241 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 Oi`|?Ea(N~9TPEH8;<%bF~MvP70_ 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