• 关于

    前台首页开发

    的搜索结果

问题

java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架

游客ydre72cd7ywew 2019-12-01 19:52:49 32 浏览量 回答数 0

问题

java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架

游客ydre72cd7ywew 2019-12-01 19:55:56 23 浏览量 回答数 0

问题

java官网源码 门户网站 自适应响应式 freemarker 静态引擎 SSM 框架

游客ydre72cd7ywew 2019-12-01 20:01:28 9 浏览量 回答数 0

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

问题

网站源码由2003开发,如何挂在阿里2008服务器上

seb21 2019-12-01 22:02:03 4226 浏览量 回答数 2

问题

广州.NET男屌求职 热:报错

kun坤 2020-06-08 11:11:12 3 浏览量 回答数 1

回答

概述 App() 代表顶层应用,管理所有页面和全局数据,以及提供生命周期回调等。它 也是一个构造方法,生成 App 实例。 一个小程序就是一个 App 实例。 每个小程序顶层一般包含三个文件。  app.json:应用配置  app.js:应用逻辑  app.acss:应用样式(可选) 简单示例 一个简单的 app.json 代码如下: "pages": [ "pages/index/index", "pages/logs/logs" ], "window": { "defaultTitle": "Demo" } } 这段代码配置指定小程序包含两个页面(index 和 logs),以及应用窗口的默认 标题设置为 “Demo”。 一个简单的 app.js 代码如下: onLaunch(options) { // 第一次打开 }, onShow(options) { // 小程序启动,或从后台被重新打开 }, onHide() { // 小程序从前台进入后台 }, onError(msg) { // 小程序发生脚本错误或 API 调用出现报错 console.log(msg); }, globalData: { // 全局数据 name: 'alipay', }, }); 26 app.json 全局配置 app.json 用于对小程序进行全局配置,设置页面文件的路径、窗口表现、多 tab 等。 以下是一个基本配置示例: "pages": [ "pages/index/index", "pages/logs/index" ], "window": { "defaultTitle": "Demo" } } 完整配置项如下: 属性 类型 是否必填 描述 pages Array 是 设置页面路径 window Object 否 设置默认页面的窗 口表现 tabBar Object 否 设置底部 tabbar 的表现 pages app.json 中的 pages 为数组属性,数组中每一项都是字符串,用于指定小程序 的页面。在小程序中新增或删除页面,都需要对 pages 数组进行修改。 pages 数组的每一项代表对应页面的路径信息,其中,第一项代表小程序的首 页。 页面路径不需要写任何后缀,框架会自动去加载同名的 .json、.js、.axml、.acss 文件。举例来说,如果开发目录为: │ ├──index │ │ ├── index.json │ │ ├── index.js │ │ ├── index.axml │ │ └── index.acss │ ├──logs │ │ ├── logs.json │ │ ├── logs.js │ │ └── logs.axml ├── app.json ├── app.js └── app.acss app.json 中应当如下配置: { "pages":[ "pages/index/index", "pages/logs/logs" ] } window window 用于设置小程序的状态栏、导航条、标题、窗口背景色等。 示例代码: { "window":{ "defaultTitle": "支付宝接口功能演示" } } 属性 类型 是否必 填 描述 最低版本 defaultTitle String 否 页面默认标题 - pullRefresh String 否 是否允许下拉刷新。默认 NO, 备注:下拉刷新生效的 前提是 allowsBounceVertical 值 为 YES allowsBounceV ertical String 否 是否允许向下拉拽。默认 YES, 支持 YES / NO 28 transparentTitl e String 否 导航栏透明设置。默认 none,支持 always 一直透 明 / auto 滑动自适应 / none 不透明 titlePenetrate String 否 是否允许导航栏点击穿透。 默认 NO,支持 YES / NO showTitleLoadi ng String 否 是否进入时显示导航栏的 loading。默认 NO,支持 YES / NO titleImage String 否 导航栏图片地址 - titleBarColor HexCol or 否 导航栏背景色,十六进制颜 色值(0-255) - backgroundCol or HexCol or 否 页面的背景色,十六进制颜 色值(0-255) - backgroundIm ageColor HexCol or 否 下拉露出显示的背景图底 色,十六进制颜色值(0- 255) - backgroundIm ageUrl String 否 下拉露出显示的背景图链接 - gestureBack String 否 iOS 用,是否支持手势返 回。默认 NO,支持 YES / NO enableScrollBa r Boolea n 否 Android 用,是否显示 WebView 滚动条。默认 YES,支持 YES / NO onReachBotto mDistance Number 否 页面上拉触底时触发时距离 页面底部的距离,单位为 px。相关文档页面事件处理 函数 1.19.0 ,目前 iOS 在 page.json 下设 置无效,只能全 局设置。 29 tabBar 如果你的小程序是一个多 tab 应用(客户端窗口的底部栏可以切换页面),那么 可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页 面。 注意:  通过页面跳转(my.navigateTo)或者页面重定向(my.redirectTo)所到达的页面,即使 它是定义在 tabBar 配置中的页面,也不会显示底部的 tab 栏。  tabBar 的第一个页面必须是首页。 tabBar 配置项有以下: 属性 类型 是否必填 描述 textColor HexColor 否 文字颜色 selectedColor HexColor 否 选中文字颜色 backgroundColor HexColor 否 背景色 items Array 是 每个 tab 配置 每个 item 配置: 属性 类型 是否必填 描述 pagePath String 是 设置页面路径 name String 是 名称 icon String 否 平常图标路径 activeIcon String 否 高亮图标路径 icon 图标推荐大小为 60×60 px 大小,系统会对传入的非推荐尺寸的图片进行非 等比拉伸或缩放。 示例代码: "tabBar": { 30 "textColor": "#dddddd", "selectedColor": "#49a9ee", "backgroundColor": "#ffffff", "items": [ { "pagePath": "pages/index/index", "name": "首页" }, { "pagePath": "pages/logs/logs", "name": "日志" } ] } } app.acss 全局样式 app.acss 作为全局样式,作用于当前小程序的所有页面。 ACSS 是一套样式语言,用于描述 AXML 的组件样式,决定 AXML 的组件的显 示效果。 为适应广大前端开发者,ACSS 和 CSS 规则完全一致,100% 可以用。同时为更 适合开发小程序,对 CSS 进行了扩充。 ACSS 支持 px,rpx,vh,vw 等单位。 rpx rpx(responsive pixel)可以根据屏幕宽度进行自适应,规定屏幕宽为 750rpx。以 Apple iPhone6 为例,屏幕宽度为 375px,共有 750 个物理像 素,则 750rpx = 375px = 750 物理像素,1rpx = 0.5px = 1 物理像素。 设备 rpx 换算 px(屏幕宽度 / 750) px 换算 rpx(750 / 屏幕宽 度) iPhone5 1rpx = 0.42px 1px = 2.34rpx iPhone6 1rpx = 0.5px 1px = 2rpx iPhone6 Plus 1rpx = 0.552px 1px = 1.81rpx 样式导入 使用 @import 语句可以导入外联样式表,@import 后需要加上外联样式表相对 路径,用;表示结束。 示例代码: .sm-button { padding: 5px; } /** app.acss **/ @import "./button.acss"; .md-button { padding: 15px; } 导入路径支持从 node_modules 目录载入第三方模块,例如 page.acss: @import "./button.acss"; /相对路径/ 32 @import "/button.acss"; /项目绝对路径/ @import "third-party/page.acss"; /第三方 npm 包路径/ 内联样式 组件上支持使用 style、class 属性来控制样式。 style 属性 用于接收动态样式,样式在运行时会进行解析。行内样式不支持!important 优先 级规则。 class 属性 用于接收静态样式,属性值是样式规则中类选择器名(样式类名)的集合,样式类 名不需要带上.,多个类名间以空格分隔。请静态样式写进 class 中,避免将静态 样式写进 style 中,以免影响渲染速度。 选择器 同 CSS3 保持一致。 注意:  .a-, .am- 开头的类选择器为系统组件占用,不可使用。  不支持属性选择器。 全局样式与局部样式  app.acss 中的样式为全局样式,作用于每一个页面。  页面文件夹内的 .acss 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 app.acss 中相同的选择器。 本地资源引用 ACSS 文件里的本地资源引用请使用绝对路径的方式,不支持相对路径引用。例 如: /* 支持 / background-image: url('/images/ant.png'); / 不支持 */ background-image: url('./images/ant.png'); 33 app.js 注册小程序 App(object: Object) App() 用于注册小程序,接受一个 Object 作为属性,用来配置小程序的生命周 期等。 App() 必须在 app.js 中调用,必须调用且只能调用一次。 object 属性说明 属性 类型 描述 触发时机 onLaunch Function 生命周期回调:监 听小程序初始化 当小程序初始化完 成时触发,全局只 触发一次 onShow Function 生命周期回调:监 听小程序显示 当小程序启动,或 从后台进入前台显 示时触发 onHide Function 生命周期回调:监 听小程序隐藏 当当前页面被隐藏 时触发,例如跳 转、按下设备 Home 键离开 onError Function 监听小程序错误 当小程序发生 js 错误时触发 onShareAppMessage Function 全局分享配置 - 前台/后台定义:  小程序用户点击右上角关闭,或者按下设备 Home 键离开支付宝时,小程序并不会直接销 毁,而是进入后台。  当用户再次进入支付宝或再次打开小程序时,小程序会从后台进入前台。  只有当小程序进入后台 5 分钟后,或占用系统资源过高,才会被真正销毁。 onLaunch(object: Object) 及 onShow(object: Object) object 属性说明: 属性 类型 描述 34 query Object 当前小程序的 query,从启动参数的 query 字段解析而来 scene number 启动小程序的 场景值 path string 当前小程序的页面地址,从启动参数 page 字段解析而来,page 忽略时默认为首页 referrerInfo Object 来源信息 比如,启动小程序的 schema url 如下: alipays://platformapi/startapp?appId=1999&query=number%3D1&page=x%2Fy%2 Fz  小程序首次启动时,onLaunch 方法可获取 query、path 属性值。  小程序在后台被用 schema 打开,也可从 onShow 方法中获取 query、path 属性值。 App({ onLaunch(options) { // 第一次打开 console.log(options.query); // {number:1} console.log(options.path); // x/y/z }, onShow(options) { // 从后台被 schema 重新打开 console.log(options.query); // {number:1} console.log(options.path); // x/y/z }, }); referrerInfo 子属性说明: 属性 类型 描述 最低版本 appId string 来源小程序 - sourceServiceId string 来源插件,当处于插件运行模式时可见 1.11.0 35 extraData Object 来源小程序传过来的数据。 - 注意:  不要在 onShow 中进行 redirectTo 或 navigateTo 等操作页面栈的行为。  不要在 onLaunch 里调用 getCurrentPages(),因为此时 page 还未生成。 onHide() 小程序从前台进入后台时触发 onHide() 。 示例代码: App({ onHide() { // 进入后台时 console.log('app hide'); }, }); onError(error: String) 小程序发生脚本错误时触发。 示例代码: App({ onError(error) { // 小程序执行出错时 console.log(error); }, }); onShareAppMessage(object: Object) 全局分享配置。当页面未设置 page.onShareAppMessage 时,调用分享会执行 全局的分享设置,具体见 分享 。 globalData 全局数据 App() 中可以设置全局数据 globalData。 示例代码: // app.js App({ globalData: 1 }); getApp 方法 小程序提供了全局的 getApp() 方法,可获取当前小程序实例,一般用于在子页 面中获取顶层应用。 var app = getApp(); console.log(app.globalData); // 获取 globalData 使用过程中,请注意以下几点:  App() 函数中不可以调用 getApp(),可使用 this 可以获取当前小程序实例。  通过 getApp() 获取实例后,请勿私自调用生命周期回调函数。  请区分全局变量及页面局部变量,比如: // app.js App({ //定义全局变量 globalData,在整个 App 中有效 globalData: 1 }); // a.js // 定义页面局部变量 localValue,只在 a.js 有效 var localValue = 'a'; // 获取 app 实例 var app = getApp(); // 拿到全局数据,并改变它 app.globalData++; // b.js // 定义页面局部变量 localValue,只在 b.js 有效 var localValue = 'b'; // 如果 a.js 先运行,globalData 会返回 2 console.log(getApp().globalData); a.js 和 b.js 两个文件中都声明了变量 localValue,但并不会互相影响,因为各 个文件声明的局部变量和函数只在当前文件下有效。 内容来源:https://developer.aliyun.com/article/756818?spm=a2c6h.12873581.0.dArticle756818.26162b70Su1GZy&groupCode=tech_library

KaFei 2020-04-27 13:54:36 0 浏览量 回答数 0

问题

电商网站报错 

kun坤 2020-06-10 13:22:52 26 浏览量 回答数 2

回答

详细解答可以参考官方帮助文档小米/华为/FCM系统推送支持 1. 相关概念2. 配置应用3. 下载扩展包4. Proguard配置5. 在应用中初始化辅助通道6. 在日志中查看初始化情况7. 辅助弹窗 7.1 客户端7.2 服务端7.3 场景解析 场景1:普通推送打开App + 辅助弹窗场景2:普通推送打开Activity + 辅助弹窗 1.相关概念 辅助通道:移动推送针对小米、华为设备管控较严的情况特意接入华为,小米推送辅助通道以提高在华为、小米设备上的到达率。移动推送优先选择自有通道进行推送消息下发,只有在自有通道断连时选择辅助通道下发消息。当前辅助通道通过华为、小米推送下发透传消息,消息到达应用后经移动推送SDK处理后触发onNotification,onMessage回调。小米、华为推送在下发透传消息时并不保证会拉起被杀死进程(相关机制可参考小米、华为推送官网),所以辅助通道在进程被杀死情况下无法保证消息一定到达。辅助弹窗:辅助弹窗通过系统通道下发通知,可以在进程被杀死情况下推送成功。由于辅助弹窗通过在对应设备上推送通知实现,因而通过辅助弹窗下发的通知不会触发onNotification回调。当前移动推送已接入小米、华为辅助弹窗。其中华为弹窗到达率统计只覆盖用户点击华为弹窗推送通知的场景,未点击部分暂未覆盖,小米弹窗到达率统计覆盖所有场景。 2. 配置应用 在 小米开放平台 注册你的App, 得到相应的小米AppID,小米AppKey,小米AppSecert。在控制台App详情设置你的小米AppSecert。(注意:小米开发者平台的消息推送开关记得打开)同理在 华为开发者联盟 注册App,应用审核通过后,能够得到华为的AppID和AppSecert。在控制台App详情中设置你的华为AppID和AppSecert。(注意,您的app不能是草稿状态,必须是审核中,或者通过审核的状态,不然通道不会生效。请确保您在华为控制台激活了推送通道功能)在FCM推送平台创建项目(注:Google已将GCM推送迁移至firebase,改称FCM)。接入前提手机必须安装google play services, 否则注册不成功, 大部分国内的手机是谷歌服务被剥离了: 在Firebase控制台需要先创建一个项目,然后再在项目下新增App下载对应App的google-services.json文件, 我们只需要这个json文件中的”project_number”, “mobilesdk_app_id”这两个key对应的value, 分别记录为sendId/applicationId, 下面注册过程中需要用到: 在Firebase控制台获取服务器密钥,并将其设置在移动推送控制台中的GCM/FCM服务器密钥域内。当前只支持老版服务器密钥 3. 下载扩展包3.1 手动集成将辅助通道扩展包下载解压后拷贝到你项目的Lib目录下,下载地址。如果使用辅助通道扩展包v3.0.4及以上版本,需要将推送SDK升级到v3.0.11及以上版本。新版辅助通道扩展包以aar形式透出,省却manifest文件配置,减少出错概率。 将辅助通道扩展包放置到app module的libs路径下,并在app module的build.gradle文件中添加如下配置: repositories { flatDir { dirs 'libs' //this way we can find the .aar file in libs folder }}...dependencies { ...... compile(name: 'alicloud-android-third-push-3.0.5', ext: 'aar')}3.2 Maven集成 项目顶层build.gradle中添加Maven仓库地址: allprojects { repositories { maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases/' } }} gradle添加依赖: dependencies { compile 'com.aliyun.ams:alicloud-android-third-push:3.0.5@aar'}3.3 Firebase依赖如需配置GCM/GCM通道还需要添加Firebase SDK依赖: dependencies { ...... compile ('com.google.firebase:firebase-messaging:9.6.1')}同时在AndroidManifest文件中添加如下配置: <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.taobao.taobao" /> </intent-filter></receiver><receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" /><service android:name="com.alibaba.sdk.android.push.AgooFirebaseInstanceIDService" android:exported="true" > <intent-filter android:priority="-500" > <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter></service><service android:name="com.alibaba.sdk.android.push.AgooFirebaseMessagingService" android:exported="true" > <intent-filter android:priority="-500" > <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter></service> 4. Proguard配置 如果集成推送SDK的工程开启代码混淆,在Proguard配置的基础上,需要添加以下辅助通道的Proguard配置。 # 小米通道-keep class com.xiaomi.** {*;}-dontwarn com.xiaomi.**# 华为通道-keep class com.huawei.** {*;}-dontwarn com.huawei.**# GCM/FCM通道-keep class com.google.firebase.**{*;}-dontwarn com.google.firebase.**5. 在应用中初始化辅助通道将以下代码加入你application.onCreate()方法中初始通道。注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败 // 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");// 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。HuaWeiRegister.register(applicationContext);//GCM/FCM辅助通道注册GcmRegister.register(this, sendId, applicationId); //sendId/applicationId为步骤获得的参数 本方法会自动判断是否支持小米系统推送,如不支持会跳过注册。 6. 在日志中查看初始化情况华为通道初始化成功,可以看到以下日志: 11-11 22:21:33.671 30248-30324/com.xxx E/MPS:HuaWeiRegister: HuaWeiRegister checkDevice flag=true //确认是华为的手机11-11 22:21:33.674 30248-30324/com.xxx E/MPS:HuaWeiRegister﹕ Register huawei push............ //开始注册华为手机11-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiRegister﹕ huawei register success,token = 08657430243125472000000411000001 小米通道初始化成功,可以看到以下日志: 12-09 22:20:39.710 19566-19566/com.xxx E/MPS:MiPushRegister: MiPushRegister checkDevice flag=true //确认是小米的手机12-09 22:20:39.712 19566-19566/com.xxx E/MPS:MiPushRegister: Register mipush. //开始注册小米12-09 22:20:40.596 19566-19733/com.xxx E/MPS:MiPushRegister: XiaoMi register success. //小米注册成功 regid=d//igwEhgBGCI2TG6lWqlCesc0I6xE1wUhNCBXQ8uNOi/dDZioYXVysbrVrvRmyEVPn9nWz92D28IzYbA1RzoGDyTzYZwXKfBHEQkrey4G8= GCM/FCM通道初始化成功,可以看到以下日志: 05-19 19:18:44.530 19153-19177/com.xxx D/MPS:GcmRegister: token from register: eWIXLYCNP0Q:APA91bFUAgxj6XYf5okyoCBnRPw1UwITndzXrvPDgbdI2N44PYm17hFEBiNXNQJrJ8bOG_xjw3c3UPDAhzNMTLNjlAKcjUanKyLA6E3k4wEmgZuhgUT02UMmMvH2LVA1L2Z4-l-cT_Ug 收到小米通道下行的消息:(需要将sdk日志等级设置到DEBUG) 12-09 22:24:34.065 19566-25042/com.xxx D/MPS:MiPushReceiver: onReceiveMessage,msg=[{"f":262,"b":"{\"content\"\ ... ... ,"i":"f__-rnje3_OH74gE|VG0g3kwMnGADAGrXZku1FFW5"}] 收到GCM/FCM通道下发的消息: 05-19 19:20:04.900 19153-20391/com.alibaba.push2 D/MPS:GcmRegister: onReceiveMessage payload msg:[......] 若小米通道注册失败(未看到小米注册成功日志),请查看系统日志(logcat设置NoFilters),以PushService|BroadcastQueue为正则式进行过滤,示例如下图: MiPushBroadcastReceiver未配置: MIPUSH_RECEIVE权限未配置: 注:如果控制台配置了小米/华为的信息,app需要加对应的jar包依赖,不然会有crash的风险。 7. 辅助弹窗 当前部分国产品牌设备管控严格,接入推送功能的App进程在后台被清理后,收不到推送通知;接入辅助弹窗后,可以借助对应品牌的系统通道,保证App后台被清理后,仍能收到推送通知;当前辅助弹窗已接入小米、华为(小米辅助弹窗:v2.3.0及以上支持;华为辅助弹窗:v3.0.8及以上支持);当前华为辅助弹窗仅支持Emotion UI(华为定制ROM)4.1级以上版本的设备; 7.1 客户端 该功能的使用需要接入推送辅助通道,确保使用最新的辅助通道扩展包,具体参考上文;辅助弹窗送达的通知展示效果,和普通通知相同;服务端指定辅助弹窗通道推送时,一定要指定通知点击后要打开的Activity,该Activity需继承自抽象类AndroidPopupActivity(MiPushSystemNotificationActivity已废弃,小米弹窗、华为弹窗统一继承AndroidPopupActivity),否则无法获取到通知的相关信息,并且会影响通知到达率的统计;AndroidPopupActivity中提供抽象方法onSysNoticeOpened(),实现该方法后可获取到辅助弹窗通知的标题、内容和额外参数,在通知点击时触发,原本的通知回调onNotification()和onNotificationOpened()不适用于辅助弹窗;指定打开的托管弹窗Activity在AndroidManifest.xml中注册时需要声明属性:android:exported=true 接入如下所示: import com.alibaba.sdk.android.push.AndroidPopupActivity;public class PopupPushActivity extends AndroidPopupActivity { static final String TAG = "PopupPushActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /** * 实现通知打开回调方法,获取通知相关信息 * @param title 标题 * @param summary 内容 * @param extMap 额外参数 */ @Override protected void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) { Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap); }}7.2 服务端 OpenAPI 2.0的推送高级接口提供了AndroidPopupActivity、AndroidPopupTitle和AndroidPopupBody三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:StoreOffline参数也需要设置为true);辅助弹窗仅对后台进程被清理的小米/华为设备生效,对非小米/华为设备和在线的小米/华为设备不生效;当辅助弹窗生效时,推送接口的Title、Body、AndroidActivity以及额外参数设置中的功能性设置(如声音、震动等)都不起作用;PushRequest pushRequest = new PushRequest();// 其余设置省略// ...// 0:表示消息(默认为0), 1:表示通知pushRequest.setType(1);// 标题pushRequest.setTitle(dateFormat.format(new Date()));// 内容pushRequest.setBody("PushRequest body");// 额外参数pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");// 设置辅助弹窗打开ActivitypushRequest.setAndroidPopupActivity("*****");// 设置辅助弹窗通知标题pushRequest.setAndroidPopupTitle("*****");// 设置辅助弹窗通知内容pushRequest.setAndroidPopupBody("*****"); 7.3 场景解析以下几种普通推送结合辅助弹窗推送的场景,帮助您快速理解辅助弹窗功能的配置。 客户端配置客户端有Main、Second两个Activity,MainActivity为App打开主页面,SecondActivity extends AndroidPopupActivity; 普通通知回调配置: public class MyMessageReceiver extends MessageReceiver { /** * 推送通知的回调方法 * @param context * @param title * @param summary * @param extraMap */ @Override public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) { Log.d(TAG, "Receive notification, title: " + title + ", content: " + summary + ", extraMap: " + extraMap); }} MainActivity定义: package com.alibaba.push.testdemo;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { Log.d(TAG, "Main"); }} SecondActivity定义: package com.alibaba.push.testdemo;import com.alibaba.sdk.android.push.AndroidPopupActivity;public class SecondActivity extends AndroidPopupActivity { /** * 辅助弹窗指定打开Activity回调 * @param title 标题 * @param content 内容 * @param extraMap 额外参数 */ @Override protected void onSysNoticeOpened(String title, String content, Map<String, String> extraMap) { Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap); }}场景1:普通推送打开App + 辅助弹窗服务端配置如下: PushRequest pushRequest = new PushRequest();// 其余设置省略// ...// 0:表示消息(默认为0), 1:表示通知pushRequest.setType(1);// 标题pushRequest.setTitle("hello");// 内容pushRequest.setBody("PushRequest body");// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转pushRequest.setAndroidOpenType("APPLICATION");// 设置辅助弹窗打开ActivitypushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");// 设置辅助弹窗通知标题pushRequest.setAndroidPopupTitle("hello2");// 设置辅助弹窗通知内容pushRequest.setAndroidPopupBody("PushRequest body2");// 设定android类型设备通知的扩展属性pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");推送结果: 非小米、华为设备和在线小米、华为设备 收到普通推送通道弹出的通知,点击后打开App,进入首页MainActivity,如果设备在前台,保持当前界面不变;onNotification()回调输出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}; 清理进程后的小米、华为设备 辅助弹窗通道弹出通知,点击后跳转到SecondActivity;onSysNoticeOpened()回调输出Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2}; 场景2:普通推送打开Activity + 辅助弹窗服务端配置如下: PushRequest pushRequest = new PushRequest();// 其余设置省略// ...// 0:表示消息(默认为0), 1:表示通知pushRequest.setType(1);// 标题pushRequest.setTitle("hello");// 内容pushRequest.setBody("PushRequest body");// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转pushRequest.setAndroidOpenType("ACTIVITY");// 指定普通推送要打开的ActivitypushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");// 设置辅助弹窗打开ActivitypushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");// 设置辅助弹窗通知标题pushRequest.setAndroidPopupTitle("hello2");// 设置辅助弹窗通知内容pushRequest.setAndroidPopupBody("PushRequest body2");// 设定android类型设备通知的扩展属性pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");推送结果: 非小米、华为设备和在线小米、华为设备 收到普通推送通道弹出的通知,点击后跳转到SecondActivity;onNotification()回调输出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}; 清理进程后的小米、华为设备 辅助弹窗通道弹出通知,点击后跳转到SecondActivity;onSysNoticeOpened()回调输出Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2};

2019-12-01 23:11:50 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档小米/华为/FCM系统推送支持 1. 相关概念2. 配置应用3. 下载扩展包4. Proguard配置5. 在应用中初始化辅助通道6. 在日志中查看初始化情况7. 辅助弹窗 7.1 客户端7.2 服务端7.3 场景解析 场景1:普通推送打开App + 辅助弹窗场景2:普通推送打开Activity + 辅助弹窗 1.相关概念 辅助通道:移动推送针对小米、华为设备管控较严的情况特意接入华为,小米推送辅助通道以提高在华为、小米设备上的到达率。移动推送优先选择自有通道进行推送消息下发,只有在自有通道断连时选择辅助通道下发消息。当前辅助通道通过华为、小米推送下发透传消息,消息到达应用后经移动推送SDK处理后触发onNotification,onMessage回调。小米、华为推送在下发透传消息时并不保证会拉起被杀死进程(相关机制可参考小米、华为推送官网),所以辅助通道在进程被杀死情况下无法保证消息一定到达。辅助弹窗:辅助弹窗通过系统通道下发通知,可以在进程被杀死情况下推送成功。由于辅助弹窗通过在对应设备上推送通知实现,因而通过辅助弹窗下发的通知不会触发onNotification回调。当前移动推送已接入小米、华为辅助弹窗。其中华为弹窗到达率统计只覆盖用户点击华为弹窗推送通知的场景,未点击部分暂未覆盖,小米弹窗到达率统计覆盖所有场景。 2. 配置应用 在 小米开放平台 注册你的App, 得到相应的小米AppID,小米AppKey,小米AppSecert。在控制台App详情设置你的小米AppSecert。(注意:小米开发者平台的消息推送开关记得打开)同理在 华为开发者联盟 注册App,应用审核通过后,能够得到华为的AppID和AppSecert。在控制台App详情中设置你的华为AppID和AppSecert。(注意,您的app不能是草稿状态,必须是审核中,或者通过审核的状态,不然通道不会生效。请确保您在华为控制台激活了推送通道功能)在FCM推送平台创建项目(注:Google已将GCM推送迁移至firebase,改称FCM)。接入前提手机必须安装google play services, 否则注册不成功, 大部分国内的手机是谷歌服务被剥离了: 在Firebase控制台需要先创建一个项目,然后再在项目下新增App下载对应App的google-services.json文件, 我们只需要这个json文件中的”project_number”, “mobilesdk_app_id”这两个key对应的value, 分别记录为sendId/applicationId, 下面注册过程中需要用到: 在Firebase控制台获取服务器密钥,并将其设置在移动推送控制台中的GCM/FCM服务器密钥域内。当前只支持老版服务器密钥 3. 下载扩展包3.1 手动集成将辅助通道扩展包下载解压后拷贝到你项目的Lib目录下,下载地址。如果使用辅助通道扩展包v3.0.4及以上版本,需要将推送SDK升级到v3.0.11及以上版本。新版辅助通道扩展包以aar形式透出,省却manifest文件配置,减少出错概率。 将辅助通道扩展包放置到app module的libs路径下,并在app module的build.gradle文件中添加如下配置: repositories { flatDir { dirs 'libs' //this way we can find the .aar file in libs folder }}...dependencies { ...... compile(name: 'alicloud-android-third-push-3.0.5', ext: 'aar')}3.2 Maven集成 项目顶层build.gradle中添加Maven仓库地址: allprojects { repositories { maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases/' } }} gradle添加依赖: dependencies { compile 'com.aliyun.ams:alicloud-android-third-push:3.0.5@aar'}3.3 Firebase依赖如需配置GCM/GCM通道还需要添加Firebase SDK依赖: dependencies { ...... compile ('com.google.firebase:firebase-messaging:9.6.1')}同时在AndroidManifest文件中添加如下配置: <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.taobao.taobao" /> </intent-filter></receiver><receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" /><service android:name="com.alibaba.sdk.android.push.AgooFirebaseInstanceIDService" android:exported="true" > <intent-filter android:priority="-500" > <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter></service><service android:name="com.alibaba.sdk.android.push.AgooFirebaseMessagingService" android:exported="true" > <intent-filter android:priority="-500" > <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter></service> 4. Proguard配置 如果集成推送SDK的工程开启代码混淆,在Proguard配置的基础上,需要添加以下辅助通道的Proguard配置。 # 小米通道-keep class com.xiaomi.** {*;}-dontwarn com.xiaomi.**# 华为通道-keep class com.huawei.** {*;}-dontwarn com.huawei.**# GCM/FCM通道-keep class com.google.firebase.**{*;}-dontwarn com.google.firebase.**5. 在应用中初始化辅助通道将以下代码加入你application.onCreate()方法中初始通道。注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败 // 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");// 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。HuaWeiRegister.register(applicationContext);//GCM/FCM辅助通道注册GcmRegister.register(this, sendId, applicationId); //sendId/applicationId为步骤获得的参数 本方法会自动判断是否支持小米系统推送,如不支持会跳过注册。 6. 在日志中查看初始化情况华为通道初始化成功,可以看到以下日志: 11-11 22:21:33.671 30248-30324/com.xxx E/MPS:HuaWeiRegister: HuaWeiRegister checkDevice flag=true //确认是华为的手机11-11 22:21:33.674 30248-30324/com.xxx E/MPS:HuaWeiRegister﹕ Register huawei push............ //开始注册华为手机11-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiRegister﹕ huawei register success,token = 08657430243125472000000411000001 小米通道初始化成功,可以看到以下日志: 12-09 22:20:39.710 19566-19566/com.xxx E/MPS:MiPushRegister: MiPushRegister checkDevice flag=true //确认是小米的手机12-09 22:20:39.712 19566-19566/com.xxx E/MPS:MiPushRegister: Register mipush. //开始注册小米12-09 22:20:40.596 19566-19733/com.xxx E/MPS:MiPushRegister: XiaoMi register success. //小米注册成功 regid=d//igwEhgBGCI2TG6lWqlCesc0I6xE1wUhNCBXQ8uNOi/dDZioYXVysbrVrvRmyEVPn9nWz92D28IzYbA1RzoGDyTzYZwXKfBHEQkrey4G8= GCM/FCM通道初始化成功,可以看到以下日志: 05-19 19:18:44.530 19153-19177/com.xxx D/MPS:GcmRegister: token from register: eWIXLYCNP0Q:APA91bFUAgxj6XYf5okyoCBnRPw1UwITndzXrvPDgbdI2N44PYm17hFEBiNXNQJrJ8bOG_xjw3c3UPDAhzNMTLNjlAKcjUanKyLA6E3k4wEmgZuhgUT02UMmMvH2LVA1L2Z4-l-cT_Ug 收到小米通道下行的消息:(需要将sdk日志等级设置到DEBUG) 12-09 22:24:34.065 19566-25042/com.xxx D/MPS:MiPushReceiver: onReceiveMessage,msg=[{"f":262,"b":"{\"content\"\ ... ... ,"i":"f__-rnje3_OH74gE|VG0g3kwMnGADAGrXZku1FFW5"}] 收到GCM/FCM通道下发的消息: 05-19 19:20:04.900 19153-20391/com.alibaba.push2 D/MPS:GcmRegister: onReceiveMessage payload msg:[......] 若小米通道注册失败(未看到小米注册成功日志),请查看系统日志(logcat设置NoFilters),以PushService|BroadcastQueue为正则式进行过滤,示例如下图: MiPushBroadcastReceiver未配置: MIPUSH_RECEIVE权限未配置: 注:如果控制台配置了小米/华为的信息,app需要加对应的jar包依赖,不然会有crash的风险。 7. 辅助弹窗 当前部分国产品牌设备管控严格,接入推送功能的App进程在后台被清理后,收不到推送通知;接入辅助弹窗后,可以借助对应品牌的系统通道,保证App后台被清理后,仍能收到推送通知;当前辅助弹窗已接入小米、华为(小米辅助弹窗:v2.3.0及以上支持;华为辅助弹窗:v3.0.8及以上支持);当前华为辅助弹窗仅支持Emotion UI(华为定制ROM)4.1级以上版本的设备; 7.1 客户端 该功能的使用需要接入推送辅助通道,确保使用最新的辅助通道扩展包,具体参考上文;辅助弹窗送达的通知展示效果,和普通通知相同;服务端指定辅助弹窗通道推送时,一定要指定通知点击后要打开的Activity,该Activity需继承自抽象类AndroidPopupActivity(MiPushSystemNotificationActivity已废弃,小米弹窗、华为弹窗统一继承AndroidPopupActivity),否则无法获取到通知的相关信息,并且会影响通知到达率的统计;AndroidPopupActivity中提供抽象方法onSysNoticeOpened(),实现该方法后可获取到辅助弹窗通知的标题、内容和额外参数,在通知点击时触发,原本的通知回调onNotification()和onNotificationOpened()不适用于辅助弹窗;指定打开的托管弹窗Activity在AndroidManifest.xml中注册时需要声明属性:android:exported=true 接入如下所示: import com.alibaba.sdk.android.push.AndroidPopupActivity;public class PopupPushActivity extends AndroidPopupActivity { static final String TAG = "PopupPushActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /** * 实现通知打开回调方法,获取通知相关信息 * @param title 标题 * @param summary 内容 * @param extMap 额外参数 */ @Override protected void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) { Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap); }}7.2 服务端 OpenAPI 2.0的推送高级接口提供了AndroidPopupActivity、AndroidPopupTitle和AndroidPopupBody三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:StoreOffline参数也需要设置为true);辅助弹窗仅对后台进程被清理的小米/华为设备生效,对非小米/华为设备和在线的小米/华为设备不生效;当辅助弹窗生效时,推送接口的Title、Body、AndroidActivity以及额外参数设置中的功能性设置(如声音、震动等)都不起作用;PushRequest pushRequest = new PushRequest();// 其余设置省略// ...// 0:表示消息(默认为0), 1:表示通知pushRequest.setType(1);// 标题pushRequest.setTitle(dateFormat.format(new Date()));// 内容pushRequest.setBody("PushRequest body");// 额外参数pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");// 设置辅助弹窗打开ActivitypushRequest.setAndroidPopupActivity("*****");// 设置辅助弹窗通知标题pushRequest.setAndroidPopupTitle("*****");// 设置辅助弹窗通知内容pushRequest.setAndroidPopupBody("*****"); 7.3 场景解析以下几种普通推送结合辅助弹窗推送的场景,帮助您快速理解辅助弹窗功能的配置。 客户端配置客户端有Main、Second两个Activity,MainActivity为App打开主页面,SecondActivity extends AndroidPopupActivity; 普通通知回调配置: public class MyMessageReceiver extends MessageReceiver { /** * 推送通知的回调方法 * @param context * @param title * @param summary * @param extraMap */ @Override public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) { Log.d(TAG, "Receive notification, title: " + title + ", content: " + summary + ", extraMap: " + extraMap); }} MainActivity定义: package com.alibaba.push.testdemo;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { Log.d(TAG, "Main"); }} SecondActivity定义: package com.alibaba.push.testdemo;import com.alibaba.sdk.android.push.AndroidPopupActivity;public class SecondActivity extends AndroidPopupActivity { /** * 辅助弹窗指定打开Activity回调 * @param title 标题 * @param content 内容 * @param extraMap 额外参数 */ @Override protected void onSysNoticeOpened(String title, String content, Map<String, String> extraMap) { Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap); }}场景1:普通推送打开App + 辅助弹窗服务端配置如下: PushRequest pushRequest = new PushRequest();// 其余设置省略// ...// 0:表示消息(默认为0), 1:表示通知pushRequest.setType(1);// 标题pushRequest.setTitle("hello");// 内容pushRequest.setBody("PushRequest body");// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转pushRequest.setAndroidOpenType("APPLICATION");// 设置辅助弹窗打开ActivitypushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");// 设置辅助弹窗通知标题pushRequest.setAndroidPopupTitle("hello2");// 设置辅助弹窗通知内容pushRequest.setAndroidPopupBody("PushRequest body2");// 设定android类型设备通知的扩展属性pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");推送结果: 非小米、华为设备和在线小米、华为设备 收到普通推送通道弹出的通知,点击后打开App,进入首页MainActivity,如果设备在前台,保持当前界面不变;onNotification()回调输出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}; 清理进程后的小米、华为设备 辅助弹窗通道弹出通知,点击后跳转到SecondActivity;onSysNoticeOpened()回调输出Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2}; 场景2:普通推送打开Activity + 辅助弹窗服务端配置如下: PushRequest pushRequest = new PushRequest();// 其余设置省略// ...// 0:表示消息(默认为0), 1:表示通知pushRequest.setType(1);// 标题pushRequest.setTitle("hello");// 内容pushRequest.setBody("PushRequest body");// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转pushRequest.setAndroidOpenType("ACTIVITY");// 指定普通推送要打开的ActivitypushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");// 设置辅助弹窗打开ActivitypushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");// 设置辅助弹窗通知标题pushRequest.setAndroidPopupTitle("hello2");// 设置辅助弹窗通知内容pushRequest.setAndroidPopupBody("PushRequest body2");// 设定android类型设备通知的扩展属性pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");推送结果: 非小米、华为设备和在线小米、华为设备 收到普通推送通道弹出的通知,点击后跳转到SecondActivity;onNotification()回调输出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}; 清理进程后的小米、华为设备 辅助弹窗通道弹出通知,点击后跳转到SecondActivity;onSysNoticeOpened()回调输出Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2};

2019-12-01 23:11:50 0 浏览量 回答数 0

问题

某政务网站性能优化

猫饭先生 2019-12-01 21:25:38 1412 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站