Ⅰ jpush推送java後台怎麼調用
開發的時候需要引用appache的包commons-httpclient.jar 、commons-codec.jar、commons-logging.jar這些包可以到官網上下載,如果有需要的話也我也可以發給你。
引入上述這些包之後,就可以進行開發了。
這里需要特別說明的兩點是:
1、通過 HttpClient client = new DefaultHttpClient(); 獲得HttpClient對象不支持https,需要自己重寫。
2、我們的MD5編碼要和伺服器那邊的一樣。(我用我自己寫的MD5編碼驗證的時候,總是驗證失敗,後來跟他們的技術人員要了他們的md5的實現方式就通過驗證了)
好了,廢話不多說了,接下來是貼代碼的時候了:
類MySSLSocketFactory用來實現對https的支持
[java] view plain
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.conn.ssl.SSLSocketFactory;
public class MySSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
}
類ClientUtil 獲取可以支持https的HttpClient對象,調用MySSLSocketFactory 來取得
[java] view plain
import java.security.KeyStore;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
public class ClientUtil {
public static HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
e.printStackTrace();
return new DefaultHttpClient();
}
}
}
接下來就是調用JPush的api來推送消息了
[java] view plain
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**
* 調用遠程api實現推送
* @author naiyu
*
*/
public class PushMsgUtil {
// public static final String PUSH_URL = "https://api.jpush.cn:443/sendmsg/sendmsg";
public static final String PUSH_URL = "http://api.jpush.cn:8800/sendmsg/sendmsg";
public static void pushMsg(String msg) {
BasicNameValuePair name = new BasicNameValuePair("username", "test"); //用戶名
BasicNameValuePair sendno = new BasicNameValuePair("sendno", "3621"); // 發送編號。由開發者自己維護,標識一次發送請求
BasicNameValuePair appkeys = new BasicNameValuePair("appkeys", "your appkeys"); // 待發送的應用程序(appKey),只能填一個。
BasicNameValuePair receiver_type = new BasicNameValuePair("receiver_type", "4");
//驗證串,用於校驗發送的合法性。
BasicNameValuePair verification_code = new BasicNameValuePair("verification_code", getVerificationCode());
//發送消息的類型:1 通知 2 自定義
BasicNameValuePair msg_type = new BasicNameValuePair("msg_type", "1");
BasicNameValuePair msg_content = new BasicNameValuePair("msg_content", msg);
//目標用戶終端手機的平台類型,如: android, ios 多個請使用逗號分隔。
BasicNameValuePair platform = new BasicNameValuePair("platform", "android");
List<BasicNameValuePair> datas = new ArrayList<BasicNameValuePair>();
datas.add(name);
datas.add(sendno);
datas.add(appkeys);
datas.add(receiver_type);
datas.add(verification_code);
datas.add(msg_type);
datas.add(msg_content);
datas.add(platform);
try {
HttpEntity entity = new UrlEncodedFormEntity(datas, "utf-8");
HttpPost post = new HttpPost(PUSH_URL);
post.setEntity(entity);
HttpClient client = ClientUtil.getNewHttpClient();
HttpResponse reponse = client.execute(post);
HttpEntity resEntity = reponse.getEntity();
System.out.println(EntityUtils.toString(resEntity));
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static String getVerificationCode() {
String username = "test"; //username 是開發者Portal帳戶的登錄帳戶名
String password = "pasword";
int sendno = 3621;
int receiverType = 4;
String md5Password = StringUtils.toMD5(password);; //password 是開發者Portal帳戶的登錄密碼
String input = username + sendno + receiverType + md5Password;
String verificationCode = StringUtils.toMD5(input);
return verificationCode;
}
public static void main(String[] args) {
String msg = "{\"n_title\":\"來點外賣\",\"n_content\":\"你好\"}";
System.out.println(msg);
PushMsgUtil.pushMsg(msg);
}
}
Ⅱ 為什麼我的手機,,收到微信只有震動沒有聲音
你在設置里關閉了聲音,所以只有震動,開啟方法:
1.打開微信,點擊右下角"我"。
Ⅲ ios 極光推送error 57 是什麼意思
error 57是內部錯誤,證明這個app在本ios版本運行有問題,建議換ios版本。
Ⅳ 百度雲推送java伺服器怎麼弄
網路雲(Bai Cloud)是網路推出的一項雲存儲服務,首次注冊即有機會獲得2T的空間,已覆蓋主流PC和手機操作系統,包含Web版、Windows版、Mac版、Android版、iphone版和Windows Phone版,用戶將可以輕松將自己的文件上傳到網盤上,並可跨終端隨時隨地查看和分享。
網路雲推送
網路提供了完整的Demo幫助開發者集成雲推送服務,推送服務SDK通過.jar包和.so文件的方式可以集成到我們自己的工程中。在此之前,需要到網路開發者中心進行應用注冊並獲取API Key,這個作為使用推送服務應用的唯一標示,具體流程我就不贅述了,需要使用的話可以直接訪問網路開發者中心進行查看。
下面主要看看Android_SDK的整體概覽和內部運行機制:
上圖是網路雲推送Android_SDK的框架圖,通過SDK可以繞過復雜的Push HTTP/HTTPS API直接和Push伺服器進行交互,主要提供如下功能:
Push服務初始化以及Client注冊綁定
創建或刪除標簽(Tag)
接收Push Server的通知並提供自定義展現消息方式
推送統計分析功能,包括通知的點擊和刪除統計以及應用使用情況統計
富媒體推送
在Android端,總共實現了三個Receiver和一個Service,其中,一個Receiver是用來處理注冊綁定後接收服務端返回的channelID等信息:
<receiver android:name="com..android.pushservice.RegistrationReceiver" android:process=": bdservice_v1"> <intent-filter> <action android:name="com..android.pushservice.action.METHOD " /> <action android:name="com..android.pushservice.action.BIND_SYNC " /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package" /> </intent-filter> </receiver>
第二個Receiver是用於接收系統消息以保證PushService正常運行:
<receiver android:name="com..android.pushservice.PushServiceReceiver" android:process=": bdservice_v1"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="com..android.pushservice.action.notification.SHOW" /> <action android:name="com..android.pushservice.action.media.CLICK" /> </intent-filter> </receiver>
第三個Receiver就是開發者自己實現的用來接收並處理推送消息:
<receiver android:name="your.package.PushMessageReceiver"> <intent-filter> <!-- 接收 push 消息 --> <action android:name="com..android.pushservice.action.MESSAGE" /> <!-- 接收 bind、setTags 等 method 的返回結果 --> <action android:name="com..android.pushservice.action.RECEIVE" /> </intent-filter> </receiver>
一個Service就是在後台運行的用於保障與Push Server維持長連接並做相關處理的後台服務:
<service android:name="com..android.pushservice.PushService" android:exported="true" android:process=" bdservice_v1"/> <!-- push service end -->
在開發者自己需要處理的廣播接收器中,可以對接收到的推送消息進行處理,Push消息通過 action為com..android.pushservice.action.MESSAGE的Intent把數據發送給客戶端your.package.PushMessageReceiver,消息格式由應用自己決定,PushService只負責把伺服器下發的消息以字元串格式透傳給客戶端。介面調用回調通過action為com..android.pushservice.action.RECEIVE的Intent 返回給your.package.PushMessageReceiver。
PushMessageReceiver.java
/** * Push消息處理receiver * @Author Ryan * @Create 2013-8-6 下午5:59:38 */ public class PushMessageReceiver extends BroadcastReceiver { public static final String TAG = PushMessageReceiver.class.getSimpleName(); @Override public void onReceive(final Context context, Intent intent) { if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) { //獲取消息內容 String message = intent.getExtras().getString( PushConstants.EXTRA_PUSH_MESSAGE_STRING); //消息的用戶自定義內容讀取方式 Log.i(TAG, "onMessage: " + message); } else if (intent.getAction().equals(PushConstants.ACTION_RECEIVE)) { //處理綁定等方法的返回數據 //PushManager.startWork()的返回值通過PushConstants.METHOD_BIND得到 //獲取方法 final String method = intent .getStringExtra(PushConstants.EXTRA_METHOD); //方法返回錯誤碼。若綁定返回錯誤(非0),則應用將不能正常接收消息。 //綁定失敗的原因有多種,如網路原因,或access token過期。 //請不要在出錯時進行簡單的startWork調用,這有可能導致死循環。 //可以通過限制重試次數,或者在其他時機重新調用來解決。 final int errorCode = intent .getIntExtra(PushConstants.EXTRA_ERROR_CODE, PushConstants.ERROR_SUCCESS); //返回內容 final String content = new String( intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT)); //用戶在此自定義處理消息,以下代碼為demo界面展示用 Log.d(TAG, "onMessage: method : " + method); Log.d(TAG, "onMessage: result : " + errorCode); Log.d(TAG, "onMessage: content : " + content); } } }
通過在入口Activity的onCreate方法中進行推送服務的注冊綁定後,即可在推送管理後台或是自己的應用伺服器上進行消息推送的操作了。
PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY, "you_api_key");
另外,雲推送提供php、java等Server端的SDK供開發者在自己的伺服器上實現推送服務進行定製化管理和操作。
四、單服務單通道機制
網路雲推送實現了單服務單通道的機制,如果在一台Device上安裝了多款Push SDK的應用,不會為每個應用都創建PushService,而是會採用多應用共享一個PushService的模式。這樣既能減少資源消耗也能降低網路流量。PushService運行於一個獨立進程,沒有和主進程運行於同一進程,所以主進程不需要常駐內存,當有新的Push消息時,PushService會通過Intent發送消息給主進程進行處理。通過Intent,以指定目標應用包名的方式,發送私有消息給應用。應用即不能接收不屬於自己的消息,也不能截取別人的消息,同時又降低了消耗,如下為示意圖:
後記:如今,國內提供Android推送服務的還有很多家,例如個推和極光推送等,實現的原理大同小異,開發者可以根據自身需要進行選擇。
Ⅳ iOS極光推送別名限制問題
我們的項目中集成了極光推送,將用戶id設置為別名,方便服務端對某個用戶發送自定義消息。前幾天遇到了一個用戶反應無法收到推送,經過調試發現在設置別名時返回了錯誤碼6009,極光官網的說明如下:
然後設置為debug模式,依然不知道是什麼原因。於是先想到的就是升級一下SDK。升到最新版3.4.0之後,錯誤碼變成了6017。錯誤原因如下:
然後在極光官方文檔上發現了這樣一句話:
RegistrationID就算作一個設備,即使我們是同一個手機,在卸載重裝之後如果RegistrationID發生變化,就會算作一個新的設備,當重復卸載重裝就會出現別名綁定失敗,導致接收不到推送。
什麼情況下RegistrationID會發生變化
然後我就嘗試卸載重裝,發現RegistrationID並未發生變化,這就很奇怪了。又是一通查找,找到了 這篇文章
裡面有提到極光內部的一些處理,極光會將數據保存到粘貼板,如果重裝時發現粘貼板有數據,RegistrationID就跟上次一樣,如果沒有數據,就會生成新的RegistrationID。
然後嘗試卸載APP後關機重啟,再安裝。RegistrationID果然發生了變化。
到現在知道了收不到推送的原因了,極光官方提倡我們去充錢,能將設備上限提升到100個。但是無法從根本上解決問題,所以繼續尋找解決方案。
在極光服務端的API文檔中找到了 這一部分
我們可以在客戶端通過調用極光服務端的API,解除別名綁定的設備。
具體解決思路如下:
極光在2020/03/10對別名綁定的設備數做了限制,在之前接入極光SDK的APP,使用別名功能時應該都存在這個問題的隱患,在此記錄一下。
不得不吐槽一下極光的文檔,對於設備也就是RegistrationID是否發生變化說的並不準確,而且iOS的SDK里並未提供批量解除別名綁定的API。
至於這個API到底是由客戶端去調用還是服務端去調用,就仁者見仁智者見智了。
Ⅵ android中消息推送用極光推送時出的問題
是不是倒包到的不對,我也遇到這個問題來著,你先clean下,看可以不,如果不行就刪除重新弄一遍,我貌似這樣弄好的
Ⅶ Android小米集成極光推送一步步教你,我也是一步步采坑
1、首先在極光後台用你的app包名創建應用獲取極光的appkey和appid,然後點擊推送配置,
2、在小米開放平台通過你的包名創建你app的應用 獲取小米這里的appkey和appid
3、在極光後台找到推送配置,把小米創建的appid和appkey 還有一個App Secret 填進去然後啟用
4、在你應用的app路徑的build.grile將極光和小米開放平台的appid和appkey都配置進去
我本來以為這樣就完成了,然後興沖沖的去測試推送,然後就遇到以下錯誤
xiaomi sdk appkey or appid was empty,please check your manifest config
如果你遇到這個錯誤的話,就一定記住你的appid和appkey前面一定要加上
MI-你的設備
然後我我跑起來發現,又報了如下錯誤
register fail 22022
5、https://dev.mi.com/console/appservice/push.html 登錄小米開放平台,點擊應用服務,立即體驗,然後找你的應用,把推送服務給我開啟
然後我又運行,發現又報錯了
xiao mi push register failed - errorCode:66108,reason:appid does not match packagename!
最後排查發現小米開放平台和極光後台的包名不一致 然後 就不報錯了