• 关于

    google play服务器

    的搜索结果

回答

item = soup.find("a", {"title":"Open in Google Play"}) 您最初搜索的是标题为“在Google Play中打开”的“跨度”,但是要查找的元素是“ a”(链接)。 编辑:由于服务器似乎显示了503错误,请尝试使用此代码设置一个公共用户代理(未经测试,它可能根本无法工作;您需要import urllib2): soup = BeautifulSoup(urllib2.urlopen(urllib2.Request(sampleURL, None, {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0"})).read()) item = soup.find("a", {"title":"Open in Google Play"}) print item 我也删除了无用的,"".join(pageHtml)因为urllib2已经返回了字符串,所以不需要加入。
祖安文状元 2020-02-22 15:42:44 0 浏览量 回答数 0

回答

您好, 请问您的云服务器系统是Windows吗?如果是,应该有相应的app,如安卓手机的:https://play.google.com/store/apps/details?id=com.microsoft.rdc.android&hl=zh
dongshan8 2019-12-02 01:29:53 0 浏览量 回答数 0

问题

国外ECS服务器架设VPN开通申请

1.请问需要购买外外ECS服务器后开通VPN服务,这个必须用公司申请还是个人也可以申请 2.申请流程需要怎么操作 3.附带说明下:     主要用途2个:     A:登录G...
ozzz 2019-12-01 18:58:46 1100 浏览量 回答数 1

云服务器 精选特惠

新用户低至0.55折起,爆款免费试用3个月

问题

Google Play服务排行榜示例脚本未运行

未找到 在此服务器上找不到请求的URL /sugumar/web-basic-samples-master/type-a-number-js/index.html。 我检查了web-basic-samples-master文件夹的文...
游客ufivfoddcd53c 2020-01-04 16:48:01 0 浏览量 回答数 1

问题

com.parse.ParseRequest 中出现 I / O失败

我正在尝试在Parse服务器中运行使用匿名登录的应用程序,但在日志猫中却收到了以下消息。 该应用程序只能在我的装有android oreo 8.1的设备上运行,但是在其他装有Android Pie的设备上尝试运...
montos 2020-03-21 20:17:47 1 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档小米/华为/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

问题

phonegap push-消息推送实现 :报错

最近一直在研究各种推送,ios的由于是apns,比较容易实现,但是andriod的就比较麻烦。后来看了很多解决方案,gcm明显是不行的,其他的方案更是一头雾水࿰...
kun坤 2020-06-20 13:39:21 0 浏览量 回答数 1

问题

【转载】phonegap push-消息推送实现 配置报错 

1.注册极光的开发者账户,并注册应用信息。 2,下载 sdk包。就行整合 3.SDK集成步骤 最近一直在研究各种推送,ios的由于是apns,比较容易实现,但是andriod的就比较...
kun坤 2020-05-31 17:32:48 0 浏览量 回答数 1

问题

语音合成Android SDK

功能介绍 语音Android SDK提供提供将文本转为普通话语音的语音合成功能。 阿里云语音服务SDK(NLSClinet),是运行于android平台的基础语音识别、自然语言理解和语音合成的基...
nicenelly 2019-12-01 21:01:45 1399 浏览量 回答数 0

回答

转自:思否 本文作者:Michael van der Gulik 原文链接:《Why WebAssembly is a big deal》 译者:敖小剑 WebAssembly 是每个程序员都应该关注的技术。WebAssembly 会变得更流行。 WebAssembly 将取代 JavaScript。WebAssembly 将取代 HTML 和 CSS。 WebAssembly 将取代手机应用。WebAssembly 将取代桌面应用。在 10 年内,我保证每个程序员至少需要知道如何使用工具来操作 WebAssembly 并理解它是如何工作的。 你可能会说,“太离谱了!” 好吧,请继续阅读。 什么是 WebAssembly 当前形式的 WebAssembly 是 Web 浏览器的新扩展,可以运行预编译代码…快速地。在 C ++ 中编写了一些小代码,然后使用 Emscripten 编译器将该代码编译为 WebAssembly。通过一些 Javascript 粘合,就可以在 Web 浏览器中调用这一小段代码,例如,运行粒子模拟。 WebAssembly 文件,扩展名为.wasm,本身是包含可执行指令的二进制格式。要使用该文件,必须编写一个运行某些 Javascript 的 HTML 文件来获取、编译和执行 WebAssembly 文件。WebAssembly 文件在基于堆栈的虚拟机上执行,并使用共享内存与其 JavaScript 包装器进行通信。 到目前为止,这似乎并不有趣。它看起来只不过是 JavaScript 的加速器。但是,聪明的读者会对 WebAssembly 可能成为什么有所了解。 WebAssembly 将成为什么? 第一个重要发现是 WebAssembly 是一个安全的沙盒虚拟机。可以从 Internet 运行喜欢的 WebAssembly 代码,而确保它不会接管 PC 或服务器。四个主流 Web 浏览器对它的安全性非常有信心,它已经默认实现并启用了。它的真正安全性还有待观察,但安全性是 WebAssembly 的核心设计目标。 第二个重要发现是 WebAssembly 是一个通用的编译目标。它的原始编译器是一个 C 编译器,这个编译器很好地指示了 WebAssembly 虚拟机的低级和可重定向性。许多编程语言都使用 C 语言编写虚拟机,其他一些语言甚至使用 C 本身作为编译目标。 此时,有人整理了一个可以编译为 WebAssembly 的编程语言列表。这份名单将在未来很多年中继续增长。 WebAssembly 允许使用任何编程语言编写代码,然后让其他人在任何平台上安全地运行该代码,无需安装任何内容。朋友们,这是美好梦想的开始。 部署问题 我们来谈谈如何将软件提供给用户。 为新项目选择编程语言的一个重要因素是如何将项目部署到客户。您的程序员喜欢用 Haskell,Python,Visual Basic 或其他语言编写应用程序,具体取决于他们的喜好。要使用喜欢的语言,他们需要编译应用,制作一些可安装的软件包,并以某种方式将其安装在客户端的计算机上。有许多方法可以提供软件 - 包管理器,可执行安装程序或安装服务,如 Steam,Apple App Store,Google Play 或 Microsoft store。 每一个安装机制都意味着痛苦,从应用商店安装时的轻微疼痛,到管理员要求在他的 PC 上运行一些旧的 COBOL 代码时的集群头痛。 部署是一个问题。对于开发人员和系统管理员来说,部署一直是一个痛点。我们使用的编程语言与我们所针对的平台密切相关。如果大量用户在 PC 或移动设备上,我们使用 HTML 和 Javascript。如果用户是 Apple 移动设备用户,我们使用……呃…… Swift?(我实际上不知道)。如果用户在 Android 设备上,我们使用 Java 或 Kotlin。如果用户在真实计算机上并且愿意处理掉他们的部署问题,那么我们开发人员才能在我们使用的编程语言中有更多选择。 WebAssembly 有可能解决部署问题。 有了 WebAssembly,您可以使用任何编程语言编写应用,只要这些编程语言可以支持 WebAssembly,而应用可以在任何设备和任何具有现代 Web 浏览器的操作系统上运行。 硬件垄断 想购买台式机或笔记本电脑。有什么选择?好吧,有英特尔,有 AMD。多年来一直是双寡头垄断。保持这种双寡头垄断的一个原因是 x86 架构只在这两家公司之间交叉许可,而且通常预编译的代码需要 x86 或 x86-64(也就是 AMD-64)架构。还有其他因素,例如设计世界上最快的 CPU 是一件很艰难但也很昂贵的事情。 WebAssembly 是一种可让您在任何平台上运行代码的技术(之一)。如果它成为下一个风口,硬件市场将变得商品化。应用编译为 WebAssembly,就可以在任何东西上运行 - x86,ARM,RISC-V,SPARC。即便是操作系统市场也会商品化;您所需要的只是一个支持 WebAssembly 的浏览器,以便在硬件可以运行时运行最苛刻的应用程序。 编者注:Second State 研发的专为服务端优化的 WebAssembly 引擎 SSVM 已经可以运行在高通骁龙芯片上。Github 链接:https://github.com/second-sta... 云计算 但等等,还有更多。云计算成为IT经理办公室的流行词已有一段时间,WebAssembly 可以直接迎合它。 WebAssembly 在安全沙箱中执行。可以制作一个容器,它可以在服务器上接受和执行 WebAssembly 模块,而资源开销很小。对于提供的每个服务,无需在虚拟机上运行完整的操作系统。托管提供商只提供对可以上传代码的WebAssembly 容器的访问权限。它可以是一个原始容器,接收 socket 并解析自己的 HTTP 连接,也可以是一个完整的 Web 服务容器,其中 WebAssembly 模块只需要处理预解析的HTTP请求。 这还不存在。如果有人想变得富有,那么可以考虑这个想法。 编者注:目前已经有人正在实现这个想法,Byte Alliance 计划将WebAssembly 带到浏览器之外,Second State 已经发布了为服务端设计的WebAssembly 引擎开发者预览版。 不是云计算 WebAssembly 足以取代 PC 上本地安装的大多数应用程序。我们已经使用 WebGL(又名OpenGL ES 2.0)移植了游戏。我预测不久之后,受益于WebAssembly,像 LibreOffice 这样的大型应用可以直接从网站上获得,而无需安装。 在这种情况下,在本地安装应用没什么意义。本地安装的应用和 WebAssembly 应用之间几乎没有区别。WebAssembly 应用已经可以使用屏幕,键盘和鼠标进行交互。它可以在 2D 或 OpenGL 中进行图形处理,并使用硬件对视频流进行解码。可以播放和录制声音。可以访问网络摄像头。可以使用 WebSockets。可以使用 IndexedDB 存储大量数据在本地磁盘上。这些已经是 Web 浏览器中的标准功能,并且都可以使用 JavaScript 向 WebAssembly 暴露。 目前唯一困难的地方是 WebAssembly 无法访问本地文件系统。好吧,可以通过 HTML 使用文件上传对话,但这不算。最终,总会有人为此创建 API,并可能称之为 “WASI”。 “从互联网上运行应用程序!?胡说八道!“,你说。好吧,这是使用 Qt 和 WebAssembly 实现的文本编辑器 (以及更多)。 这是一个简单的例子。复杂的例子是在 WebBrowser 中运行的 Adobe Premier Pro 或 Blender。或者考虑像 Steam 游戏一样可以直接从网络上运行。这听起来像小说,但从技术上说这并非不能发生。 它会来的。 让我们裸奔! 目前,WebAssembly 在包含 HTML 和 Javascript 包装器的环境中执行。为什么不脱掉这些?有了 WebAssembly,为什么还要在浏览器中包含 HTML 渲染器和 JavaScript 引擎? 通过为所有服务提供标准化 API,这些服务通常是 Web 浏览器提供的,可以创建裸 WebAssembly。就是没有 HTML和 Javascript 包装来管理的 WebAssembly。访问的网页是 .wasm 文件,浏览器会抓取并运行该文件。浏览器为WebAssembly 模块提供画布,事件处理程序以及对浏览器提供的所有服务的访问。 这目前还不存在。如果现在使用 Web 浏览器直接访问 .wasm 文件,它会询问是否要下载它。我假设将设计所需的 API 并使其工作。 结果是 Web 可以发展。网站不再局限于 HTML,CSS 和 Javascript。可以创建全新的文档描述语言。可以发明全新的布局引擎。而且,对于像我这样的 polyglots 最相关,我们可以选择任何编程语言来实现在线服务。 可访问性 但我听到了强烈抗议!可访问性怎么样??搜索引擎怎么办? 好吧,我还没有一个好的答案。但我可以想象几种技术解决方案。 一个解决方案是我们保留内容和表现的分离。内容以标准化格式编写,例如 HTML。演示文稿由 WebAssembly 应用管理,该应用可以获取并显示内容。这允许网页设计师使用想要的任何技术进行任意演示 - 不需要 CSS,而搜索引擎和需要不同类型的可访问性的用户仍然可以访问内容。 请记住,许多 WebAssembly 应用并不是可以通过文本访问的,例如游戏和许多应用。盲人不会从图像编辑器中获得太多好处。 另一个解决方案是发明一个 API,它可以作为 WebAssembly 模块,来提供想在屏幕上呈现的 DOM,供屏幕阅读器或搜索引擎使用。基本上会有两种表示形式:一种是在图形画布上,另一种是产生结构化文本输出。 第三种解决方案是使用屏幕阅读器或搜索引擎可以使用的元数据来增强画布。执行 WebAssembly 并在画布上呈现内容,其中包含描述渲染内容的额外元数据。例如,该元数据将包括屏幕上的区域是否是菜单以及存在哪些选项,或者区域是否想要文本输入,以及屏幕上的区域的自然排序(也称为标签顺序)是什么。基本上,曾经在 HTML 中描述的内容现在被描述为具有元数据的画布区域。同样,这只是一个想法,它可能在实践中很糟糕。 可能是什么 1995年,Sun Microsystems 发布了 Java,带有 Java applets 和大量的宣传。有史以来第一次,网页可以做一些比 和 GIF 动画更有趣的事情。开发人员可以使应用完全在用户的 Web 浏览器中运行。它们没有集成到浏览器中,而是实现为繁重的插件,需要安装整个 JVM。1995年,这不是一个小的安装。applets 也需要一段时间来加载并使用大量内存。我们现在凭借大量内存,这不再是一个问题,但在 Java 生命的第一个十年里,它让体验变得令人厌烦。 applets 也不可靠。无法保证它们会运行,尤其是在用户使用 Microsoft 的实现时。他们也不安全,这是棺材里的最后一颗钉子。 以 JVM 为荣,其他语言最终演变为在 JVM 上运行。但现在,那艘船航行了。 FutureSplash / Macromedia / Adobe Flash 也是一个竞争者,但是是专有的,具有专有工具集和专有语言的专有格式。我读到他们确实在2009年开启了文件格式。最终从浏览器中删除了支持,因为它存在安全风险。 这里的结论是,如果希望您的技术存在于每个人的机器上,那么安全性就需要正视。我真诚地希望 WebAssembly 作为标准对安全问题做出很好的反应。 需要什么? WebAssembly 仍处于初期阶段。它目前能很好的运行代码,而规范版本是 1.0,二进制格式定型。目前正在开展SIMD 指令支持。通过 Web Workers 进行多线程处理也正在进行中。 工具可用,并将在未来几年不断改进。浏览器已经让你窥视 WebAssembly 文件。至少 Firefox 允许查看WebAssembly 字节码,设置断点并查看调用堆栈。我听说浏览器也有 profiling 支持。 语言支持包括一套不错的语言集合–C,C++和Rust是一流的公民。C#,Go和Lua显然有稳定的支持。Python,Scala,Ruby,Java和Typescript都有实验性支持。这可能是一个傲慢的陈述,但我真的相信任何想要在21世纪存在的语言都需要能够在 WebAssembly 上编译或运行。 在访问外部设备的 API 支持方面,我所知道的唯一可用于裸 WebAssembly 的 API 是 WASI,它允许文件和流访问等核心功能,允许 WebAssembly 在浏览器外运行。否则,任何访问外部世界的 API 都需要在浏览器中的 Javascript 中实现。除了本地机器上的文件访问,打印机访问和其他新颖的硬件访问(例如非标准蓝牙或USB设备)之外,应用所需的一切几乎都可以满足。“裸WebAssembly”并不是它成功的必要条件; 它只是一个小的优化,不需要浏览器包含对 HTML,CSS 或 Javascript 的支持。 我不确定在桌面环境中让 WebAssembly 成为一等公民需要什么。需要良好的复制和粘贴支持,拖放支持,本地化和国际化,窗口管理事件以及创建通知的功能。也许这些已经可以从网络浏览器中获得; 我经常惊讶与已经可能的事情。 引发爆炸的火花是创建允许现有应用移植的环境。如果创造了“用于 WebAssembly 的 Linux 子系统”,那么可以将大量现有的开源软件移植到 WebAssembly 上。它需要模拟一个文件系统 - 可以通过将文件系统的所有只读部分都缓存为 HTTP 请求来完成,并且所有可写部分都可以在内存中,远程存储或使用浏览器可以提供的任何文件访问。图形支持可以通过移植 X11 或 Wayland 的实现来使用 WebGL(我理解已经作为 AIGLX 存在?)。 一些 SDL 游戏已经被移植到 WebAssembly - 最着名的是官方演示。 一旦 JVM 在 WebAssembly 中运行,就可以在浏览器中运行大量的 Java 软件。同样适用于其他虚拟机和使用它们的语言。 与 Windows 软件的巨大世界一样,我没有答案。WINE 和 ReactOS 都需要底层的 x86 或 x86-64 机器,所以唯一的选择是获取源代码并移植它,或者使用 x86 模拟器。 尾声 WebAssembly 即将到来。 它来得很慢,但现在所有的部分都可以在你正在使用的浏览器上使用。现在我们等待构建用于从各种编程语言中定位 WebAssembly 的基础设施。一旦构建完成,我们将摆脱 HTML,CSS 和 Javascript 的束缚。 加入阿里云钉钉群享福利:每周技术直播,定期群内有奖活动、大咖问答 阿里云开发者社区
茶什i 2020-01-07 10:32:35 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT 阿里云科技驱动中小企业数字化