
分享一个cache方案,可以指定缓存时间
具体使用方法 看代码。
/**
* 缓存数据优化
* var cache = require('utils/cache.js');
* import cache from '../cache'
* 使用方法 【
* 一、设置缓存
* string cache.put('k', 'string你好啊');
* json cache.put('k', { "b": "3" }, 2);
* array cache.put('k', [1, 2, 3]);
* boolean cache.put('k', true);
* 二、读取缓存
* 默认值 cache.get('k')
* string cache.get('k', '你好')
* json cache.get('k', { "a": "1" })
* 三、移除/清理
* 移除: cache.remove('k');
* 清理:cache.clear();
* 】
* @type {String}
*/
var postfix = '_aszapp'; // 缓存前缀
/**
* 设置缓存
* @param {[type]} k [键名]
* @param {[type]} v [键值]
* @param {[type]} t [时间、单位秒]
*/
function put(k, v, t) {
uni.setStorageSync(k, v)
var seconds = parseInt(t);
if (seconds > 0) {
var timestamp = Date.parse(new Date());
timestamp = timestamp / 1000 + seconds;
uni.setStorageSync(k + postfix, timestamp + "")
} else {
uni.removeStorageSync(k + postfix)
}
}
/**
* 获取缓存
* @param {[type]} k [键名]
* @param {[type]} def [获取为空时默认]
*/
function get(k, def) {
var deadtime = parseInt(uni.getStorageSync(k + postfix))
if (deadtime) {
if (parseInt(deadtime) < Date.parse(new Date()) / 1000) {
if (def) {
return def;
} else {
return false;
}
}
}
var res = uni.getStorageSync(k);
if (res) {
return res;
} else {
if (def == undefined || def == "") {
def = false;
}
return def;
}
}
function remove(k) {
uni.removeStorageSync(k);
uni.removeStorageSync(k + postfix);
}
/**
* 清理所有缓存
* @return {[type]} [description]
*/
function clear() {
uni.clearStorageSync();
}
module.exports = {
put: put,
get: get,
remove: remove,
clear: clear,
}
具体使用方法 看代码。
/**
* 缓存数据优化
* var cache = require('utils/cache.js');
* import cache from '../cache'
* 使用方法 【
* 一、设置缓存
* string cache.put('k', 'string你好啊');
* json cache.put('k', { "b": "3" }, 2);
* array cache.put('k', [1, 2, 3]);
* boolean cache.put('k', true);
* 二、读取缓存
* 默认值 cache.get('k')
* string cache.get('k', '你好')
* json cache.get('k', { "a": "1" })
* 三、移除/清理
* 移除: cache.remove('k');
* 清理:cache.clear();
* 】
* @type {String}
*/
var postfix = '_aszapp'; // 缓存前缀
/**
* 设置缓存
* @param {[type]} k [键名]
* @param {[type]} v [键值]
* @param {[type]} t [时间、单位秒]
*/
function put(k, v, t) {
uni.setStorageSync(k, v)
var seconds = parseInt(t);
if (seconds > 0) {
var timestamp = Date.parse(new Date());
timestamp = timestamp / 1000 + seconds;
uni.setStorageSync(k + postfix, timestamp + "")
} else {
uni.removeStorageSync(k + postfix)
}
}
/**
* 获取缓存
* @param {[type]} k [键名]
* @param {[type]} def [获取为空时默认]
*/
function get(k, def) {
var deadtime = parseInt(uni.getStorageSync(k + postfix))
if (deadtime) {
if (parseInt(deadtime) < Date.parse(new Date()) / 1000) {
if (def) {
return def;
} else {
return false;
}
}
}
var res = uni.getStorageSync(k);
if (res) {
return res;
} else {
if (def == undefined || def == "") {
def = false;
}
return def;
}
}
function remove(k) {
uni.removeStorageSync(k);
uni.removeStorageSync(k + postfix);
}
/**
* 清理所有缓存
* @return {[type]} [description]
*/
function clear() {
uni.clearStorageSync();
}
module.exports = {
put: put,
get: get,
remove: remove,
clear: clear,
}
收起阅读 »

uniapp:写了一个缓存 uni.request 的类,分享一下!
因为不是每个request都需要去服务器拿。缓存一下,有助于提高性能。
直接替换uni.request(params) 到 Utils.cashRequest(duration, params)就行了。
Utils.cacheRequest(3600,{
url: "your-web-service-url",
success: function (resp) {
uni.stopPullDownRefresh();
}.bind(this)
})
export default class Utils {
static cacheRequest(cacheDruation=3600, params) {
var key = JSON.stringify({url:params.url,data:params.data});
var cache = uni.getStorageSync(key);
var now = (new Date()).getTime() / 1000;
var success = params.success;
if (cache && cache.time + cacheDruation > now) {
success(cache.resp);
return;
}
params.success = function (resp) {
success(resp);
uni.setStorageSync(key, {
time: now,
resp: resp
});
}.bind(this);
uni.request(params);
}
}
因为不是每个request都需要去服务器拿。缓存一下,有助于提高性能。
直接替换uni.request(params) 到 Utils.cashRequest(duration, params)就行了。
Utils.cacheRequest(3600,{
url: "your-web-service-url",
success: function (resp) {
uni.stopPullDownRefresh();
}.bind(this)
})
export default class Utils {
static cacheRequest(cacheDruation=3600, params) {
var key = JSON.stringify({url:params.url,data:params.data});
var cache = uni.getStorageSync(key);
var now = (new Date()).getTime() / 1000;
var success = params.success;
if (cache && cache.time + cacheDruation > now) {
success(cache.resp);
return;
}
params.success = function (resp) {
success(resp);
uni.setStorageSync(key, {
time: now,
resp: resp
});
}.bind(this);
uni.request(params);
}
}
收起阅读 »

android权限(permission)大全
转载别人的 原文地址文章末尾有,记录下
1.android.permission.WRITE_USER_DICTIONARY
允许应用程序向用户词典中写入新词
2.android.permission.WRITE_SYNC_SETTINGS
写入Google在线同步设置
3.android.permission.WRITE_SOCIAL_STREAM
读取用户的社交信息流
4.android.permission.WRITE_SMS
允许程序写短信
5.android.permission.WRITE_SETTINGS
允许程序读取或写入系统设置
6.android.permission.WRITE_SECURE_SETTINGS
允许应用程序读取或写入安全系统设置
7.android.permission.WRITE_PROFILE
允许程序写入个人资料数据
8.com.android.browser.permission.WRITE_HISTORY_BOOKMARKS
允许一个应用程序写(但不可读)用户的浏览历史和书签
9.android.permission.WRITE_GSERVICES
允许程序修改Google服务地图
10.android.permission.WRITE_EXTERNAL_STORAGE
允许程序写入外部存储,如SD卡上写文件
11.android.permission.WRITE_CONTACTS
写入联系人,但不可读取
12.android.permission.WRITE_CALL_LOG
允许程序写入(但是不能读)用户的联系人数据
13.android.permission.WRITE_CALENDAR
允许程序写入日程,但不可读取
14.android.permission.WRITE_APN_SETTINGS
允许程序写入网络GPRS接入点设置
15.android.permission.WAKE_LOCK
允许程序在手机屏幕关闭后后台进程仍然运行
16.android.permission.VIBRATE
允许程序振动
17.android.permission.USE_SIP
允许程序使用SIP视频服务
18.android.permission.USE_CREDENTIALS
允许程序请求验证从AccountManager
19.android.permission.UPDATE_DEVICE_STATS
允许程序更新设备状态
20.com.android.launcher.permission.UNINSTALL_SHORTCUT
删除快捷方式
21.android.permission.TRANSMIT_IR
允许使用设备的红外发射器,如果可用
22.android.permission.SYSTEM_ALERT_WINDOW
允许程序显示系统窗口
23.android.permission.SUBSCRIBED_FEEDS_WRITE
允许程序写入或修改订阅内容的数据库
24.android.permission.SUBSCRIBED_FEEDS_READ
允许程序访问订阅信息的数据库
22.android.permission.STATUS_BAR
允许程序打开、关闭、禁用状态栏
23.android.permission.SIGNAL_PERSISTENT_PROCESSES
允许程序发送一个永久的进程信号
24.android.permission.SET_WALLPAPER_HINTS
允许程序设置壁纸建议
25.android.permission.SET_WALLPAPER
允许程序设置桌面壁纸
26.android.permission.SET_TIME_ZONE
允许程序设置系统时区
27.android.permission.SET_TIME
允许程序设置系统时间
28.android.permission.SET_PROCESS_LIMIT
允许程序设置最大的进程数量的限制
29.android.permission.SET_PREFERRED_APPLICATIONS
允许程序设置应用的参数,已不再工作具体查看addPackageToPreferred(String) 介绍
30.android.permission.SET_POINTER_SPEED
无法被第三方应用获得,系统权限
31.android.permission.SET_ORIENTATION
允许程序设置屏幕方向为横屏或标准方式显示,不用于普通应用
32.android.permission.SET_DEBUG_APP
允许程序设置调试程序,一般用于开发
33.android.permission.SET_ANIMATION_SCALE
允许程序设置全局动画缩放
34.android.permission.SET_ALWAYS_FINISH
允许程序设置程序在后台是否总是退出
36.com.android.alarm.permission.SET_ALARM
允许程序设置闹铃提醒
37.android.permission.SET_ACTIVITY_WATCHER
允许程序设置Activity观察器一般用于monkey测试
38.android.permission.SEND_SMS
允许程序发送短信
39.android.permission.SEND_RESPOND_VIA_MESSAGE
允许用户在来电的时候用你的应用进行即时的短信息回复。
40.android.permission.RESTART_PACKAGES
允许程序结束任务通过restartPackage(String)方法,该方式将在外来放弃
41.android.permission.REORDER_TASKS
允许程序重新排序系统Z轴运行中的任务
42.android.permission.RECORD_AUDIO
允许程序录制声音通过手机或耳机的麦克
43.android.permission.RECEIVE_WAP_PUSH
允许程序接收WAP PUSH信息
44.android.permission.RECEIVE_SMS
允许程序接收短信
45.android.permission.RECEIVE_MMS
允许程序接收彩信
46.android.permission.RECEIVE_BOOT_COMPLETED
允许程序开机自动运行
47.android.permission.REBOOT
允许程序重新启动设备
48.android.permission.READ_USER_DICTIONARY
从一个提供器中获取数据,针对对应的提供器,应用程序需要“读访问权限”
49.android.permission.READ_SYNC_STATS
允许程序读取同步状态,获得Google在线同步状态
50.android.permission.READ_SYNC_SETTINGS
允许程序读取同步设置,读取Google在线同步设置
51.android.permission.READ_SOCIAL_STREAM
读取用户的社交信息流
52.android.permission.READ_SMS
允许程序读取短信内容
53.android.permission.READ_PROFILE
访问用户个人资料
54.android.permission.READ_PHONE_STATE
允许程序访问电话状态
55.android.permission.READ_LOGS
允许程序读取系统底层日志
56.android.permission.READ_INPUT_STATE
允许程序读取当前键的输入状态,仅用于系统
57.com.android.browser.permission.READ_HISTORY_BOOKMARKS
允许程序读取浏览器收藏夹和历史记录
58.android.permission.READ_FRAME_BUFFER
允许程序读取帧缓存用于屏幕截图
59.android.permission.READ_EXTERNAL_STORAGE
程序可以读取设备外部存储空间(内置SDcard和外置SDCard)的文件,如果您的App已经添加了“WRITE_EXTERNAL_STORAGE ”权限 ,则就没
必要添加读的权限了,写权限已经包含了读权限了。
60.android.permission.READ_CONTACTS
允许程序访问联系人通讯录信息
61.android.permission.READ_CALL_LOG
读取通话记录
62.android.permission.READ_CALENDAR
允许程序读取用户的日程信息
63.android.permission.PROCESS_OUTGOING_CALLS
允许程序监视,修改或放弃播出电话
64.android.permission.PERSISTENT_ACTIVITY
允许程序创建一个永久的Activity,该功能标记为将来将被移除
65.android.permission.NFC
允许程序执行NFC近距离通讯操作,用于移动支持
66.android.permission.MOUNT_UNMOUNT_FILESYSTEMS
允许程序挂载、反挂载外部文件系统
67.android.permission.MOUNT_FORMAT_FILESYSTEMS
允许程序格式化可移动文件系统,比如格式化清空SD卡
68.android.permission.MODIFY_PHONE_STATE
允许程序修改电话状态,如飞行模式,但不包含替换系统拨号器界面
69.android.permission.MODIFY_AUDIO_SETTINGS
允许程序修改声音设置信息
70.android.permission.MEDIA_CONTENT_CONTROL
允许一个应用程序知道什么是播放和控制其内容。不被第三方应用使用。
71.android.permission.MASTER_CLEAR
允许程序执行软格式化,删除系统配置信息
72.android.permission.MANAGE_DOCUMENTS
允许一个应用程序来管理文档的访问,通常是一个文档选择器部分
73.android.permission.MANAGE_APP_TOKENS
管理创建、摧毁、Z轴顺序,仅用于系统
74.android.permission.MANAGE_ACCOUNTS
允许程序管理AccountManager中的账户列表
75.android.permission.LOCATION_HARDWARE
允许一个应用程序中使用定位功能的硬件,不使用第三方应用
76.android.permission.KILL_BACKGROUND_PROCESSES
允许程序调用killBackgroundProcesses(String).方法结束后台进程
77.android.permission.INTERNET
允许程序访问网络连接,可能产生GPRS流量
78.android.permission.INTERNAL_SYSTEM_WINDOW
允许程序打开内部窗口,不对第三方应用程序开放此权限
79.com.android.launcher.permission.INSTALL_SHORTCUT
创建快捷方式
80.android.permission.INSTALL_PACKAGES
允许程序安装应用
81.android.permission.INSTALL_LOCATION_PROVIDER
允许程序安装定位提供
82.android.permission.INJECT_EVENTS
允许程序访问本程序的底层事件,获取按键、轨迹球的事件流
83.android.permission.HARDWARE_TEST
允许程序访问硬件辅助设备,用于硬件测试
84.android.permission.GLOBAL_SEARCH
允许程序允许全局搜索
85.android.permission.GET_TOP_ACTIVITY_INFO
允许一个应用程序检索私有信息是当前最顶级的活动,不被第三方应用使用
86.android.permission.GET_TASKS
允许程序获取任务信息
87.android.permission.GET_PACKAGE_SIZE
允许程序获取应用的文件大小
88.android.permission.GET_ACCOUNTS
允许程序访问账户Gmail列表
89.android.permission.FORCE_BACK
允许程序强制使用back后退按键,无论Activity是否在顶层
90.android.permission.FLASHLIGHT
允许访问闪光灯
91.android.permission.FACTORY_TEST
允许程序运行工厂测试模式
92.android.permission.EXPAND_STATUS_BAR
允许程序扩展或收缩状态栏
93.android.permission.DUMP
允许程序获取系统dump信息从系统服务
94.android.permission.DISABLE_KEYGUARD
允许程序禁用键盘锁
95.android.permission.DIAGNOSTIC
允许程序到RW到诊断资源
96.android.permission.DEVICE_POWER
允许程序访问底层电源管理
97.android.permission.DELETE_PACKAGES
允许程序删除应用
98.android.permission.DELETE_CACHE_FILES
允许程序删除缓存文件
99.android.permission.CONTROL_LOCATION_UPDATES
允许程序获得移动网络定位信息改变
100.android.permission.CLEAR_APP_USER_DATA
允许程序清除用户数据
101.android.permission.CLEAR_APP_CACHE
允许程序清除应用缓存
102.android.permission.CHANGE_WIFI_STATE
允许程序改变WiFi状态
103.android.permission.CHANGE_WIFI_MULTICAST_STATE
允许程序改变WiFi多播状态
104.android.permission.CHANGE_NETWORK_STATE
允许程序改变网络状态,如是否联网
105.android.permission.CHANGE_CONFIGURATION
允许当前应用改变配置,如定位
106.android.permission.CHANGE_COMPONENT_ENABLED_STATE
改变组件是否启用状态
107.android.permission.CAPTURE_VIDEO_OUTPUT
允许一个应用程序捕获视频输出,不被第三方应用使用
108.android.permission.CAPTURE_SECURE_VIDEO_OUTPUT
允许一个应用程序捕获视频输出。不被第三方应用使用
109.android.permission.CAPTURE_AUDIO_OUTPUT
允许一个应用程序捕获音频输出。不被第三方应用使用
110.android.permission.CAMERA
允许程序访问摄像头进行拍照
111.android.permission.CALL_PRIVILEGED
允许程序拨打电话,替换系统的拨号器界面
112.android.permission.CALL_PHONE
允许程序从非系统拨号器里拨打电话
113.android.permission.BROADCAST_WAP_PUSH
WAP PUSH服务收到后触发一个广播
114.android.permission.BROADCAST_STICKY
允许程序收到广播后快速收到下一个广播
115.android.permission.BROADCAST_SMS
允许程序当收到短信时触发一个广播
116.android.permission.BROADCAST_PACKAGE_REMOVED
允许程序删除时广播
117.android.permission.BRICK
能够禁用手机,非常危险,顾名思义就是让手机变成砖头
118.android.permission.BLUETOOTH_PRIVILEGED
允许应用程序配对蓝牙设备,而无需用户交互。这不是第三方应用程序可用。
119.android.permission.BLUETOOTH_ADMIN
允许程序进行发现和配对新的蓝牙设备
120.android.permission.BLUETOOTH
允许程序连接配对过的蓝牙设备
121.android.permission.BIND_WALLPAPER
必须通过WallpaperService服务来请求,只有系统才能用
122.android.permission.BIND_VPN_SERVICE
绑定VPN服务
必须通过VpnService服务来请求,只有系统才能用
123.android.permission.BIND_TEXT_SERVICE
必须要求textservice(例如吗 spellcheckerservice),以确保只有系统可以绑定到它。
124.android.permission.BIND_REMOTEVIEWS
必须通过RemoteViewsService服务来请求,只有系统才能用
125.android.permission.BIND_PRINT_SERVICE
必须要求由printservice,以确保只有系统可以绑定到它。
126.android.permission.BIND_NOTIFICATION_LISTENER_SERVICE
必须要求由notificationlistenerservice,以确保只有系统可以绑定到它。
127.android.permission.BIND_NFC_SERVICE
由hostapduservice或offhostapduservice必须确保只有系统可以绑定到它。
128.android.permission.BIND_INPUT_METHOD
请求InputMethodService服务,只有系统才能使用
129.android.permission.BIND_DEVICE_ADMIN
请求系统管理员接收者receiver,只有系统才能使用
130.android.permission.BIND_APPWIDGET
允许程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限
131.android.permission.BIND_ACCESSIBILITY_SERVICE
请求accessibilityservice服务,以确保只有系统可以绑定到它。
132.android.permission.AUTHENTICATE_ACCOUNTS
允许程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息
133.com.android.voicemail.permission.ADD_VOICEMAIL
允许一个应用程序添加语音邮件系统
134.android.permission.ACCOUNT_MANAGER
允许程序获取账户验证信息,主要为GMail账户信息,只有系统级进程才能访问的权限
135.android.permission.ACCESS_WIFI_STATE
允许程序获取当前WiFi接入的状态以及WLAN热点的信息
136.android.permission.ACCESS_SURFACE_FLINGER
Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图
137.android.permission.ACCESS_NETWORK_STATE
允许程序获取网络信息状态,如当前的网络连接是否有效
138.android.permission.ACCESS_MOCK_LOCATION
允许程序获取模拟定位信息,一般用于帮助开发者调试应用
139.android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
允许程序访问额外的定位提供者指令
140.android.permission.ACCESS_FINE_LOCATION
允许程序通过GPS芯片接收卫星的定位信息
141.android.permission.ACCESS_COARSE_LOCATION
允许程序通过WiFi或移动基站的方式获取用户错略的经纬度信息
142.android.permission.ACCESS_CHECKIN_PROPERTIES
允许程序读取或写入登记check-in数据库属性表的权限
文章转载:https://blog.csdn.net/hai_qing_xu_kong/article/details/24265533
转载别人的 原文地址文章末尾有,记录下
1.android.permission.WRITE_USER_DICTIONARY
允许应用程序向用户词典中写入新词
2.android.permission.WRITE_SYNC_SETTINGS
写入Google在线同步设置
3.android.permission.WRITE_SOCIAL_STREAM
读取用户的社交信息流
4.android.permission.WRITE_SMS
允许程序写短信
5.android.permission.WRITE_SETTINGS
允许程序读取或写入系统设置
6.android.permission.WRITE_SECURE_SETTINGS
允许应用程序读取或写入安全系统设置
7.android.permission.WRITE_PROFILE
允许程序写入个人资料数据
8.com.android.browser.permission.WRITE_HISTORY_BOOKMARKS
允许一个应用程序写(但不可读)用户的浏览历史和书签
9.android.permission.WRITE_GSERVICES
允许程序修改Google服务地图
10.android.permission.WRITE_EXTERNAL_STORAGE
允许程序写入外部存储,如SD卡上写文件
11.android.permission.WRITE_CONTACTS
写入联系人,但不可读取
12.android.permission.WRITE_CALL_LOG
允许程序写入(但是不能读)用户的联系人数据
13.android.permission.WRITE_CALENDAR
允许程序写入日程,但不可读取
14.android.permission.WRITE_APN_SETTINGS
允许程序写入网络GPRS接入点设置
15.android.permission.WAKE_LOCK
允许程序在手机屏幕关闭后后台进程仍然运行
16.android.permission.VIBRATE
允许程序振动
17.android.permission.USE_SIP
允许程序使用SIP视频服务
18.android.permission.USE_CREDENTIALS
允许程序请求验证从AccountManager
19.android.permission.UPDATE_DEVICE_STATS
允许程序更新设备状态
20.com.android.launcher.permission.UNINSTALL_SHORTCUT
删除快捷方式
21.android.permission.TRANSMIT_IR
允许使用设备的红外发射器,如果可用
22.android.permission.SYSTEM_ALERT_WINDOW
允许程序显示系统窗口
23.android.permission.SUBSCRIBED_FEEDS_WRITE
允许程序写入或修改订阅内容的数据库
24.android.permission.SUBSCRIBED_FEEDS_READ
允许程序访问订阅信息的数据库
22.android.permission.STATUS_BAR
允许程序打开、关闭、禁用状态栏
23.android.permission.SIGNAL_PERSISTENT_PROCESSES
允许程序发送一个永久的进程信号
24.android.permission.SET_WALLPAPER_HINTS
允许程序设置壁纸建议
25.android.permission.SET_WALLPAPER
允许程序设置桌面壁纸
26.android.permission.SET_TIME_ZONE
允许程序设置系统时区
27.android.permission.SET_TIME
允许程序设置系统时间
28.android.permission.SET_PROCESS_LIMIT
允许程序设置最大的进程数量的限制
29.android.permission.SET_PREFERRED_APPLICATIONS
允许程序设置应用的参数,已不再工作具体查看addPackageToPreferred(String) 介绍
30.android.permission.SET_POINTER_SPEED
无法被第三方应用获得,系统权限
31.android.permission.SET_ORIENTATION
允许程序设置屏幕方向为横屏或标准方式显示,不用于普通应用
32.android.permission.SET_DEBUG_APP
允许程序设置调试程序,一般用于开发
33.android.permission.SET_ANIMATION_SCALE
允许程序设置全局动画缩放
34.android.permission.SET_ALWAYS_FINISH
允许程序设置程序在后台是否总是退出
36.com.android.alarm.permission.SET_ALARM
允许程序设置闹铃提醒
37.android.permission.SET_ACTIVITY_WATCHER
允许程序设置Activity观察器一般用于monkey测试
38.android.permission.SEND_SMS
允许程序发送短信
39.android.permission.SEND_RESPOND_VIA_MESSAGE
允许用户在来电的时候用你的应用进行即时的短信息回复。
40.android.permission.RESTART_PACKAGES
允许程序结束任务通过restartPackage(String)方法,该方式将在外来放弃
41.android.permission.REORDER_TASKS
允许程序重新排序系统Z轴运行中的任务
42.android.permission.RECORD_AUDIO
允许程序录制声音通过手机或耳机的麦克
43.android.permission.RECEIVE_WAP_PUSH
允许程序接收WAP PUSH信息
44.android.permission.RECEIVE_SMS
允许程序接收短信
45.android.permission.RECEIVE_MMS
允许程序接收彩信
46.android.permission.RECEIVE_BOOT_COMPLETED
允许程序开机自动运行
47.android.permission.REBOOT
允许程序重新启动设备
48.android.permission.READ_USER_DICTIONARY
从一个提供器中获取数据,针对对应的提供器,应用程序需要“读访问权限”
49.android.permission.READ_SYNC_STATS
允许程序读取同步状态,获得Google在线同步状态
50.android.permission.READ_SYNC_SETTINGS
允许程序读取同步设置,读取Google在线同步设置
51.android.permission.READ_SOCIAL_STREAM
读取用户的社交信息流
52.android.permission.READ_SMS
允许程序读取短信内容
53.android.permission.READ_PROFILE
访问用户个人资料
54.android.permission.READ_PHONE_STATE
允许程序访问电话状态
55.android.permission.READ_LOGS
允许程序读取系统底层日志
56.android.permission.READ_INPUT_STATE
允许程序读取当前键的输入状态,仅用于系统
57.com.android.browser.permission.READ_HISTORY_BOOKMARKS
允许程序读取浏览器收藏夹和历史记录
58.android.permission.READ_FRAME_BUFFER
允许程序读取帧缓存用于屏幕截图
59.android.permission.READ_EXTERNAL_STORAGE
程序可以读取设备外部存储空间(内置SDcard和外置SDCard)的文件,如果您的App已经添加了“WRITE_EXTERNAL_STORAGE ”权限 ,则就没
必要添加读的权限了,写权限已经包含了读权限了。
60.android.permission.READ_CONTACTS
允许程序访问联系人通讯录信息
61.android.permission.READ_CALL_LOG
读取通话记录
62.android.permission.READ_CALENDAR
允许程序读取用户的日程信息
63.android.permission.PROCESS_OUTGOING_CALLS
允许程序监视,修改或放弃播出电话
64.android.permission.PERSISTENT_ACTIVITY
允许程序创建一个永久的Activity,该功能标记为将来将被移除
65.android.permission.NFC
允许程序执行NFC近距离通讯操作,用于移动支持
66.android.permission.MOUNT_UNMOUNT_FILESYSTEMS
允许程序挂载、反挂载外部文件系统
67.android.permission.MOUNT_FORMAT_FILESYSTEMS
允许程序格式化可移动文件系统,比如格式化清空SD卡
68.android.permission.MODIFY_PHONE_STATE
允许程序修改电话状态,如飞行模式,但不包含替换系统拨号器界面
69.android.permission.MODIFY_AUDIO_SETTINGS
允许程序修改声音设置信息
70.android.permission.MEDIA_CONTENT_CONTROL
允许一个应用程序知道什么是播放和控制其内容。不被第三方应用使用。
71.android.permission.MASTER_CLEAR
允许程序执行软格式化,删除系统配置信息
72.android.permission.MANAGE_DOCUMENTS
允许一个应用程序来管理文档的访问,通常是一个文档选择器部分
73.android.permission.MANAGE_APP_TOKENS
管理创建、摧毁、Z轴顺序,仅用于系统
74.android.permission.MANAGE_ACCOUNTS
允许程序管理AccountManager中的账户列表
75.android.permission.LOCATION_HARDWARE
允许一个应用程序中使用定位功能的硬件,不使用第三方应用
76.android.permission.KILL_BACKGROUND_PROCESSES
允许程序调用killBackgroundProcesses(String).方法结束后台进程
77.android.permission.INTERNET
允许程序访问网络连接,可能产生GPRS流量
78.android.permission.INTERNAL_SYSTEM_WINDOW
允许程序打开内部窗口,不对第三方应用程序开放此权限
79.com.android.launcher.permission.INSTALL_SHORTCUT
创建快捷方式
80.android.permission.INSTALL_PACKAGES
允许程序安装应用
81.android.permission.INSTALL_LOCATION_PROVIDER
允许程序安装定位提供
82.android.permission.INJECT_EVENTS
允许程序访问本程序的底层事件,获取按键、轨迹球的事件流
83.android.permission.HARDWARE_TEST
允许程序访问硬件辅助设备,用于硬件测试
84.android.permission.GLOBAL_SEARCH
允许程序允许全局搜索
85.android.permission.GET_TOP_ACTIVITY_INFO
允许一个应用程序检索私有信息是当前最顶级的活动,不被第三方应用使用
86.android.permission.GET_TASKS
允许程序获取任务信息
87.android.permission.GET_PACKAGE_SIZE
允许程序获取应用的文件大小
88.android.permission.GET_ACCOUNTS
允许程序访问账户Gmail列表
89.android.permission.FORCE_BACK
允许程序强制使用back后退按键,无论Activity是否在顶层
90.android.permission.FLASHLIGHT
允许访问闪光灯
91.android.permission.FACTORY_TEST
允许程序运行工厂测试模式
92.android.permission.EXPAND_STATUS_BAR
允许程序扩展或收缩状态栏
93.android.permission.DUMP
允许程序获取系统dump信息从系统服务
94.android.permission.DISABLE_KEYGUARD
允许程序禁用键盘锁
95.android.permission.DIAGNOSTIC
允许程序到RW到诊断资源
96.android.permission.DEVICE_POWER
允许程序访问底层电源管理
97.android.permission.DELETE_PACKAGES
允许程序删除应用
98.android.permission.DELETE_CACHE_FILES
允许程序删除缓存文件
99.android.permission.CONTROL_LOCATION_UPDATES
允许程序获得移动网络定位信息改变
100.android.permission.CLEAR_APP_USER_DATA
允许程序清除用户数据
101.android.permission.CLEAR_APP_CACHE
允许程序清除应用缓存
102.android.permission.CHANGE_WIFI_STATE
允许程序改变WiFi状态
103.android.permission.CHANGE_WIFI_MULTICAST_STATE
允许程序改变WiFi多播状态
104.android.permission.CHANGE_NETWORK_STATE
允许程序改变网络状态,如是否联网
105.android.permission.CHANGE_CONFIGURATION
允许当前应用改变配置,如定位
106.android.permission.CHANGE_COMPONENT_ENABLED_STATE
改变组件是否启用状态
107.android.permission.CAPTURE_VIDEO_OUTPUT
允许一个应用程序捕获视频输出,不被第三方应用使用
108.android.permission.CAPTURE_SECURE_VIDEO_OUTPUT
允许一个应用程序捕获视频输出。不被第三方应用使用
109.android.permission.CAPTURE_AUDIO_OUTPUT
允许一个应用程序捕获音频输出。不被第三方应用使用
110.android.permission.CAMERA
允许程序访问摄像头进行拍照
111.android.permission.CALL_PRIVILEGED
允许程序拨打电话,替换系统的拨号器界面
112.android.permission.CALL_PHONE
允许程序从非系统拨号器里拨打电话
113.android.permission.BROADCAST_WAP_PUSH
WAP PUSH服务收到后触发一个广播
114.android.permission.BROADCAST_STICKY
允许程序收到广播后快速收到下一个广播
115.android.permission.BROADCAST_SMS
允许程序当收到短信时触发一个广播
116.android.permission.BROADCAST_PACKAGE_REMOVED
允许程序删除时广播
117.android.permission.BRICK
能够禁用手机,非常危险,顾名思义就是让手机变成砖头
118.android.permission.BLUETOOTH_PRIVILEGED
允许应用程序配对蓝牙设备,而无需用户交互。这不是第三方应用程序可用。
119.android.permission.BLUETOOTH_ADMIN
允许程序进行发现和配对新的蓝牙设备
120.android.permission.BLUETOOTH
允许程序连接配对过的蓝牙设备
121.android.permission.BIND_WALLPAPER
必须通过WallpaperService服务来请求,只有系统才能用
122.android.permission.BIND_VPN_SERVICE
绑定VPN服务
必须通过VpnService服务来请求,只有系统才能用
123.android.permission.BIND_TEXT_SERVICE
必须要求textservice(例如吗 spellcheckerservice),以确保只有系统可以绑定到它。
124.android.permission.BIND_REMOTEVIEWS
必须通过RemoteViewsService服务来请求,只有系统才能用
125.android.permission.BIND_PRINT_SERVICE
必须要求由printservice,以确保只有系统可以绑定到它。
126.android.permission.BIND_NOTIFICATION_LISTENER_SERVICE
必须要求由notificationlistenerservice,以确保只有系统可以绑定到它。
127.android.permission.BIND_NFC_SERVICE
由hostapduservice或offhostapduservice必须确保只有系统可以绑定到它。
128.android.permission.BIND_INPUT_METHOD
请求InputMethodService服务,只有系统才能使用
129.android.permission.BIND_DEVICE_ADMIN
请求系统管理员接收者receiver,只有系统才能使用
130.android.permission.BIND_APPWIDGET
允许程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限
131.android.permission.BIND_ACCESSIBILITY_SERVICE
请求accessibilityservice服务,以确保只有系统可以绑定到它。
132.android.permission.AUTHENTICATE_ACCOUNTS
允许程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息
133.com.android.voicemail.permission.ADD_VOICEMAIL
允许一个应用程序添加语音邮件系统
134.android.permission.ACCOUNT_MANAGER
允许程序获取账户验证信息,主要为GMail账户信息,只有系统级进程才能访问的权限
135.android.permission.ACCESS_WIFI_STATE
允许程序获取当前WiFi接入的状态以及WLAN热点的信息
136.android.permission.ACCESS_SURFACE_FLINGER
Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图
137.android.permission.ACCESS_NETWORK_STATE
允许程序获取网络信息状态,如当前的网络连接是否有效
138.android.permission.ACCESS_MOCK_LOCATION
允许程序获取模拟定位信息,一般用于帮助开发者调试应用
139.android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
允许程序访问额外的定位提供者指令
140.android.permission.ACCESS_FINE_LOCATION
允许程序通过GPS芯片接收卫星的定位信息
141.android.permission.ACCESS_COARSE_LOCATION
允许程序通过WiFi或移动基站的方式获取用户错略的经纬度信息
142.android.permission.ACCESS_CHECKIN_PROPERTIES
允许程序读取或写入登记check-in数据库属性表的权限
文章转载:https://blog.csdn.net/hai_qing_xu_kong/article/details/24265533
收起阅读 »
php编程中如何避免调用in_array()函数出错问题
php开发过程中,经常会遇到判断一维数组中是否含有某个元素,这是会用到in_array();由于php是弱类型的语言,所以不小心的话,也会踩到“坑”。(注:这里测试用到的php版本是5.6。)那么具体该如何注意呢?下面就来跟大家分享一些实用经验。
一、前方有坑
直接上代码:
$arr = ['php在路上',1];
echo in_array(true,$arr) ? 1 : 0;
echo in_array(0,$arr) ? 1 : 0;
结果:
11
二、为啥有坑
其实,从底层源码上来说,in_array()也是用了循环逐个比较的方法。而前几期我们说了,’php在路上’==true,’php在路上’==0这两个是成立的。
看了网上,有人使用for来判断。
php是弱类型语言,对变量的定义和使用不是严格,多数的“坑”都是来源于这一点。不过,这个“坑”php语言表示不背这个坑,in_array()函数表示委屈。
这是使用者对in_array()的用法没好好看手册的原因,看手册:
函数:
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
参数:
needle:要查找的值。
haystack:查找的数组
strict:是否严格匹配,TRUE 或者 FALSE
返回值
如果找到 needle 则返回 TRUE,否则返回 FALSE。
重点来了,关键在第三个参数:strict,如果为TRUE,会先比较类型再比较值。默认为false,false,false,false……原因在这!
so,在使用in_array()函数的时候别省略第三个参数。
三、防坑扩展
1、在in_array()函数中,needle参数是区分大小写的。
2、有时候在数组搜索给定的值时,如果还想知道给定值所在的索引,那就会用到array_search()函数。这个函数也是有第三个参数的,也是表示是否严格匹配。
另外,由于array_search()函数返回的是给定值所在的索引,所以返回值可能是0或者false,所以在后续的判断是否存在给定值的时候,要使用“===”来判断。
如:
$arr = ['12',13,'php在路上'];
echo array_search('12',$arr,true)===false ? '没找到' : '找到了';
四、防坑互动
看代码:
$arr = ['php在路上',12,'',['我是字符串']];
echo in_array([0],$arr) ? 1 : 0;
现在大家清楚为什么在调用in_array()时出错了吧,那么在以后的编码中一定要注意了,如果还是存在不理解的地方或者有其他方面开发疑问的话,都是可以留言咨询获取帮助的。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,转载请注明出处及作者。
php开发过程中,经常会遇到判断一维数组中是否含有某个元素,这是会用到in_array();由于php是弱类型的语言,所以不小心的话,也会踩到“坑”。(注:这里测试用到的php版本是5.6。)那么具体该如何注意呢?下面就来跟大家分享一些实用经验。
一、前方有坑
直接上代码:
$arr = ['php在路上',1];
echo in_array(true,$arr) ? 1 : 0;
echo in_array(0,$arr) ? 1 : 0;
结果:
11
二、为啥有坑
其实,从底层源码上来说,in_array()也是用了循环逐个比较的方法。而前几期我们说了,’php在路上’==true,’php在路上’==0这两个是成立的。
看了网上,有人使用for来判断。
php是弱类型语言,对变量的定义和使用不是严格,多数的“坑”都是来源于这一点。不过,这个“坑”php语言表示不背这个坑,in_array()函数表示委屈。
这是使用者对in_array()的用法没好好看手册的原因,看手册:
函数:
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
参数:
needle:要查找的值。
haystack:查找的数组
strict:是否严格匹配,TRUE 或者 FALSE
返回值
如果找到 needle 则返回 TRUE,否则返回 FALSE。
重点来了,关键在第三个参数:strict,如果为TRUE,会先比较类型再比较值。默认为false,false,false,false……原因在这!
so,在使用in_array()函数的时候别省略第三个参数。
三、防坑扩展
1、在in_array()函数中,needle参数是区分大小写的。
2、有时候在数组搜索给定的值时,如果还想知道给定值所在的索引,那就会用到array_search()函数。这个函数也是有第三个参数的,也是表示是否严格匹配。
另外,由于array_search()函数返回的是给定值所在的索引,所以返回值可能是0或者false,所以在后续的判断是否存在给定值的时候,要使用“===”来判断。
如:
$arr = ['12',13,'php在路上'];
echo array_search('12',$arr,true)===false ? '没找到' : '找到了';
四、防坑互动
看代码:
$arr = ['php在路上',12,'',['我是字符串']];
echo in_array([0],$arr) ? 1 : 0;
现在大家清楚为什么在调用in_array()时出错了吧,那么在以后的编码中一定要注意了,如果还是存在不理解的地方或者有其他方面开发疑问的话,都是可以留言咨询获取帮助的。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,转载请注明出处及作者。
收起阅读 »
H5手写签名,上传图片到服务器
先看看效果:
图片保存到服务器为png格式,一般10k左右。
这个功能适用于H5app,或者H5,或者pc网页端(IE9以上,支持canvas),
低端安卓机依然不支持,具体低端到什么程度,没有经过测试。
更详细的说明请移步:https://blog.csdn.net/moniteryao/article/details/82263653
下载完整demo请点击:https://download.csdn.net/download/moniteryao/10639108
先看看效果:
图片保存到服务器为png格式,一般10k左右。
这个功能适用于H5app,或者H5,或者pc网页端(IE9以上,支持canvas),
低端安卓机依然不支持,具体低端到什么程度,没有经过测试。
更详细的说明请移步:https://blog.csdn.net/moniteryao/article/details/82263653
下载完整demo请点击:https://download.csdn.net/download/moniteryao/10639108

郑州app开发价格的影响因素分析
要说郑州app开发公司给出的app开发价格影响因素很多,包括:功能复杂程度、开发技术人员成本、时间成本、地域条件等。可能大家觉得app开发不应该这么贵,那么下面就为大家来详细的分析一下,看完大家就知道为什么有些app开发价格贵了。
1、功能复杂程度:一款app功能复杂程度。前后端的功能,交互功能等尤为重要。如果这几方功能都比较复杂,报价肯定不会太低了。很多客户在沟通需求的时候,对功能需求定位不是很准确。不够细化,导致客户认为功能很简单,其实比较复杂。比如,电商商家入驻,客户觉得很简单,但是涉及到的即时聊天,用户评论,收藏店铺等等一系列都是需要考虑的。
2、人员成本:人员成本可谓是老生常谈了。一个app开发项目都是需要的组成完善的技术开发团队。项目经理、产品经理、UI设计师、前端工程师、后端工程师、安卓工程师,IOS工程师(需要IOS版),测试工程师等技术开发人员。所有技术人员的薪资加起来这个费用占据非常大,甚至占到项目的三分之一到二分之一。
3、时间成本:app开发项目一般都有开发周期的。目前时间成本有两种情况。一种常规的:开发周期越长,成本越贵。一种是加急情况,加急,特定情况下,时间越短,开发难度越高,当然开发价格肯定会比较贵的。
4、地域成本:app开发价格和地域也是息息相关的。一般而言,一线城市的开发价格比三四线城市开发价格要贵一点。但是,一线城市开发公司的能力如互联互加科技肯定要比三四线开发公司要强上不少。
在不了解app开发公司情况下,尽可能还是到app开发服务公司进行洽谈,不仅可以确定功能需求,app开发的详情报价表,还可以直接与项目经理及产品经理沟通,可以了解公司情况,办公环境(好的开发公司办公场所也是比较高大上的),公司人员等情况再做决定。信息来源郑州app开发公司燚轩科技整理发布,如需转载请注明出处!
要说郑州app开发公司给出的app开发价格影响因素很多,包括:功能复杂程度、开发技术人员成本、时间成本、地域条件等。可能大家觉得app开发不应该这么贵,那么下面就为大家来详细的分析一下,看完大家就知道为什么有些app开发价格贵了。
1、功能复杂程度:一款app功能复杂程度。前后端的功能,交互功能等尤为重要。如果这几方功能都比较复杂,报价肯定不会太低了。很多客户在沟通需求的时候,对功能需求定位不是很准确。不够细化,导致客户认为功能很简单,其实比较复杂。比如,电商商家入驻,客户觉得很简单,但是涉及到的即时聊天,用户评论,收藏店铺等等一系列都是需要考虑的。
2、人员成本:人员成本可谓是老生常谈了。一个app开发项目都是需要的组成完善的技术开发团队。项目经理、产品经理、UI设计师、前端工程师、后端工程师、安卓工程师,IOS工程师(需要IOS版),测试工程师等技术开发人员。所有技术人员的薪资加起来这个费用占据非常大,甚至占到项目的三分之一到二分之一。
3、时间成本:app开发项目一般都有开发周期的。目前时间成本有两种情况。一种常规的:开发周期越长,成本越贵。一种是加急情况,加急,特定情况下,时间越短,开发难度越高,当然开发价格肯定会比较贵的。
4、地域成本:app开发价格和地域也是息息相关的。一般而言,一线城市的开发价格比三四线城市开发价格要贵一点。但是,一线城市开发公司的能力如互联互加科技肯定要比三四线开发公司要强上不少。
在不了解app开发公司情况下,尽可能还是到app开发服务公司进行洽谈,不仅可以确定功能需求,app开发的详情报价表,还可以直接与项目经理及产品经理沟通,可以了解公司情况,办公环境(好的开发公司办公场所也是比较高大上的),公司人员等情况再做决定。信息来源郑州app开发公司燚轩科技整理发布,如需转载请注明出处!
收起阅读 »
wap2app检测版本升级
参考官方文档 http://ask.dcloud.net.cn/article/12895,已完成ios及Android 更新检测,需打包测试使用:
【ps:在app.js文本的onLaunch方法中代码添加以下代码】
var ua = navigator.userAgent;
if(ua.indexOf('Html5Plus')>-1 && ua.indexOf('StreamApp')==-1){
var url = "http://*********.com/update/down";//检查更新地址
var req = {//升级检测数据
"appid": plus.runtime.appid,
"version": plus.runtime.version,
"plus":plus.os.name //区分系统
};
wap2app.ajax.get(url, req, function(rsp) {
if(rsp && rsp.status){
//需要更新,提示用户
plus.nativeUI.confirm(rsp.note, function(event) {
if(0 == event.index) {//用户点击了“立即更新”按钮
plus.runtime.openURL(rsp.url);
}
}, rsp.title, ["立即更新", "取 消"]);
}
});
}
【php为例,后台代码】:
public function down(){
$appid = $_GET['appid'];
$version = $_GET['version'];//客户端版本号
$os= $_GET['plus']; //系统
$rsp = array('status' => 0);//默认返回值,不需要升级;
if (isset($appid) && isset($version)) {
if($appid=="__W2A__*****.com"){//校验appid
if($version !== "1.2"){ //最新版本号
$rsp['status'] = 1;
$rsp['title'] = "应用更新";
$rsp['note'] = "添加检测版本升级;";//release notes,支持换行
if($os == 'Android'){
$rsp['url'] = "http://******/android.apk";//应用升级包下载地址
}else{
$rsp['url'] = "https://itunes.apple.com/cn/app/*****************";//应用升级包下载地址
}
}
}
}
exit(json_encode($rsp));
}
参考官方文档 http://ask.dcloud.net.cn/article/12895,已完成ios及Android 更新检测,需打包测试使用:
【ps:在app.js文本的onLaunch方法中代码添加以下代码】
var ua = navigator.userAgent;
if(ua.indexOf('Html5Plus')>-1 && ua.indexOf('StreamApp')==-1){
var url = "http://*********.com/update/down";//检查更新地址
var req = {//升级检测数据
"appid": plus.runtime.appid,
"version": plus.runtime.version,
"plus":plus.os.name //区分系统
};
wap2app.ajax.get(url, req, function(rsp) {
if(rsp && rsp.status){
//需要更新,提示用户
plus.nativeUI.confirm(rsp.note, function(event) {
if(0 == event.index) {//用户点击了“立即更新”按钮
plus.runtime.openURL(rsp.url);
}
}, rsp.title, ["立即更新", "取 消"]);
}
});
}
【php为例,后台代码】:
public function down(){
$appid = $_GET['appid'];
$version = $_GET['version'];//客户端版本号
$os= $_GET['plus']; //系统
$rsp = array('status' => 0);//默认返回值,不需要升级;
if (isset($appid) && isset($version)) {
if($appid=="__W2A__*****.com"){//校验appid
if($version !== "1.2"){ //最新版本号
$rsp['status'] = 1;
$rsp['title'] = "应用更新";
$rsp['note'] = "添加检测版本升级;";//release notes,支持换行
if($os == 'Android'){
$rsp['url'] = "http://******/android.apk";//应用升级包下载地址
}else{
$rsp['url'] = "https://itunes.apple.com/cn/app/*****************";//应用升级包下载地址
}
}
}
}
exit(json_encode($rsp));
}
收起阅读 »

解决Vue和mui组件(包括scroll和上拉下拉刷新)的冲突
由于Vue是异步渲染,所以我们必须把mui的组件再dom更新完成后再初始化,具体怎么操作呢:
1/在plusready之外实例化vue!
var vm = new Vue({.....});
mui.plusReady(function(){
......
});
2/在vue渲染完成dom后再实例化mui组件:
如:
mui.ajax(url,......success:function(data){
vm.list = data.list;
vm.$nextTick(function () {
//初始化轮播组件
gallery = mui('.mui-slider');
gallery.slider();
var deceleration = mui.os.ios?0.003:0.0009;
//初始化滚动组件
mui('.mui-scroll-wrapper').scroll({
bounce: true,
indicators: false, //是否显示滚动条
deceleration:deceleration
});
});
由于Vue是异步渲染,所以我们必须把mui的组件再dom更新完成后再初始化,具体怎么操作呢:
1/在plusready之外实例化vue!
var vm = new Vue({.....});
mui.plusReady(function(){
......
});
2/在vue渲染完成dom后再实例化mui组件:
如:
mui.ajax(url,......success:function(data){
vm.list = data.list;
vm.$nextTick(function () {
//初始化轮播组件
gallery = mui('.mui-slider');
gallery.slider();
var deceleration = mui.os.ios?0.003:0.0009;
//初始化滚动组件
mui('.mui-scroll-wrapper').scroll({
bounce: true,
indicators: false, //是否显示滚动条
deceleration:deceleration
});
});
收起阅读 »

uni-app 整包升级/更新方案
官方已发布APP升级中心,支持原生APP整包升级和wgt资源包升级,我们强烈推荐您使用,详见https://uniapp.dcloud.io/uniCloud/upgrade-center
==================================
如下是官方APP升级中心发布之前的文章,供老用户参考,新用户推荐使用https://uniapp.dcloud.io/uniCloud/upgrade-center。
使用 uni-app 开发,可将代码编译到iOS、Android、微信小程序等多个平台,升级时也需考虑多平台同步升级。
uni-app发布为小程序的升级模式较简单,只需将开发完的代码提交小程序后台,待审核通过后用户将自动升级。
App端的升级,又分为整包更新和资源热更新两种。
- 整包更新,即常规的整个App安装包重新下载安装。
- 资源热更新,即App并重新安装,里面的js等前端代码进行更新。
资源热更新另见文档:http://ask.dcloud.net.cn/article/35667
本文重点讲解整包更新。
一般iOS Appstore的安装包,无法直接更新。App启动后检查有新版本,只能调整到Appstore,然后用户在Appstore的详情页点击更新按钮。
而Android App,可以直接下载新的apk,只要包名和证书不变,就可以覆盖安装。
App升级,强烈推荐使用uniCloud。
- 把apk存放到uniCloud的cdn上,可以免费使用
- 有现成的插件,不用写升级逻辑,打好安装包,发布管理,检查升级都可以直接用,详见:https://ext.dcloud.net.cn/plugin?id=4470
如果不使用uniCloud,自己也可以写升级逻辑,下文讲解了常见的逻辑,但下文不是DCloud约定的强制逻辑,只是一般性常见做法的介绍。
接口约定
如下数据接口约定仅为示例,开发者可以自定义接口参数。
请求地址:https://www.example.com/update
请求方法:GET
请求数据:
{
"appid": plus.runtime.appid,
"version": plus.runtime.version
}
响应数据:
{
"status":1,//升级标志,1:需要升级;0:无需升级
"note": "修复bug1;\n修复bug2;",//release notes
"url": "http://www.example.com/uniapp.apk" //更新包下载地址
}
客户端实现
App启动时,向服务端上报当前版本号,服务端判断是否提示升级。
在App.vue的onLaunch中,发起升级检测请求,如下:
onLaunch: function () {
//#ifdef APP-PLUS
var server = "https://www.example.com/update"; //检查更新地址
var req = { //升级检测数据
"appid": plus.runtime.appid,
"version": plus.runtime.version
};
uni.request({
url: server,
data: req,
success: (res) => {
if (res.statusCode == 200 && res.data.status === 1) {
uni.showModal({ //提醒用户更新
title: "更新提示",
content: res.data.note,
success: (res) => {
if (res.confirm) {
plus.runtime.openURL(res.data.url);
}
}
})
}
}
})
//#endif
}
注意:App的升级检测代码必须使用条件编译,否则在非App环境由于不存在plus相关API,将会报错。
升级地址URL,如果是自行托管的App,就提供自己的包地址。如果是打开应用市场,那URL如下:
if (plus.os.name=="Android") {
appurl = "market://details?id=io.dcloud.hellouniapp"; //这个是通用应用市场,如果想指定某个应用商店,需要单独查这个应用商店的包名或scheme及参数
}
else{
appurl = "itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253";
}
服务端实现
根据客户端上报的版本号,比对服务端最新版本号,决定是否需要升级,若需升级则返回升级信息(rease notes、更新包地址等)
实现示例:
- 【推荐】通过uniCloud的云函数模板,快速实现升级检查逻辑,详情参考:https://ext.dcloud.net.cn/plugin?id=4470
- php示例代码:
header("Content-type:text/json");
$appid = $_GET["appid"];
$version = $_GET["version"]; //客户端版本号
$rsp = array("status" => 0); //默认返回值,不需要升级
if (isset($appid) && isset($version)) {
if ($appid === "__UNI__123456") { //校验appid
if ($version !== "1.0.1") { //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中
$rsp["status"] = 1;
$rsp["note"] = "修复bug1;\n修复bug2;"; //release notes
$rsp["url"] = "http://www.example.com/uniapp.apk"; //应用升级包下载地址
}
}
}
echo json_encode($rsp);
exit;
常见问题
- 版本检测需要打包app,真机运行基座无法测试。因为真机运行的plus.runtime.version是固定值。
官方已发布APP升级中心,支持原生APP整包升级和wgt资源包升级,我们强烈推荐您使用,详见https://uniapp.dcloud.io/uniCloud/upgrade-center
==================================
如下是官方APP升级中心发布之前的文章,供老用户参考,新用户推荐使用https://uniapp.dcloud.io/uniCloud/upgrade-center。
使用 uni-app 开发,可将代码编译到iOS、Android、微信小程序等多个平台,升级时也需考虑多平台同步升级。
uni-app发布为小程序的升级模式较简单,只需将开发完的代码提交小程序后台,待审核通过后用户将自动升级。
App端的升级,又分为整包更新和资源热更新两种。
- 整包更新,即常规的整个App安装包重新下载安装。
- 资源热更新,即App并重新安装,里面的js等前端代码进行更新。
资源热更新另见文档:http://ask.dcloud.net.cn/article/35667
本文重点讲解整包更新。
一般iOS Appstore的安装包,无法直接更新。App启动后检查有新版本,只能调整到Appstore,然后用户在Appstore的详情页点击更新按钮。
而Android App,可以直接下载新的apk,只要包名和证书不变,就可以覆盖安装。
App升级,强烈推荐使用uniCloud。
- 把apk存放到uniCloud的cdn上,可以免费使用
- 有现成的插件,不用写升级逻辑,打好安装包,发布管理,检查升级都可以直接用,详见:https://ext.dcloud.net.cn/plugin?id=4470
如果不使用uniCloud,自己也可以写升级逻辑,下文讲解了常见的逻辑,但下文不是DCloud约定的强制逻辑,只是一般性常见做法的介绍。
接口约定
如下数据接口约定仅为示例,开发者可以自定义接口参数。
请求地址:https://www.example.com/update
请求方法:GET
请求数据:
{
"appid": plus.runtime.appid,
"version": plus.runtime.version
}
响应数据:
{
"status":1,//升级标志,1:需要升级;0:无需升级
"note": "修复bug1;\n修复bug2;",//release notes
"url": "http://www.example.com/uniapp.apk" //更新包下载地址
}
客户端实现
App启动时,向服务端上报当前版本号,服务端判断是否提示升级。
在App.vue的onLaunch中,发起升级检测请求,如下:
onLaunch: function () {
//#ifdef APP-PLUS
var server = "https://www.example.com/update"; //检查更新地址
var req = { //升级检测数据
"appid": plus.runtime.appid,
"version": plus.runtime.version
};
uni.request({
url: server,
data: req,
success: (res) => {
if (res.statusCode == 200 && res.data.status === 1) {
uni.showModal({ //提醒用户更新
title: "更新提示",
content: res.data.note,
success: (res) => {
if (res.confirm) {
plus.runtime.openURL(res.data.url);
}
}
})
}
}
})
//#endif
}
注意:App的升级检测代码必须使用条件编译,否则在非App环境由于不存在plus相关API,将会报错。
升级地址URL,如果是自行托管的App,就提供自己的包地址。如果是打开应用市场,那URL如下:
if (plus.os.name=="Android") {
appurl = "market://details?id=io.dcloud.hellouniapp"; //这个是通用应用市场,如果想指定某个应用商店,需要单独查这个应用商店的包名或scheme及参数
}
else{
appurl = "itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253";
}
服务端实现
根据客户端上报的版本号,比对服务端最新版本号,决定是否需要升级,若需升级则返回升级信息(rease notes、更新包地址等)
实现示例:
- 【推荐】通过uniCloud的云函数模板,快速实现升级检查逻辑,详情参考:https://ext.dcloud.net.cn/plugin?id=4470
- php示例代码:
header("Content-type:text/json");
$appid = $_GET["appid"];
$version = $_GET["version"]; //客户端版本号
$rsp = array("status" => 0); //默认返回值,不需要升级
if (isset($appid) && isset($version)) {
if ($appid === "__UNI__123456") { //校验appid
if ($version !== "1.0.1") { //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中
$rsp["status"] = 1;
$rsp["note"] = "修复bug1;\n修复bug2;"; //release notes
$rsp["url"] = "http://www.example.com/uniapp.apk"; //应用升级包下载地址
}
}
}
echo json_encode($rsp);
exit;
常见问题
- 版本检测需要打包app,真机运行基座无法测试。因为真机运行的plus.runtime.version是固定值。

个推的推送成功解决
首先声明,个推推送,官方文档是,android可以推送通知和透传消息,ios只能推送透传消息。
但在mui实现的时候,android端推送的通知,点击以后无法监听。经过苦逼的程序猿的苦苦探求,终于发现可以解决的一种方式了:
首先推送的时候,不能用通知推送,用透传消息的方式进行推送(透传消息可以监听到的),然后通过mui的的创建通知的方法,把获取的到的透传消息转为通知,这个时候的通知点击的时候就可以监听了,这个方法本人经过试验,可以成功的。代码如下
document.addEventListener("plusready", function() {
// 监听点击消息事件
plus.push.addEventListener("click", function(msg) {
// showAlert(JSON.stringify(msg))
switch(msg.payload) {
case "LocalMSG":
showAlert("点击通知本地创建消息启动:" + msg.content);
break;
default:
showAlert("点击离线推送消息启动:" + msg.content);
break;
}
}, false);
// 监听在线消息事件
plus.push.addEventListener("receive", function(msg) {
if(msg.aps) { // Apple APNS message
showAlert("接收到在线APNS消息:");
} else {
showAlert("接收到在线透传消息:" + msg.content );
}
createLocalPushMsg(msg);
}, false);
}, false);
function showAlert(tiltle) {
alert(tiltle);
}
function bindAlias(alias) {
var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");
var mainActivity = plus.android.runtimeMainActivity();
var i = PushManager.getInstance().bindAlias(mainActivity, alias);
}
function unbindAlias(alias) {
var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");
var mainActivity = plus.android.runtimeMainActivity();
var i = PushManager.getInstance().unBindAlias(mainActivity, alias);
}
function getClientid() {
var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");
var mainActivity = plus.android.runtimeMainActivity();
return PushManager.getInstance().getClientid(mainActivity);
}
//创建本地通知
function createLocalPushMsg(msg){
var options = {cover:false};
var str = msg.content;
plus.push.createMessage( str, "LocalMSG", options );
}
//拉起服务的代码是这样的 :这个代码经测试,有或没有都可以收到通知消息
function startService() {
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass('android.content.Intent');
var intent = new Intent();
// var serviceName = 'com.igexin.sdk.PushServiceForUser';
var serviceName = 'com.igexin.sdk.PushService';//把这里换成其他Service的名字,也可以实现拉取自定义的Service
intent.setClassName(main, serviceName);
main.startService(intent);
}
首先声明,个推推送,官方文档是,android可以推送通知和透传消息,ios只能推送透传消息。
但在mui实现的时候,android端推送的通知,点击以后无法监听。经过苦逼的程序猿的苦苦探求,终于发现可以解决的一种方式了:
首先推送的时候,不能用通知推送,用透传消息的方式进行推送(透传消息可以监听到的),然后通过mui的的创建通知的方法,把获取的到的透传消息转为通知,这个时候的通知点击的时候就可以监听了,这个方法本人经过试验,可以成功的。代码如下
document.addEventListener("plusready", function() {
// 监听点击消息事件
plus.push.addEventListener("click", function(msg) {
// showAlert(JSON.stringify(msg))
switch(msg.payload) {
case "LocalMSG":
showAlert("点击通知本地创建消息启动:" + msg.content);
break;
default:
showAlert("点击离线推送消息启动:" + msg.content);
break;
}
}, false);
// 监听在线消息事件
plus.push.addEventListener("receive", function(msg) {
if(msg.aps) { // Apple APNS message
showAlert("接收到在线APNS消息:");
} else {
showAlert("接收到在线透传消息:" + msg.content );
}
createLocalPushMsg(msg);
}, false);
}, false);
function showAlert(tiltle) {
alert(tiltle);
}
function bindAlias(alias) {
var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");
var mainActivity = plus.android.runtimeMainActivity();
var i = PushManager.getInstance().bindAlias(mainActivity, alias);
}
function unbindAlias(alias) {
var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");
var mainActivity = plus.android.runtimeMainActivity();
var i = PushManager.getInstance().unBindAlias(mainActivity, alias);
}
function getClientid() {
var PushManager = plus.android.importClass("com.igexin.sdk.PushManager");
var mainActivity = plus.android.runtimeMainActivity();
return PushManager.getInstance().getClientid(mainActivity);
}
//创建本地通知
function createLocalPushMsg(msg){
var options = {cover:false};
var str = msg.content;
plus.push.createMessage( str, "LocalMSG", options );
}
//拉起服务的代码是这样的 :这个代码经测试,有或没有都可以收到通知消息
function startService() {
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass('android.content.Intent');
var intent = new Intent();
// var serviceName = 'com.igexin.sdk.PushServiceForUser';
var serviceName = 'com.igexin.sdk.PushService';//把这里换成其他Service的名字,也可以实现拉取自定义的Service
intent.setClassName(main, serviceName);
main.startService(intent);
}
收起阅读 »