最近蘋果宣布所有上架應用都要用https,我們后端走的是同一個函數,導致Android也要連接https.
百度了下,網上說客戶端不需要做什么特殊處理,因為cocos本身是支持https的.但是服務端自建的證書是不行的.需要購買的證書才可以.
但是還有個問題,購買的證書,Android可以拿到服務器列表,但是熱更新時連不上熱更新的服務器.
下面是我的解決方法.(思路是繞過https驗證,借鑒了網上的代碼)
找到這個jar文件,這個是熱更新時連接服務器的java文件編譯后的文件.具體的路徑在
cocos2d-x-3.13.1\cocos\platform\android\java\src\org\cocos2dx\lib
找到擴展名為.java的文件才能編輯,否則是編輯不了.
下面是我修改的代碼部分.
//內建類,下面會用到 public class SSLSocketFactor extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public SSLSocketFactor(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); // TODO Auto-generated constructor stub 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); } }
//修改cocos2dx原有的方法 public static Cocos2dxDownloader createDownloader(int id, int timeoutInSeconds, String tempFileNameSufix, int countOfMaxProcessingTasks) { Cocos2dxDownloader downloader = new Cocos2dxDownloader(); downloader._id = id; downloader._httpClient.setEnableRedirects(true); if (timeoutInSeconds > 0) { downloader._httpClient.setTimeout(timeoutInSeconds * 1000); } try { //Secure Protocol implementation. SSLContext ctx = SSLContext.getInstance("SSL"); //Implementation of a trust manager for X509 certificates X509TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException { } public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }; ctx.init(null, new TrustManager[] { tm }, null); SSLSocketFactory ssf = new SSLSocketFactory(ctx); //允許所有的驗證通過
ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); downloader._httpClient.setSSLSocketFactory(ssf); } catch (Exception e) { e.printStackTrace(); } // downloader._httpClient.setMaxRetriesAndTimeout(3, timeoutInSeconds * 1000); downloader._httpClient.allowRetryExceptionClass(javax.net.ssl.SSLException.class); downloader._tempFileNameSufix = tempFileNameSufix; downloader._countOfMaxProcessingTasks = countOfMaxProcessingTasks; return downloader; }