Commit 1429130984788b963bf0052d55e5c5321f9a22aa

Authored by fengtao
1 parent 50776ea2

清除原作者的更新版本和permission.js,影响主包体积

1   -/**
2   - * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启
3   - */
4   -
5   -var isIos
6   -// #ifdef APP-PLUS
7   -isIos = (plus.os.name == "iOS")
8   -// #endif
9   -
10   -// 判断推送权限是否开启
11   -function judgeIosPermissionPush() {
12   - var result = 0;
13   - var UIApplication = plus.ios.import("UIApplication");
14   - var app = UIApplication.sharedApplication();
15   - var enabledTypes = 0;
16   - if (app.currentUserNotificationSettings) {
17   - var settings = app.currentUserNotificationSettings();
18   - enabledTypes = settings.plusGetAttribute("types");
19   - if (enabledTypes == 0) {
20   - console.log("推送权限没有开启");
21   - } else {
22   - result = 1;
23   - console.log("已经开启推送功能!")
24   - }
25   - plus.ios.deleteObject(settings);
26   - } else {
27   - enabledTypes = app.enabledRemoteNotificationTypes();
28   - if (enabledTypes == 0) {
29   - console.log("推送权限没有开启!");
30   - } else {
31   - result = 1;
32   - console.log("已经开启推送功能!")
33   - }
34   - console.log("enabledTypes2:" + enabledTypes);
35   - }
36   - plus.ios.deleteObject(app);
37   - plus.ios.deleteObject(UIApplication);
38   - return result;
39   -}
40   -
41   -// 判断定位权限是否开启
42   -function judgeIosPermissionLocation() {
43   - var result = 0;
44   - var cllocationManger = plus.ios.import("CLLocationManager");
45   - var status = cllocationManger.authorizationStatus();
46   - result = (status != 2) ? 1 : 0;
47   - console.log("定位权限开启:" + result);
48   - // 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
49   - /* var enable = cllocationManger.locationServicesEnabled();
50   - var status = cllocationManger.authorizationStatus();
51   - console.log("enable:" + enable);
52   - console.log("status:" + status);
53   - if (enable && status != 2) {
54   - result = true;
55   - console.log("手机定位服务已开启且已授予定位权限");
56   - } else {
57   - console.log("手机系统的定位没有打开或未给予定位权限");
58   - } */
59   - plus.ios.deleteObject(cllocationManger);
60   - return {
61   - result: result,
62   - permissionName: "定位"
63   - };
64   -}
65   -
66   -// 判断麦克风权限是否开启
67   -function judgeIosPermissionRecord() {
68   - var result = 0;
69   - var avaudiosession = plus.ios.import("AVAudioSession");
70   - var avaudio = avaudiosession.sharedInstance();
71   - var permissionStatus = avaudio.recordPermission();
72   - console.log("permissionStatus:" + permissionStatus);
73   - if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
74   - console.log("麦克风权限没有开启");
75   - } else {
76   - result = 1;
77   - console.log("麦克风权限已经开启");
78   - }
79   - plus.ios.deleteObject(avaudiosession);
80   - return {
81   - result: result,
82   - permissionName: "麦克风"
83   - };
84   -}
85   -
86   -// 判断相机权限是否开启
87   -function judgeIosPermissionCamera() {
88   - var result = 0;
89   - var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
90   - var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
91   - console.log("authStatus:" + authStatus);
92   - if (authStatus == 3) {
93   - result = 1;
94   - console.log("相机权限已经开启");
95   - } else {
96   - console.log("相机权限没有开启");
97   - }
98   - plus.ios.deleteObject(AVCaptureDevice);
99   - return {
100   - result: result,
101   - permissionName: "相机"
102   - };
103   -}
104   -
105   -// 判断相册权限是否开启
106   -function judgeIosPermissionPhotoLibrary() {
107   - var result = 0;
108   - var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
109   - var authStatus = PHPhotoLibrary.authorizationStatus();
110   - console.log("authStatus:" + authStatus);
111   - if (authStatus == 3) {
112   - result = 1;
113   - console.log("相册权限已经开启");
114   - } else {
115   - console.log("相册权限没有开启");
116   - }
117   - plus.ios.deleteObject(PHPhotoLibrary);
118   - return {
119   - result: result,
120   - permissionName: "相册"
121   - };
122   -}
123   -
124   -// 判断通讯录权限是否开启
125   -function judgeIosPermissionContact() {
126   - var result = 0;
127   - var CNContactStore = plus.ios.import("CNContactStore");
128   - var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
129   - if (cnAuthStatus == 3) {
130   - result = 1;
131   - console.log("通讯录权限已经开启");
132   - } else {
133   - console.log("通讯录权限没有开启");
134   - }
135   - plus.ios.deleteObject(CNContactStore);
136   - return {
137   - result: result,
138   - permissionName: "通讯录"
139   - };
140   -}
141   -
142   -// 判断日历权限是否开启
143   -function judgeIosPermissionCalendar() {
144   - var result = 0;
145   - var EKEventStore = plus.ios.import("EKEventStore");
146   - var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
147   - if (ekAuthStatus == 3) {
148   - result = 1;
149   - console.log("日历权限已经开启");
150   - } else {
151   - console.log("日历权限没有开启");
152   - }
153   - plus.ios.deleteObject(EKEventStore);
154   - return {
155   - result: result,
156   - permissionName: "日历"
157   - };
158   -}
159   -
160   -// 判断备忘录权限是否开启
161   -function judgeIosPermissionMemo() {
162   - var result = 0;
163   - var EKEventStore = plus.ios.import("EKEventStore");
164   - var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
165   - if (ekAuthStatus == 3) {
166   - result = 1;
167   - console.log("备忘录权限已经开启");
168   - } else {
169   - console.log("备忘录权限没有开启");
170   - }
171   - plus.ios.deleteObject(EKEventStore);
172   - return {
173   - result: result,
174   - permissionName: "备忘录"
175   - };
176   -}
177   -
178   -// Android权限查询
179   -function requestAndroidPermission(permissionID, permissionName) {
180   - return new Promise((resolve, reject) => {
181   - plus.android.requestPermissions(
182   - [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
183   - function (resultObj) {
184   - var result = 0;
185   - for (var i = 0; i < resultObj.granted.length; i++) {
186   - var grantedPermission = resultObj.granted[i];
187   - console.log('已获取的权限:' + grantedPermission);
188   - result = 1
189   - }
190   - for (var i = 0; i < resultObj.deniedPresent.length; i++) {
191   - var deniedPresentPermission = resultObj.deniedPresent[i];
192   - console.log('拒绝本次申请的权限:' + deniedPresentPermission);
193   - result = 0
194   - }
195   - for (var i = 0; i < resultObj.deniedAlways.length; i++) {
196   - var deniedAlwaysPermission = resultObj.deniedAlways[i];
197   - console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
198   - result = -1
199   - }
200   - resolve({
201   - result: result,
202   - permissionName: permissionName
203   - });
204   - // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
205   - // if (result != 1) {
206   - // gotoAppPermissionSetting()
207   - // }
208   - },
209   - function (error) {
210   - console.log('申请权限错误:' + error.code + " = " + error.message);
211   - resolve({
212   - code: error.code,
213   - message: error.message
214   - });
215   - }
216   - );
217   - });
218   -}
219   -
220   -// 使用一个方法,根据参数判断权限
221   -function judgePermission(permissionID, callback) {
222   - function handle(res) {
223   - callback && callback(res.result);
224   - if (res.result === -1) {
225   - uni.showModal({
226   - title: "提示",
227   - content: "您还未开通" + res.permissionName + "权限,是否去应用设置里开通~",
228   - confirmText: "去开通",
229   - cancelText: "再逛会",
230   - success: (data) => {
231   - if (data.confirm) {
232   - gotoAppPermissionSetting();
233   - }
234   - }
235   - });
236   - }
237   - }
238   - if (permissionID == "location") { // 位置
239   - if (isIos) {
240   - handle(judgeIosPermissionLocation());
241   - } else {
242   - requestAndroidPermission("android.permission.ACCESS_FINE_LOCATION", "位置").then(handle);
243   - }
244   - } else if (permissionID == "camera") { // 摄像头
245   - if (isIos) {
246   - handle(judgeIosPermissionCamera());
247   - } else {
248   - requestAndroidPermission("android.permission.CAMERA", "摄像头").then(handle);
249   - }
250   - } else if (permissionID == "photoLibrary") { // 相册
251   - if (isIos) {
252   - handle(judgeIosPermissionPhotoLibrary());
253   - } else {
254   - requestAndroidPermission("android.permission.READ_EXTERNAL_STORAGE", "相册读取").then(handle);
255   - }
256   - } else if (permissionID == "record") { // 麦克风
257   - if (isIos) {
258   - handle(judgeIosPermissionRecord());
259   - } else {
260   - requestAndroidPermission("android.permission.RECORD_AUDIO", "麦克风").then(handle);
261   - }
262   - } else if (permissionID == "push") { // 推送
263   - if (isIos) {
264   - handle(judgeIosPermissionPush());
265   - } else {
266   - handle(1);
267   - }
268   - } else if (permissionID == "contact") { // 通讯录
269   - if (isIos) {
270   - handle(judgeIosPermissionContact());
271   - } else {
272   - requestAndroidPermission("android.permission.READ_CONTACTS", "通讯录读取").then(handle);
273   - }
274   - } else if (permissionID == "calendar") { // 日历
275   - if (isIos) {
276   - handle(judgeIosPermissionCalendar());
277   - } else {
278   - requestAndroidPermission("android.permission.READ_CALENDAR", "日历读取").then(handle);
279   - }
280   - } else if (permissionID == "memo") { // 备忘录
281   - if (isIos) {
282   - handle(judgeIosPermissionMemo());
283   - } else {
284   - handle(1);
285   - }
286   - } else if (permissionID == "call_phone") { // 拨打电话
287   - if (isIos) {
288   - handle(1);
289   - } else {
290   - requestAndroidPermission("android.permission.CALL_PHONE", "拨打电话").then(handle);
291   - }
292   - }
293   -}
294   -
295   -// 跳转到**应用**的权限页面
296   -function gotoAppPermissionSetting() {
297   - if (isIos) {
298   - var UIApplication = plus.ios.import("UIApplication");
299   - var application2 = UIApplication.sharedApplication();
300   - var NSURL2 = plus.ios.import("NSURL");
301   - // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
302   - var setting2 = NSURL2.URLWithString("app-settings:");
303   - application2.openURL(setting2);
304   -
305   - plus.ios.deleteObject(setting2);
306   - plus.ios.deleteObject(NSURL2);
307   - plus.ios.deleteObject(application2);
308   - } else {
309   - // console.log(plus.device.vendor);
310   - var Intent = plus.android.importClass("android.content.Intent");
311   - var Settings = plus.android.importClass("android.provider.Settings");
312   - var Uri = plus.android.importClass("android.net.Uri");
313   - var mainActivity = plus.android.runtimeMainActivity();
314   - var intent = new Intent();
315   - intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
316   - var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
317   - intent.setData(uri);
318   - mainActivity.startActivity(intent);
319   - }
320   -}
321   -
322   -// 检查系统的设备服务是否开启
323   -// var checkSystemEnableLocation = async function () {
324   -function checkSystemEnableLocation() {
325   - if (isIos) {
326   - var result = false;
327   - var cllocationManger = plus.ios.import("CLLocationManager");
328   - var result = cllocationManger.locationServicesEnabled();
329   - console.log("系统定位开启:" + result);
330   - plus.ios.deleteObject(cllocationManger);
331   - return result;
332   - } else {
333   - var context = plus.android.importClass("android.content.Context");
334   - var locationManager = plus.android.importClass("android.location.LocationManager");
335   - var main = plus.android.runtimeMainActivity();
336   - var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
337   - var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
338   - console.log("系统定位开启:" + result);
339   - return result
340   - }
341   -}
342   -
343   -module.exports = {
344   - judgePermission: judgePermission,
345   - requestAndroidPermission: requestAndroidPermission,
346   - checkSystemEnableLocation: checkSystemEnableLocation,
347   - gotoAppPermissionSetting: gotoAppPermissionSetting
348   -}
1   -## 3.0.1(2021-05-13)
2   -1. 跳转颜色和图标配置
3   -2. 新增静默更新
4   -## 3.0.0(2021-05-12)
5   -1. 支持uni_modules
1   -// #ifdef APP-PLUS
2   -import componentConfig from "@/config/componentConfig"
3   -const platform = uni.getSystemInfoSync().platform;
4   -// 主颜色
5   -const $mainColor = componentConfig.appUpdateColor ? componentConfig.appUpdateColor : "FF5B78";
6   -// 弹窗图标url
7   -const $iconUrl = componentConfig.appUpdateIcon ? componentConfig.appUpdateIcon : "/uni_modules/zhouWei-APPUpdate/static/ic_ar.png";
8   -
9   -// 获取当前应用的版本号
10   -export const getCurrentNo = function(callback) {
11   - // 获取本地应用资源版本号
12   - plus.runtime.getProperty(plus.runtime.appid, function(inf) {
13   - callback && callback({
14   - versionCode: inf.versionCode,
15   - versionName: inf.version
16   - });
17   - });
18   -}
19   -// 从服务器下载应用资源包(wgt文件)
20   -const getDownload = function(data) {
21   - let dtask;
22   - if(data.updateType == 'forcibly' || data.updateType == 'solicit'){
23   - let popupData = {
24   - progress: true,
25   - buttonNum: 2
26   - };
27   - if(data.updateType == 'forcibly'){
28   - popupData.buttonNum = 0;
29   - }
30   - let lastProgressValue = 0;
31   - let popupObj = downloadPopup(popupData);
32   - dtask = plus.downloader.createDownload(data.downloadUrl, {
33   - filename: "_doc/update/"
34   - }, function(download, status) {
35   - if (status == 200) {
36   - popupObj.change({
37   - progressValue: 100,
38   - progressTip:"正在安装文件...",
39   - progress: true,
40   - buttonNum: 0
41   - });
42   - plus.runtime.install(download.filename, {}, function() {
43   - popupObj.change({
44   - contentText: "应用资源更新完成!",
45   - buttonNum: 1,
46   - progress: false
47   - });
48   - }, function(e) {
49   - popupObj.cancel();
50   - plus.nativeUI.alert("安装文件失败[" + e.code + "]:" + e.message);
51   - });
52   - } else {
53   - popupObj.change({
54   - contentText: "文件下载失败...",
55   - buttonNum: 1,
56   - progress: false
57   - });
58   - }
59   - });
60   - dtask.start();
61   - dtask.addEventListener("statechanged", function(task, status) {
62   - switch (task.state) {
63   - case 1: // 开始
64   - popupObj.change({
65   - progressValue:0,
66   - progressTip:"准备下载...",
67   - progress: true
68   - });
69   - break;
70   - case 2: // 已连接到服务器
71   - popupObj.change({
72   - progressValue:0,
73   - progressTip:"开始下载...",
74   - progress: true
75   - });
76   - break;
77   - case 3:
78   - const progress = parseInt(task.downloadedSize / task.totalSize * 100);
79   - if(progress - lastProgressValue >= 2){
80   - lastProgressValue = progress;
81   - popupObj.change({
82   - progressValue:progress,
83   - progressTip: "已下载" + progress + "%",
84   - progress: true
85   - });
86   - }
87   - break;
88   - }
89   - });
90   - // 取消下载
91   - popupObj.cancelDownload = function(){
92   - dtask && dtask.abort();
93   - uni.showToast({
94   - title: "已取消下载",
95   - icon:"none"
96   - });
97   - }
98   - // 重启APP
99   - popupObj.reboot = function(){
100   - plus.runtime.restart();
101   - }
102   - } else if(data.updateType == "silent"){
103   - dtask = plus.downloader.createDownload(data.downloadUrl, {
104   - filename: "_doc/update/"
105   - }, function(download, status) {
106   - if (status == 200) {
107   - plus.runtime.install(download.filename, {}, function() {
108   - console.log("应用资源更新完成");
109   - }, function(e) {
110   - plus.nativeUI.alert("安装文件失败[" + e.code + "]:" + e.message);
111   - });
112   - } else {
113   - plus.nativeUI.alert("文件下载失败...");
114   - }
115   - });
116   - dtask.start();
117   - }
118   -}
119   -// 文字换行
120   -function drawtext(text, maxWidth) {
121   - let textArr = text.split("");
122   - let len = textArr.length;
123   - // 上个节点
124   - let previousNode = 0;
125   - // 记录节点宽度
126   - let nodeWidth = 0;
127   - // 文本换行数组
128   - let rowText = [];
129   - // 如果是字母,侧保存长度
130   - let letterWidth = 0;
131   - // 汉字宽度
132   - let chineseWidth = 14;
133   - // otherFont宽度
134   - let otherWidth = 7;
135   - for (let i = 0; i < len; i++) {
136   - if (/[\u4e00-\u9fa5]|[\uFE30-\uFFA0]/g.test(textArr[i])) {
137   - if(letterWidth > 0){
138   - if(nodeWidth + chineseWidth + letterWidth * otherWidth > maxWidth){
139   - rowText.push({
140   - type: "text",
141   - content: text.substring(previousNode, i)
142   - });
143   - previousNode = i;
144   - nodeWidth = chineseWidth;
145   - letterWidth = 0;
146   - } else {
147   - nodeWidth += chineseWidth + letterWidth * otherWidth;
148   - letterWidth = 0;
149   - }
150   - } else {
151   - if(nodeWidth + chineseWidth > maxWidth){
152   - rowText.push({
153   - type: "text",
154   - content: text.substring(previousNode, i)
155   - });
156   - previousNode = i;
157   - nodeWidth = chineseWidth;
158   - }else{
159   - nodeWidth += chineseWidth;
160   - }
161   - }
162   - } else {
163   - if(/\n/g.test(textArr[i])){
164   - rowText.push({
165   - type: "break",
166   - content: text.substring(previousNode, i)
167   - });
168   - previousNode = i + 1;
169   - nodeWidth = 0;
170   - letterWidth = 0;
171   - }else if(textArr[i] == "\\" && textArr[i + 1] == "n"){
172   - rowText.push({
173   - type: "break",
174   - content: text.substring(previousNode, i)
175   - });
176   - previousNode = i + 2;
177   - nodeWidth = 0;
178   - letterWidth = 0;
179   - }else if(/[a-zA-Z0-9]/g.test(textArr[i])){
180   - letterWidth += 1;
181   - if(nodeWidth + letterWidth * otherWidth > maxWidth){
182   - rowText.push({
183   - type: "text",
184   - content: text.substring(previousNode, i + 1 - letterWidth)
185   - });
186   - previousNode = i + 1 - letterWidth;
187   - nodeWidth = letterWidth * otherWidth;
188   - letterWidth = 0;
189   - }
190   - } else{
191   - if(nodeWidth + otherWidth > maxWidth){
192   - rowText.push({
193   - type: "text",
194   - content: text.substring(previousNode, i)
195   - });
196   - previousNode = i;
197   - nodeWidth = otherWidth;
198   - }else{
199   - nodeWidth += otherWidth;
200   - }
201   - }
202   - }
203   - }
204   - if (previousNode < len) {
205   - rowText.push({
206   - type: "text",
207   - content: text.substring(previousNode, len)
208   - });
209   - }
210   - return rowText;
211   -}
212   -// 是否更新弹窗
213   -function updatePopup(data, callback) {
214   - // 弹窗遮罩层
215   - let maskLayer = new plus.nativeObj.View("maskLayer", { //先创建遮罩层
216   - top: '0px',
217   - left: '0px',
218   - height: '100%',
219   - width: '100%',
220   - backgroundColor: 'rgba(0,0,0,0.5)'
221   - });
222   -
223   - // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心
224   - const screenWidth = plus.screen.resolutionWidth;
225   - const screenHeight = plus.screen.resolutionHeight;
226   - //弹窗容器宽度
227   - const popupViewWidth = screenWidth * 0.7;
228   - // 弹窗容器的Padding
229   - const viewContentPadding = 20;
230   - // 弹窗容器的宽度
231   - const viewContentWidth = parseInt(popupViewWidth - (viewContentPadding * 2));
232   - // 描述的列表
233   - const descriptionList = drawtext(data.versionInfo, viewContentWidth);
234   - // 弹窗容器高度
235   - let popupViewHeight = 80 + 20 + 20 + 90 + 10;
236   -
237   - let popupViewContentList = [{
238   - src: $iconUrl,
239   - id: "logo",
240   - tag: "img",
241   - position: {
242   - top: "0px",
243   - left: (popupViewWidth - 124) / 2 + "px",
244   - width: "124px",
245   - height: "80px",
246   - }
247   - },
248   - {
249   - tag: 'font',
250   - id: 'title',
251   - text: "发现新版本" + data.versionName,
252   - textStyles: {
253   - size: '18px',
254   - color: "#333",
255   - weight: "bold",
256   - whiteSpace: "normal"
257   - },
258   - position: {
259   - top: '90px',
260   - left: viewContentPadding + "px",
261   - width: viewContentWidth + "px",
262   - height: "30px",
263   - }
264   - }];
265   - const textHeight = 18;
266   - let contentTop = 130;
267   - descriptionList.forEach((item,index) => {
268   - if(index > 0){
269   - popupViewHeight += textHeight;
270   - contentTop += textHeight;
271   - }
272   - popupViewContentList.push({
273   - tag: 'font',
274   - id: 'content' + index + 1,
275   - text: item.content,
276   - textStyles: {
277   - size: '14px',
278   - color: "#666",
279   - lineSpacing: "50%",
280   - align: "left"
281   - },
282   - position: {
283   - top: contentTop + "px",
284   - left: viewContentPadding + "px",
285   - width: viewContentWidth + "px",
286   - height: textHeight + "px",
287   - }
288   - });
289   - if(item.type == "break"){
290   - contentTop += 10;
291   - popupViewHeight += 10;
292   - }
293   - });
294   -
295   - if(data.updateType == "forcibly"){
296   - popupViewContentList.push({
297   - tag: 'rect', //绘制底边按钮
298   - rectStyles:{
299   - radius: "6px",
300   - color: $mainColor
301   - },
302   - position:{
303   - bottom: viewContentPadding + 'px',
304   - left: viewContentPadding + "px",
305   - width: viewContentWidth + "px",
306   - height: "30px"
307   - }
308   - });
309   - popupViewContentList.push({
310   - tag: 'font',
311   - id: 'confirmText',
312   - text: "立即升级",
313   - textStyles: {
314   - size: '14px',
315   - color: "#FFF",
316   - lineSpacing: "0%",
317   - },
318   - position: {
319   - bottom: viewContentPadding + 'px',
320   - left: viewContentPadding + "px",
321   - width: viewContentWidth + "px",
322   - height: "30px"
323   - }
324   - });
325   - } else {
326   - // 绘制底边按钮
327   - popupViewContentList.push({
328   - tag: 'rect',
329   - id: 'cancelBox',
330   - rectStyles: {
331   - radius: "3px",
332   - borderColor: "#f1f1f1",
333   - borderWidth: "1px",
334   - },
335   - position: {
336   - bottom: viewContentPadding + 'px',
337   - left: viewContentPadding + "px",
338   - width: (viewContentWidth - viewContentPadding) / 2 + "px",
339   - height: "30px",
340   - }
341   - });
342   - popupViewContentList.push({
343   - tag: 'rect',
344   - id: 'confirmBox',
345   - rectStyles: {
346   - radius: "3px",
347   - color: $mainColor,
348   - },
349   - position: {
350   - bottom: viewContentPadding + 'px',
351   - left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px",
352   - width: (viewContentWidth - viewContentPadding) / 2 + "px",
353   - height: "30px",
354   - }
355   - });
356   - popupViewContentList.push({
357   - tag: 'font',
358   - id: 'cancelText',
359   - text: "暂不升级",
360   - textStyles: {
361   - size: '14px',
362   - color: "#666",
363   - lineSpacing: "0%",
364   - whiteSpace: "normal"
365   - },
366   - position: {
367   - bottom: viewContentPadding + 'px',
368   - left: viewContentPadding + "px",
369   - width: (viewContentWidth - viewContentPadding) / 2 + "px",
370   - height: "30px",
371   - }
372   - });
373   - popupViewContentList.push({
374   - tag: 'font',
375   - id: 'confirmText',
376   - text: "立即升级",
377   - textStyles: {
378   - size: '14px',
379   - color: "#FFF",
380   - lineSpacing: "0%",
381   - whiteSpace: "normal"
382   - },
383   - position: {
384   - bottom: viewContentPadding + 'px',
385   - left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px",
386   - width: (viewContentWidth - viewContentPadding) / 2 + "px",
387   - height: "30px",
388   - }
389   - });
390   - }
391   - // 弹窗内容
392   - let popupView = new plus.nativeObj.View("popupView", { //创建底部图标菜单
393   - tag: "rect",
394   - top: (screenHeight - popupViewHeight) / 2 + "px",
395   - left: '15%',
396   - height: popupViewHeight + "px",
397   - width: "70%"
398   - });
399   - // 绘制白色背景
400   - popupView.drawRect({
401   - color: "#FFFFFF",
402   - radius: "8px"
403   - }, {
404   - top: "40px",
405   - height: popupViewHeight - 40 + "px",
406   - });
407   -
408   - popupView.draw(popupViewContentList);
409   - popupView.addEventListener("click", function(e) {
410   - let maxTop = popupViewHeight - viewContentPadding;
411   - let maxLeft = popupViewWidth - viewContentPadding;
412   - let buttonWidth = (viewContentWidth - viewContentPadding) / 2;
413   - if (e.clientY > maxTop - 30 && e.clientY < maxTop) {
414   - if(data.updateType == "forcibly"){
415   - if(e.clientX > viewContentPadding && e.clientX < maxLeft){
416   - // 立即升级
417   - maskLayer.hide();
418   - popupView.hide();
419   - callback && callback();
420   - }
421   - } else {
422   - // 暂不升级
423   - if (e.clientX > viewContentPadding && e.clientX < maxLeft - buttonWidth - viewContentPadding) {
424   - maskLayer.hide();
425   - popupView.hide();
426   - } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) {
427   - // 立即升级
428   - maskLayer.hide();
429   - popupView.hide();
430   - callback && callback();
431   - }
432   - }
433   -
434   - }
435   - });
436   - if(data.updateType == "solicit"){
437   - // 点击遮罩层
438   - maskLayer.addEventListener("click", function() { //处理遮罩层点击
439   - maskLayer.hide();
440   - popupView.hide();
441   - });
442   - }
443   - // 显示弹窗
444   - maskLayer.show();
445   - popupView.show();
446   -}
447   -// 文件下载的弹窗绘图
448   -function downloadPopupDrawing(data){
449   - // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心
450   - const screenWidth = plus.screen.resolutionWidth;
451   - const screenHeight = plus.screen.resolutionHeight;
452   - //弹窗容器宽度
453   - const popupViewWidth = screenWidth * 0.7;
454   - // 弹窗容器的Padding
455   - const viewContentPadding = 20;
456   - // 弹窗容器的宽度
457   - const viewContentWidth = popupViewWidth - (viewContentPadding * 2);
458   - // 弹窗容器高度
459   - let popupViewHeight = viewContentPadding * 3 + 60;
460   - let progressTip = data.progressTip || "准备下载...";
461   - let contentText = data.contentText || "正在为您更新,请耐心等待";
462   - let elementList = [
463   - {
464   - tag: 'rect', //背景色
465   - color: '#FFFFFF',
466   - rectStyles:{
467   - radius: "8px"
468   - }
469   - },
470   - {
471   - tag: 'font',
472   - id: 'title',
473   - text: "升级APP",
474   - textStyles: {
475   - size: '16px',
476   - color: "#333",
477   - weight: "bold",
478   - verticalAlign: "middle",
479   - whiteSpace: "normal"
480   - },
481   - position: {
482   - top: viewContentPadding + 'px',
483   - height: "30px",
484   - }
485   - },
486   - {
487   - tag: 'font',
488   - id: 'content',
489   - text: contentText,
490   - textStyles: {
491   - size: '14px',
492   - color: "#333",
493   - verticalAlign: "middle",
494   - whiteSpace: "normal"
495   - },
496   - position: {
497   - top: viewContentPadding * 2 + 30 + 'px',
498   - height: "20px",
499   - }
500   - }
501   - ];
502   - // 是否有进度条
503   - if(data.progress){
504   - popupViewHeight += viewContentPadding + 40;
505   - elementList = elementList.concat([
506   - {
507   - tag: 'font',
508   - id: 'progressValue',
509   - text: progressTip,
510   - textStyles: {
511   - size: '14px',
512   - color: $mainColor,
513   - whiteSpace: "normal"
514   - },
515   - position: {
516   - top: viewContentPadding * 4 + 20 + 'px',
517   - height: "30px"
518   - }
519   - },
520   - {
521   - tag: 'rect', //绘制进度条背景
522   - id: 'progressBg',
523   - rectStyles:{
524   - radius: "4px",
525   - borderColor: "#f1f1f1",
526   - borderWidth: "1px",
527   - },
528   - position:{
529   - top: viewContentPadding * 4 + 60 + 'px',
530   - left: viewContentPadding + "px",
531   - width: viewContentWidth + "px",
532   - height: "8px"
533   - }
534   - },
535   - ]);
536   - }
537   - if (data.buttonNum == 2) {
538   - popupViewHeight += viewContentPadding + 30;
539   - elementList = elementList.concat([
540   - {
541   - tag: 'rect', //绘制底边按钮
542   - rectStyles:{
543   - radius: "3px",
544   - borderColor: "#f1f1f1",
545   - borderWidth: "1px",
546   - },
547   - position:{
548   - bottom: viewContentPadding + 'px',
549   - left: viewContentPadding + "px",
550   - width: (viewContentWidth - viewContentPadding) / 2 + "px",
551   - height: "30px"
552   - }
553   - },
554   - {
555   - tag: 'rect', //绘制底边按钮
556   - rectStyles:{
557   - radius: "3px",
558   - color: $mainColor
559   - },
560   - position:{
561   - bottom: viewContentPadding + 'px',
562   - left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px",
563   - width: (viewContentWidth - viewContentPadding) / 2 + "px",
564   - height: "30px"
565   - }
566   - },
567   - {
568   - tag: 'font',
569   - id: 'cancelText',
570   - text: "取消下载",
571   - textStyles: {
572   - size: '14px',
573   - color: "#666",
574   - lineSpacing: "0%",
575   - whiteSpace: "normal"
576   - },
577   - position: {
578   - bottom: viewContentPadding + 'px',
579   - left: viewContentPadding + "px",
580   - width: (viewContentWidth - viewContentPadding) / 2 + "px",
581   - height: "30px",
582   - }
583   - },
584   - {
585   - tag: 'font',
586   - id: 'confirmText',
587   - text: "后台下载",
588   - textStyles: {
589   - size: '14px',
590   - color: "#FFF",
591   - lineSpacing: "0%",
592   - whiteSpace: "normal"
593   - },
594   - position: {
595   - bottom: viewContentPadding + 'px',
596   - left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px",
597   - width: (viewContentWidth - viewContentPadding) / 2 + "px",
598   - height: "30px",
599   - }
600   - }
601   - ]);
602   - }
603   - if (data.buttonNum == 1) {
604   - popupViewHeight += viewContentPadding + 40;
605   - elementList = elementList.concat([
606   - {
607   - tag: 'rect', //绘制底边按钮
608   - rectStyles:{
609   - radius: "6px",
610   - color: $mainColor
611   - },
612   - position:{
613   - bottom: viewContentPadding + 'px',
614   - left: viewContentPadding + "px",
615   - width: viewContentWidth + "px",
616   - height: "40px"
617   - }
618   - },
619   - {
620   - tag: 'font',
621   - id: 'confirmText',
622   - text: "关闭",
623   - textStyles: {
624   - size: '14px',
625   - color: "#FFF",
626   - lineSpacing: "0%",
627   - },
628   - position: {
629   - bottom: viewContentPadding + 'px',
630   - left: viewContentPadding + "px",
631   - width: viewContentWidth + "px",
632   - height: "40px"
633   - }
634   - }
635   - ]);
636   - }
637   - return {
638   - popupViewHeight:popupViewHeight,
639   - popupViewWidth:popupViewWidth,
640   - screenHeight:screenHeight,
641   - viewContentWidth:viewContentWidth,
642   - viewContentPadding:viewContentPadding,
643   - elementList: elementList
644   - };
645   -}
646   -// 文件下载的弹窗
647   -function downloadPopup(data) {
648   - // 弹窗遮罩层
649   - let maskLayer = new plus.nativeObj.View("maskLayer", { //先创建遮罩层
650   - top: '0px',
651   - left: '0px',
652   - height: '100%',
653   - width: '100%',
654   - backgroundColor: 'rgba(0,0,0,0.5)'
655   - });
656   - let popupViewData = downloadPopupDrawing(data);
657   - // 弹窗内容
658   - let popupView = new plus.nativeObj.View("popupView", { //创建底部图标菜单
659   - tag: "rect",
660   - top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px",
661   - left: '15%',
662   - height: popupViewData.popupViewHeight + "px",
663   - width: "70%",
664   - });
665   - let progressValue = 0;
666   - let progressTip = 0;
667   - let contentText = 0;
668   - let buttonNum = 2;
669   - if(data.buttonNum >= 0){
670   - buttonNum = data.buttonNum;
671   - }
672   - popupView.draw(popupViewData.elementList);
673   - let callbackData = {
674   - change: function(res) {
675   - let progressElement = [];
676   - if(res.progressValue){
677   - progressValue = res.progressValue;
678   - // 绘制进度条
679   - progressElement.push({
680   - tag: 'rect', //绘制进度条背景
681   - id: 'progressValueBg',
682   - rectStyles:{
683   - radius: "4px",
684   - color: $mainColor
685   - },
686   - position:{
687   - top: popupViewData.viewContentPadding * 4 + 60 + 'px',
688   - left: popupViewData.viewContentPadding + "px",
689   - width: popupViewData.viewContentWidth * (res.progressValue / 100) + "px",
690   - height: "8px"
691   - }
692   - });
693   - }
694   - if(res.progressTip){
695   - progressTip = res.progressTip;
696   - progressElement.push({
697   - tag: 'font',
698   - id: 'progressValue',
699   - text: res.progressTip,
700   - textStyles: {
701   - size: '14px',
702   - color: $mainColor,
703   - whiteSpace: "normal"
704   - },
705   - position: {
706   - top: popupViewData.viewContentPadding * 4 + 20 + 'px',
707   - height: "30px"
708   - }
709   - });
710   - }
711   - if(res.contentText){
712   - contentText = res.contentText;
713   - progressElement.push({
714   - tag: 'font',
715   - id: 'content',
716   - text: res.contentText,
717   - textStyles: {
718   - size: '16px',
719   - color: "#333",
720   - whiteSpace: "normal"
721   - },
722   - position: {
723   - top: popupViewData.viewContentPadding * 2 + 30 + 'px',
724   - height: "30px",
725   - }
726   - });
727   - }
728   - if(res.buttonNum >= 0 && buttonNum != res.buttonNum){
729   - buttonNum = res.buttonNum;
730   - popupView.reset();
731   - popupViewData = downloadPopupDrawing(Object.assign({
732   - progressValue:progressValue,
733   - progressTip:progressTip,
734   - contentText:contentText,
735   - },res));
736   - let newElement = [];
737   - popupViewData.elementList.map((item,index) => {
738   - let have = false;
739   - progressElement.forEach((childItem,childIndex) => {
740   - if(item.id == childItem.id){
741   - have = true;
742   - }
743   - });
744   - if(!have){
745   - newElement.push(item);
746   - }
747   - });
748   - progressElement = newElement.concat(progressElement);
749   - popupView.setStyle({
750   - tag: "rect",
751   - top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px",
752   - left: '15%',
753   - height: popupViewData.popupViewHeight + "px",
754   - width: "70%",
755   - });
756   - popupView.draw(progressElement);
757   - }else{
758   - popupView.draw(progressElement);
759   - }
760   - },
761   - cancel: function() {
762   - maskLayer.hide();
763   - popupView.hide();
764   - }
765   - }
766   - popupView.addEventListener("click", function(e) {
767   - let maxTop = popupViewData.popupViewHeight - popupViewData.viewContentPadding;
768   - let maxLeft = popupViewData.popupViewWidth - popupViewData.viewContentPadding;
769   - if (e.clientY > maxTop - 40 && e.clientY < maxTop) {
770   - if(buttonNum == 1){
771   - // 单按钮
772   - if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft) {
773   - maskLayer.hide();
774   - popupView.hide();
775   - callbackData.reboot();
776   - }
777   - }else if(buttonNum == 2){
778   - // 双按钮
779   - let buttonWidth = (popupViewData.viewContentWidth - popupViewData.viewContentPadding) / 2;
780   - if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft - buttonWidth - popupViewData.viewContentPadding) {
781   - maskLayer.hide();
782   - popupView.hide();
783   - callbackData.cancelDownload();
784   - } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) {
785   - maskLayer.hide();
786   - popupView.hide();
787   - }
788   - }
789   - }
790   - });
791   - // 显示弹窗
792   - maskLayer.show();
793   - popupView.show();
794   - // 改变进度条
795   - return callbackData;
796   -}
797   -export default function(isPrompt = false) {
798   - getCurrentNo(versionInfo => {
799   - componentConfig.getServerNo(versionInfo, isPrompt, res => {
800   - if (res.updateType == "forcibly" || res.updateType == "silent") {
801   - if (/\.wgt$/i.test(res.downloadUrl)) {
802   - getDownload(res);
803   - } else if(/\.html$/i.test(res.downloadUrl)){
804   - plus.runtime.openURL(res.downloadUrl);
805   - } else {
806   - if (platform == "android") {
807   - getDownload(res);
808   - } else {
809   - plus.runtime.openURL(res.downloadUrl);
810   - }
811   - }
812   - } else if(res.updateType == "solicit"){
813   - updatePopup(res, function() {
814   - if (/\.wgt$/i.test(res.downloadUrl)) {
815   - getDownload(res);
816   - } else if(/\.html$/i.test(res.downloadUrl)){
817   - plus.runtime.openURL(res.downloadUrl);
818   - } else {
819   - if (platform == "android") {
820   - getDownload(res);
821   - } else {
822   - plus.runtime.openURL(res.downloadUrl);
823   - }
824   - }
825   - });
826   - }
827   - });
828   - });
829   -}
830   -// #endif
\ No newline at end of file
1   -{
2   - "id": "zhouWei-APPUpdate",
3   - "displayName": "APP版本更新、强制更新、静默更新、下载进度(wgt更新)",
4   - "version": "3.0.1",
5   - "description": "APP版本更新、强制更新、静默更新、漂亮弹窗、下载进度(wgt更新)",
6   - "keywords": [
7   - "APP版本更新",
8   - "强制更新",
9   - "版本更新",
10   - "静默更新"
11   -],
12   - "repository": "https://github.com/zhouwei1994/uni-app-demo",
13   - "engines": {
14   - "HBuilderX": "^3.1.0"
15   - },
16   - "dcloudext": {
17   - "category": [
18   - "JS SDK",
19   - "通用 SDK"
20   - ],
21   - "sale": {
22   - "regular": {
23   - "price": "0.00"
24   - },
25   - "sourcecode": {
26   - "price": "0.00"
27   - }
28   - },
29   - "contact": {
30   - "qq": "465081029"
31   - },
32   - "declaration": {
33   - "ads": "无",
34   - "data": "无",
35   - "permissions": "<uses-permission android:name=\\\"android.permission.INSTALL_PACKAGES\\\"/> \n<uses-permission android:name=\\\"android.permission.REQUEST_INSTALL_PACKAGES\\\"/>"
36   - },
37   - "npmurl": ""
38   - },
39   - "uni_modules": {
40   - "dependencies": [],
41   - "encrypt": [],
42   - "platforms": {
43   - "cloud": {
44   - "tcb": "y",
45   - "aliyun": "y"
46   - },
47   - "client": {
48   - "App": {
49   - "app-vue": "y",
50   - "app-nvue": "y"
51   - },
52   - "H5-mobile": {
53   - "Safari": "n",
54   - "Android Browser": "n",
55   - "微信浏览器(Android)": "n",
56   - "QQ浏览器(Android)": "n"
57   - },
58   - "H5-pc": {
59   - "Chrome": "n",
60   - "IE": "n",
61   - "Edge": "n",
62   - "Firefox": "n",
63   - "Safari": "n"
64   - },
65   - "小程序": {
66   - "微信": "n",
67   - "阿里": "n",
68   - "百度": "n",
69   - "字节跳动": "n",
70   - "QQ": "n"
71   - },
72   - "快应用": {
73   - "华为": "n",
74   - "联盟": "n"
75   - }
76   - }
77   - }
78   - }
79   -}
\ No newline at end of file
1   -### 常见问题
2   -1.安卓apk下载完成后没有更新APP?
3   -
4   -答:问题是因为没有添加APP安装应用的权限,解决方法在`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限
5   -```
6   -<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/>
7   -<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>
8   -```
9   -若还有问题请看[安装apk无法执行的解决方案](https://ask.dcloud.net.cn/article/35703 "安装apk无法执行的解决方案")
10   -
11   -2.APP更新后版本号没变,还是之前的版本号?
12   -
13   -答:可能是更新的安装包没有升级版本号,`manifest.json`文件里面基本设置`应用版本号`和`应用版本名称`需要升高(保持一直减少问题)
14   -
15   -3.APP更新后没有覆盖之前的APP?
16   -
17   -答:可能是更新的安装包`包名`和APP的`包名`不一样
18   -
19   -4.弹窗的图标不显示?
20   -
21   -答:检查图片是不是放项目资源文件`static`,然后重新运行项目
22   -
23   -5.版本号是在前端对比还是在后端接口对比?
24   -
25   -答:当前案例是本地的版本号通过接口传递给后台,是后台对比的,若需要前端对比,请在接口返回数据的地方修改,不更新就不要调用`callback`方法
26   -
27   -6.本地的版本号比接口的版本号高还弹窗升级窗口?
28   -
29   -答:当前案例是本地的版本号通过接口传递给后台,后台对比是否需要升级,不需要升级就不要返回数据(特别是需要wgt更新的,建议这种方式)
30   -
31   -### 第一步`关键`配置APP更新接口(可以参考上面的示例)
32   -在项目目录下`config/componentConfig.js`里面如下配置
33   -```
34   -// 此方法是接口请求方法
35   -import $http from '@/config/requestConfig'
36   -export default {
37   - // 发起ajax请求获取服务端版本号
38   - getServerNo: (version, isPrompt = false, callback) => {
39   - let httpData = {
40   - version: version.versionCode,
41   - // 版本名称
42   - versionName: version.versionName,
43   - // setupPage参数说明(判断用户是不是从设置页面点击的更新,如果是设置页面点击的更新,有不要用静默更新了,不然用户点击没反应很奇怪的)
44   - setupPage: isPrompt
45   - };
46   - if (platform == "android") {
47   - httpData.type = 1101;
48   - } else {
49   - httpData.type = 1102;
50   - }
51   - /* 接口入参说明
52   - * version: 应用当前版本号(已自动获取)
53   - * versionName: 应用当前版本名称(已自动获取)
54   - * type:平台(1101是安卓,1102是IOS)
55   - */
56   - /****************以下是示例*******************/
57   - // 可以用自己项目的请求方法(接口自己找后台要,插件不提供)
58   - $http.get("api/common/v1/app_version", httpData,{
59   - isPrompt: isPrompt
60   - }).then(res => {
61   - /* res的数据说明
62   - * | 参数名称 | 一定返回 | 类型 | 描述
63   - * | -------------|--------- | --------- | ------------- |
64   - * | versionCode | y | int | 版本号 |
65   - * | versionName | y | String | 版本名称 |
66   - * | versionInfo | y | String | 版本信息 |
67   - * | updateType | y | String | forcibly = 强制更新, solicit = 弹窗确认更新, silent = 静默更新 |
68   - * | downloadUrl | y | String | 版本下载链接(IOS安装包更新请放跳转store应用商店链接,安卓apk和wgt文件放文件下载链接) |
69   - */
70   - if (res && res.downloadUrl) {
71   - // 兼容之前的版本(updateType是新版才有的参数)
72   - if(res.updateType){
73   - callback && callback(res);
74   - } else {
75   - if(res.forceUpdate){
76   - res.updateType = "forcibly";
77   - } else {
78   - res.updateType = "solicit";
79   - }
80   - callback && callback(res);
81   - }
82   - } else if (isPrompt) {
83   - uni.showToast({
84   - title: "暂无新版本",
85   - icon: "none"
86   - });
87   - }
88   - });
89   - /****************以上是示例*******************/
90   - },
91   - // 弹窗主颜色(不填默认粉色)
92   - appUpdateColor: "f00",
93   - // 弹窗图标(不填显示默认图标,链接配置示例如: '/static/demo/ic_attention.png')
94   - appUpdateIcon: ''
95   -}
96   -```
97   -
98   -### 第二步 使用方法
99   -```
100   -// App.vue页面
101   -
102   -// #ifdef APP-PLUS
103   -import APPUpdate from '@/uni_modules/zhouWei-APPUpdate/js_sdk/appUpdate';
104   -// #endif
105   -
106   -onLaunch: function(e) {
107   - // #ifdef APP-PLUS
108   - APPUpdate();
109   - // #endif
110   -}
111   -```
112   -
113   -### 第三步 添加APP安装应用的权限
114   -`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限
115   -```
116   -<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/>
117   -<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>
118   -```
119   -
120   -### 修改弹窗的主题色或弹窗图标
121   -`APPUpdate/index.js`里面上面`$mainColor`常量中定义主题颜色,`$iconUrl`常量中定义图标地址
122   -
123   -### 检查APP是否有新版本(一般在设置页面使用)
124   -```
125   -// #ifdef APP-PLUS
126   -import APPUpdate, { getCurrentNo } from '@/uni_modules/zhouWei-APPUpdate/js_sdk/appUpdate';
127   -// #endif
128   -export default {
129   - data() {
130   - return {
131   - version: "" // 版本号
132   - };
133   - },
134   - //第一次加载
135   - onLoad(e) {
136   - // #ifdef APP-PLUS
137   - getCurrentNo(res => {
138   - // 进页面获取当前APP版本号(用于页面显示)
139   - this.version = res.version;
140   - });
141   - // #endif
142   - },
143   - //方法
144   - methods: {
145   - // 检查APP是否有新版本
146   - onAPPUpdate() {
147   - // true 没有新版本的时候有提示,默认:false
148   - APPUpdate(true);
149   - }
150   - }
151   -}
152   -```
\ No newline at end of file