Android集成阿里云消息推送的方法步骤
一 创建App应用
1.1 在控制台发(https://mhub.console.aliyun.com)的App列表页,点击页面产品列表中“添加产品”的图标即可创建一个新的产品(产品是一个集合的概念,产品下包含iOS应用、Android应用)。
然后点击刚创建的产品,点击“添加应用”的图标即可添加Android或者iOS应用(目前只能创建分端应用了,个人感觉还是不分端的好)。
1.2 输入APP基本信息并在控制台配置应用
输入产品的基本信息创建App时需要输入产品的名称,上传产品图标,选择产品分类。
其中App的名称必填,支持中文、英文字母、数字和下划线,长度限制在4-30位。
1.创建Android应用,并填写APP名称和PackageName。
2. 创建iOS应用,并填写APP名称和BundleId
二 Android SDK 3.0配置
以下集成是官方Android SDK的快速集成适用于V3.0.0以上版本。通过Maven库快速集成,该集成方案配置简单,不容易出问题。 (详情参考官方集成文档)
2.1 快速集成(远程同步)
在Project根目录下build.gradle文件中配置maven库URL:
allprojects {repositories {jcenter()maven {url 'http://maven.aliyun.com/nexus/content/repositories/releases/'}}}
在对应的module下的build.gradle文件中添加对应依赖:
android {......defaultConfig {applicationId "com.xxx.xxx" //包名......ndk {//选择要添加的对应cpu类型的.so库。为了兼容cpu,查看官网SDK的libs多添加几个abiFilters 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'mips64', 'x86', 'x86_64'}......}......}dependencies {......compile 'com.aliyun.ams:alicloud-android-push:3.1.2'......
}
注 : 如果在添加以上 abiFilter 配置之后android Studio出现以下提示:(一般不会出错)
NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
则在 Project 根目录的gradle.properties文件中添加:
android.useDeprecatedNdk=true
2.2 AndroidManifest配置
2.2.1 appKey, appSecret配置
在AndroidManifest文件中设置appKey,appSecret:
<application android:name="*****"><!-- 请填写你自己的- appKey --><meta-data android:name="com.alibaba.app.appkey" android:value="*****"/> <!-- 请填写你自己的appSecret --><meta-data android:name="com.alibaba.app.appsecret" android:value="****"/> </application>
(百川的appkey&appSecret不能在阿里云推送上使用否则应用会找不到对应的appKey)
2.2.2 消息接收Receiver配置
创建消息接收Receiver,继承自com.alibaba.sdk.android.push.MessageReceiver,并在对应回调中添加业务处理逻辑,可参考以下代码:
public class MyMessageReceiver extends MessageReceiver {// 消息接收部分的LOG_TAGpublic static final String REC_TAG = "receiver";@Overridepublic void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {// TODO 处理推送通知Log.e("MyMessageReceiver", "Receive notification, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);}@Overridepublic void onMessage(Context context, CPushMessage cPushMessage) {Log.e("MyMessageReceiver", "onMessage, messageId: " + cPushMessage.getMessageId() + ", title: " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());}@Overridepublic void onNotificationOpened(Context context, String title, String summary, String extraMap) {Log.e("MyMessageReceiver", "onNotificationOpened, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);}@Overrideprotected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {Log.e("MyMessageReceiver", "onNotificationClickedWithNoAction, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);}@Overrideprotected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {Log.e("MyMessageReceiver", "onNotificationReceivedInApp, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap + ", openType:" + openType + ", openActivity:" + openActivity + ", openUrl:" + openUrl);}@Overrideprotected void onNotificationRemoved(Context context, String messageId) {Log.e("MyMessageReceiver", "onNotificationRemoved");}}
将该receiver添加到AndroidManifest.xml中(由于部分手机不允许监听系统的广播,把部分过滤器去掉即可。下面示例是已经去掉)
<!-- 消息接收监听器 (用户可自主扩展) -->
<receiverandroid:name=".MyMessageReceiver"android:exported="false"> <!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过android:permission进行限制 --><intent-filter><action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /></intent-filter><intent-filter><action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /></intent-filter><intent-filter><action android:name="com.alibaba.sdk.android.push.RECEIVE" /></intent-filter>
</receiver>
在Manifest中还需要添加以下配置
<!-- V3.0.12及以上版本需配置 --><serviceandroid:name="com.taobao.accs.internal.AccsJobService"android:permission="android.permission.BIND_JOB_SERVICE"android:process=":channel"/><!-- V3.0.7及以上版本需配置 --><service android:name="com.alibaba.sdk.android.push.channel.KeepChannelService"android:permission="android.permission.BIND_JOB_SERVICE"android:process=":channel" /><receiver android:name="com.alibaba.sdk.android.push.SystemEventReceiver"android:process=":channel"><intent-filter><action android:name="android.intent.action.MEDIA_MOUNTED"/><action android:name="android.intent.action.ACTION_POWER_CONNECTED"/><action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/></intent-filter></receiver><!-- V3.0.9及以上版本需配置 --><activityandroid:name="com.alibaba.sdk.android.push.keeplive.PushExtActivity"android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"android:excludeFromRecents="true"android:exported="false"android:finishOnTaskLaunch="false"android:launchMode="singleInstance"android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"android:process=":channel"></activity>
2.2.3 Proguard配置
-keepclasseswithmembernames class ** {native <methods>;
}
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
-keep class com.taobao.** {*;}
-keep class com.alibaba.** {*;}
-keep class com.alipay.** {*;}
-keep class com.ut.** {*;}
-keep class com.ta.** {*;}
-keep class anet.**{*;}
-keep class anetwork.**{*;}
-keep class org.android.spdy.**{*;}
-keep class org.android.agoo.**{*;}
-keep class android.os.**{*;}
-dontwarn com.taobao.**
-dontwarn com.alibaba.**
-dontwarn com.alipay.**
-dontwarn anet.**
-dontwarn org.android.spdy.**
-dontwarn org.android.agoo.**
-dontwarn anetwork.**
-dontwarn com.ut.**
-dontwarn com.ta.**
2.2.4 在应用中注册和启动推送
以下是应用初始化的官方参考代码:
import android.app.Application;
import android.content.Context;
import android.util.Log;
import com.alibaba.sdk.android.callback.InitResultCallback;
import com.alibaba.sdk.android.push.CloudPushService;
import com.alibaba.sdk.android.push.CommonCallback;
import com.alibaba.sdk.android.push.noonesdk.PushServiceFactory;
public class MainApplication extends Application {private static final String TAG = "Init";@Overridepublic void onCreate() {super.onCreate();initCloudChannel(this);}/*** 初始化云推送通道* @param applicationContext*/private void initCloudChannel(Context applicationContext) {PushServiceFactory.init(applicationContext);CloudPushService pushService = PushServiceFactory.getCloudPushService();pushService.register(applicationContext, new CommonCallback() {@Overridepublic void onSuccess(String response) {Log.d(TAG, "init cloudchannel success");}@Overridepublic void onFailed(String errorCode, String errorMessage) {Log.d(TAG, "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);}});}
}
初始化成功后Log输出在过滤添加正则MPS显示如下:
三 移动推送辅助通道配置
移动推送的辅助通道的配置主要针对小米和华为设备(目前只能接收通知,不能直接接收消息)对其他设备也有一定的保活效果。官网有辅助通道相关概念。
3.1 配置应用
注册你的App, 得到相应的小米AppID,小米AppKey,小米AppSecert。在控制台注册你的App, 得到相应的小米AppID,小米AppKey,小米AppSecert。(小米开放平台)
注册App,应用审核通过后,能够得到华为的AppID和AppSecert。在控制台App详情中设置你的华为AppID和AppSecert。(注意,您的app不能是草稿状态,必须是审核中,或者通过审核的状态,不然通道不会生效。请确保您在华为控制台激活了推送通道功能)。(华为开发者联盟)
注(在每个开发者中心申请,小米的最好联系下客服会快点,小米创建应用很快,就是开发者审核慢点;华为的开发这审核快,创建应用填写基本信息也是要点时间的。)
如果你的应用是国际版的可以在FCM平台上添加项目,以提高推送的到达率,接入前提手机必须安装google play services, 否则注册不成功, 大部分国内的手机是谷歌服务被剥离了:(FCM平台需要翻墙,如果不需要国际化,则不必配置)
在以上平台申请成功后会看到:上面是小米的,下面是华为的。
然后就可以在阿里云控制台的应用列表填写扩展信息了
3.2 下载扩展包
将小米华为扩展包拷贝到你项目的Lib目录下,下载地址。
如果碰到arr文件扩展包无法添加的情况,建议解压aar将其中的jar引入,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: 'third-push-support-3.0.5', ext: 'aar')
}
如需配置GCM/FCM通道还需要添加Firebase SDK依赖:
dependencies {......compile ('com.google.firebase:firebase-messaging:9.6.1')}
3.3 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.**
3.4 在应用中初始化小米华为初始化通道
将以下代码加入你application.onCreate()方法中初始通道。注意:辅助通道注册需要放在推送SDK初始化代码之后。
// 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");// 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。HuaWeiRegister.register(applicationContext);//GCM/FCM辅助通道注册GcmRegister.register(this, sendId, applicationId); //sendId/applicationId为步骤获得的参数
注册方法会自动判断是否支持小米/华为系统推送,如不支持会跳过注册。
3.5 在日志中查看初始化情况
华为通道初始化成功,可以看到以下日志:
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 = 0865743024312547200000041100000111-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiRegister﹕ report huaweiPushId intent... //完成华为注册和信息上报
小米通道初始化成功,可以看到以下日志:
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
初始化成功后,由于小米/华为系统管控比较严格,所以应用被杀死后仍不能接收通知,需要配置配置专门的辅助弹窗。
3.6 系统辅助弹窗配置
辅助官网已经废除了MiPushSystemNotificationActivity(不过不影响使用),建议使用继承
AndroidPopupActivity指定打开的托管的弹窗Activity在AndroidManifest.xml中注册需要声明android:exported=true,还有如果在PopupActivity的onSysNoticeOpened
方法中没有指定跳转界面,或者在onCreate中没有设置布局文件,点击辅助弹窗通知后只会显示一个空白界面。
import com.alibaba.sdk.android.push.AndroidPopupActivity;public class PopupPushActivity extends AndroidPopupActivity{static final String TAG = "PopupPushActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(activity_popuppush);}/*** 实现通知打开回调方法,获取通知相关信息* @param title 标题* @param summary 内容* @param extMap 额外参数*/@Overrideprotected void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {Log.d("onSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);}}
推送通知打开指定Activity时如何操作
推送通知打开指定Activity时如何获取推送通知参数
四 Android SDK服务器配置 (当前推送对象是Android,iOS的证书配置完好的话选择全推也是可以的)
官网服务器移动推送Demo需要添加推送的SDK依赖(本示例代码是Java版本,如需要其他版本参看官网其他示例)
- SDK 地址
- Demo 地址
首先下载推送的push-openapi-java-demo,由于官网是使用IDEA开发的Demo,所以如果你使用Eclipse或者MyEclipse要以Maven的方式导入项目。
4.1 获取AccessKeyId和AccessKeySecret
前往阿里云官网控制台获取
4.2 获取appKey
>>前往移动推动控制台获取 app列表->应用证书
在开发工具中打开push-openapi-java-demo中的src/test/resources/push.properties.template文件修改配置文件名称为push.properties
以下是该配置文件说明:
4.3 引入SDK依赖
在下载的SDK中找到aliyun-java-sdk-push,
如果使用IDEA开发的分别将aliyun-java-sdk-push,aliyun-java-sdk-core和push-openapi-java-demo并且给push-openapi-java-demo添加aliyun-java-sdk-push,aliyun-java-sdk-core依赖。
如果使用Eclipse(或者MyEclipse)开发,以maven项目导入aliyun-java-sdk-push,aliyun-java-sdk-core和push-openapi-java-demo然后再给push-openapi-java-demo添加aliyun-java-sdk-push,aliyun-java-sdk-core依赖。
官网上是直接使用maven添加的(但有的时候可能同步依赖不完整)
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-push</artifactId><version>3.0.2</version>
</dependency>
添加依赖成功后IDEA的文件目录如下:
添加依赖成功后MyEclipse的文件目录如下:
亲测都能够实现推送测试。
五 服务端测试给Android发送通知
如果想自己拼接url进行推送,不使用Demo可以参考以下示例代码:将对应的access_key_id,access_key_secret,appkey换成自己在控制台申请的即可执行main方法。
import sun.misc.BASE64Encoder;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.SignatureException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;/*** 移动推送OpenAPI调用示例* 以PushNoticeToAndroid接口为例,其他接口请替换相应接口名称及私有参数*/
public class Main {//账号AK信息请填写(必选)private static String access_key_id = "";//账号AK信息请填写(必选)private static String access_key_secret = "";//账号AppKey信息请填写(必选)private static String appkey = "";//以下参数不需要修改//STS临时授权方式访问时该参数为必选,使用主账号AK和RAM子账号AK不需要填写private static String security_token = "";private final static String VOD_DOMAIN = "http://cloudpush.aliyuncs.com";private final static String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";private final static String HTTP_METHOD_GET = "GET";private final static String HMAC_SHA1_ALGORITHM = "HmacSHA1";private final static String UTF_8 = "utf-8";private final static Logger LOG = Logger.getLogger(Main.class.getName());/*** @param args* @throws IOException*/public static void main(String[] args) throws IOException {//生成私有参数,不同API需要修改Map<String, String> privateParams = generatePrivateParamters();//生成公共参数,不需要修改Map<String, String> publicParams = generatePublicParamters();//生成OpenAPI地址,不需要修改String URL = generateOpenAPIURL(publicParams, privateParams);//发送HTTP GET 请求httpGet(URL);}/*** 移动推送OpenAPI私有参数* 不同API需要修改此方法中的参数* 推送高级接口 https://help.aliyun.com/knowledge_detail/48089.html** @return*/private static Map<String, String> generatePrivateParamters() {// 接口私有参数列表, 不同API请替换相应参数Map<String, String> privateParams = new HashMap<String, String>();// API名称privateParams.put("Action", "Push");// AppKeyprivateParams.put("AppKey", appkey);//推送目标: DEVICE:按设备推送 ALIAS : 按别名推送 ACCOUNT:按帐号推送 TAG:按标签推送; ALL: 广播推送privateParams.put("Target", "ALL");//根据Target来设定privateParams.put("TargetValue", "ALL");// 消息类型 MESSAGE NOTICEprivateParams.put("PushType", "NOTICE");// 设备类型 ANDROID iOS ALLprivateParams.put("DeviceType", "ANDROID");// 推送的标题privateParams.put("Title", "title");// 推送的内容privateParams.put("Body", "body");//通知的提醒方式 "VIBRATE" : 震动 "SOUND" : 声音 "BOTH" : 声音和震动 NONE : 静音privateParams.put("AndroidNotifyType", "BOTH");privateParams.put("AndroidNotificationBarType", "1");privateParams.put("AndroidNotificationBarPriority", "1");privateParams.put("AndroidOpenType", "URL");privateParams.put("AndroidOpenUrl", "http://www.aliyun.com");privateParams.put("AndroidMusic", "default");privateParams.put("AndroidPopupActivity", "com.alibaba.cloudpushdemo.bizactivity.ThirdPushPopupActivity");privateParams.put("AndroidPopupTitle", "PopupTitle");privateParams.put("AndroidPopupBody", "PopupBody");privateParams.put("PushTime", generateTimestamp(System.currentTimeMillis()));privateParams.put("ExpireTime", generateTimestamp(System.currentTimeMillis() + 12 * 3600 * 1000));// 离线消息是否保存,若保存, 在推送时候,用户即使不在线,下一次上线则会收到privateParams.put("StoreOffline", "true");//设定通知的扩展属性privateParams.put("ExtParameters", "{'key1':'value1','api_name':'PushRequest'}");return privateParams;}/*** 移动推送OpenAPI公共参数* 不需要修改** @return*/private static Map<String, String> generatePublicParamters() {Map<String, String> publicParams = new HashMap<String, String>();publicParams.put("Format", "JSON");publicParams.put("Version", "2016-08-01");publicParams.put("AccessKeyId", access_key_id);publicParams.put("SignatureMethod", "HMAC-SHA1");publicParams.put("Timestamp", generateTimestamp(System.currentTimeMillis()));publicParams.put("SignatureVersion", "1.0");publicParams.put("SignatureNonce", generateRandom());if (security_token != null && security_token.length() > 0) {publicParams.put("SecurityToken", security_token);}return publicParams;}/*** 生成OpenAPI地址** @param privateParams* @return* @throws Exception*/private static String generateOpenAPIURL(Map<String, String> publicParams, Map<String, String> privateParams) {return generateURL(VOD_DOMAIN, HTTP_METHOD_GET, publicParams, privateParams);}/*** @param domain 请求地址* @param httpMethod HTTP请求方式GET,POST等* @param publicParams 公共参数* @param privateParams 接口的私有参数* @return 最后的url*/private static String generateURL(String domain, String httpMethod, Map<String, String> publicParams, Map<String, String> privateParams) {List<String> allEncodeParams = getAllParams(publicParams, privateParams);String cqsString = getCQS(allEncodeParams);out("CanonicalizedQueryString = " + cqsString);String stringToSign = httpMethod + "&" + percentEncode("/") + "&" + percentEncode(cqsString);out("StringtoSign = " + stringToSign);String signature = hmacSHA1Signature(access_key_secret, stringToSign);out("Signature = " + signature);return domain + "?" + cqsString + "&" + percentEncode("Signature") + "=" + percentEncode(signature);}private static List<String> getAllParams(Map<String, String> publicParams, Map<String, String> privateParams) {List<String> encodeParams = new ArrayList<String>();List<String> publicParamsList = paramsUrlEncode(publicParams);List<String> privateParamsList = paramsUrlEncode(privateParams);encodeParams.addAll(publicParamsList);encodeParams.addAll(privateParamsList);return encodeParams;}/*** 将参数和值都urlEncode一下*/private static List<String> paramsUrlEncode(Map<String, String> params) {List<String> encodeParams = new ArrayList<String>();if (params != null) {for (String key : params.keySet()) {String value = params.get(key);//将参数和值都urlEncode一下。String encodeKey = percentEncode(key);String encodeVal = percentEncode(value);encodeParams.add(encodeKey + "=" + encodeVal);}}return encodeParams;}/*** 参数urlEncode** @param value* @return*/private static String percentEncode(String value) {try {String urlEncodeOrignStr = URLEncoder.encode(value, "UTF-8");String plusReplaced = urlEncodeOrignStr.replace("+", "%20");String starReplaced = plusReplaced.replace("*", "%2A");String waveReplaced = starReplaced.replace("%7E", "~");return waveReplaced;} catch (UnsupportedEncodingException e) {e.printStackTrace();}return value;}/*** 获取CQS 的字符串** @param allParams* @return*/private static String getCQS(List<String> allParams) {ParamsComparator paramsComparator = new ParamsComparator();Collections.sort(allParams, paramsComparator);String cqString = "";for (int i = 0; i < allParams.size(); i++) {cqString += allParams.get(i);if (i != allParams.size() - 1) {cqString += "&";}}return cqString;}private static class ParamsComparator implements Comparator<String> {@Overridepublic int compare(String lhs, String rhs) {return lhs.compareTo(rhs);}}private static String hmacSHA1Signature(String accessKeySecret, String stringtoSign) {try {String key = accessKeySecret + "&";try {SecretKeySpec signKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);mac.init(signKey);byte[] rawHmac = mac.doFinal(stringtoSign.getBytes());//按照Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)return new String(new BASE64Encoder().encode(rawHmac));} catch (Exception e) {throw new SignatureException("Failed to generate HMAC : " + e.getMessage());}} catch (SignatureException e) {e.printStackTrace();}return "";}/*** 生成随机数** @return*/private static String generateRandom() {String signatureNonce = UUID.randomUUID().toString();return signatureNonce;}/*** 生成当前UTC时间戳** @return*/public static String generateTimestamp(long time) {Date date = new Date(time);SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);df.setTimeZone(new SimpleTimeZone(0, "GMT"));return df.format(date);}private static String httpGet(String url) throws IOException {/** Read and covert a inputStream to a String.* Referred this:* http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string*/out("URL = " + url);@SuppressWarnings("resource")Scanner s = new Scanner(new URL(url).openStream(), UTF_8).useDelimiter("\\A");try {String resposne = s.hasNext() ? s.next() : "true";out("Response = " + resposne);return resposne;} finally {s.close();}}private static void out(String newLine) {LOG.log(Level.INFO, newLine);}
}
Android集成阿里云消息推送的方法步骤相关推荐
- Android 集成阿里云移动推送
该博客不为学术讨论,仅是记录,方便以后用到快速集成开发,有兴趣者可以mark一下以备使用.当然也为推送的小白提供方便. 因为公司内部有第三方安全检测机构,所以用某光推送时,因为极光推送原理是会通过其他 ...
- 阿里云消息推送同时推送到iOS和android问题解决
1. SDK.InvalidRegionID :can not find endpoint to access 在阿里开发手册中给出的解决方法,产生原因是由于SDK核心包版本过低,升级版本即可解决. ...
- python消息推送_Python阿里云消息推送调用API
很多公司测试APP推送时候,应该也是很头疼:推送环境:测试.正式,稍不注意就把测试的push到正式上,导致所有用户都收到 例子很多: 其实阿里.极光都有推送Api,直接调用API就ok,特别是有的公司 ...
- YII2.0使用阿里云邮件推送实现邮件发送
从YII中文网小马哥发布的教程http://www.yiichina.com/tutorial/320获取到163邮箱的配置方法 1.在配置文件main-local.php components=&g ...
- 友盟推送和阿里云移动推送使用注意事项、不同点比较
友盟推送和阿里云移动推送,都属于阿里系的产品,在使用上很大一部分还是很相似的,阿里云将移动推送.移动热修复.移动测试.移动数据分析和移动用户反馈集成到了一块,所有的远程依赖也都是集成在一起了,然而友盟 ...
- 【转】android系统的APP消息推送机制
原文:https://www.jianshu.com/p/f898a2c02b05 参考文章: http://blog.csdn.net/carson_ho/article/details/52862 ...
- 阿里云移动推送服务java调用
阿里云移动推送服务java调用 首先登录阿里云官网,开通移动推送服务 创建app和平台 配置应用 测试推送 根据文档编写自己的调用方法 测试推送 ##具体步骤如下: 登录阿里云官网 https://w ...
- 基于阿里云移动推送的移动应用推送模式最佳实践
摘要: ### 一.概念 以下概念对应系统设计时的语义,对于如何合理使用移动推送有借鉴意义 #### 1.1 设备 安装并使用开发者移动应用的装置 #### 1.2 设备ID 阿里云移动推送为设备分配 ...
- 阿里云移动推送服务使用教程
产品概述: 阿里移动推送(Alibaba Cloud Mobile Push)是基于大数据的移动智能推送服务,帮助App快速集成移动推送的功能,在实现高效.精确.实时的移动推送的同时,极大地降低了开发 ...
最新文章
- 哲学家就餐问题linux源代码,Linux下实现哲学家就餐问题
- 华为HMS生态解析与移动生态盘点
- TensorFlow 教程 --新手入门--1.3 安装实例
- matlab求最大公倍数_小学数学最大公因数最小公倍数练习
- php函数fiter,PHP filter_var() 函数和 Filter 函数使用说明
- Gurobi建模遇到的坑
- 敏捷个人课后练习五主题:改变
- 巩固知识体系!淘宝秒杀脚本java
- idea git提交代码步骤
- 电脑出现GRUB4DOS 0.4.5c、、、怎么办
- 微信逆向分析(一)——逆向分析的原理
- future java get_关于 Future get方法的疑问
- java color类红黄蓝_一种具有红黄蓝母体结构多发色体系的活性染料及其制备方法和应用与流程...
- MATLAB数学实验——Jacobi迭代法Gauss-Seidel迭代法
- 信息学奥赛一本通-1042
- SuperMap Objects组件式开发
- 【课件整理复习】第十一章 图像识别与文字处理
- 177本名著浓缩成了177句话
- OneDrive和OneDrive for Business映射到本地网络驱动器
- mysql还原.bak文件_mysql还原bak文件