使用OkhttpUtils作爲網絡框架同時,使用Glide加載Https圖片

前言

公司的後臺公網之前的ca認證過期了,然後發現app中部分圖片加載不出來
然後對於數據來源進行分析,發現展示不出來的是https的圖片
網絡框架使用的是鴻洋的OkhttpUtils 2.6.3版本,進行了二次封裝
圖片框架使用的是Glide
OkhttpUtils有對於https證書的設置講解
這裏主要提供下自己遇到的情況下的解決方案
這裏的解決方案適用於自定義證書和信任所有證書

過程

網上有Glide加載Https圖片的方案
大家可以隨便搜索
大概的意思就是添加一個GlideModule來進行網絡請求庫的定製
需要添加GlideModule的依賴
我們也添加一下

compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'

然後需要在application中進行初始化

//讓Glide能用HTTPS
Glide.get(this).register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(RetrofitUtils.getOkHttpClient()));

我們可以發現RetrofitUtils.getOkHttpClient()是我們所沒有的
大概的意思就是需要一個網絡加載框架cilent來進行代理Glide的網絡加載部分

再來看下鴻洋的OkhttpUtils 2.6.3版本源碼

public class OkHttpClient implements Cloneable, Call.Factory {

可以發現,其集成了Call.Factory接口
這正是配置Glide時需要的

      public Factory(Call.Factory client) {

直接將設置好的OkhttpUtils的Cilent填充進來

     Glide
     .get(this)
     .register(GlideUrl.class, 
                 InputStream.class, 
                 new OkHttpUrlLoader.Factory(OkHttpUtils.getInstance().getOkHttpClient()));

最後 我們再在之前自己的框架中設置添加證書或者 https信任

     .sslSocketFactory(createSSLSocketFactory())
       .hostnameVerifier(new TrustAllHostnameVerifier())
    private static SSLSocketFactory createSSLSocketFactory() {
        SSLSocketFactory ssfFactory = null;

        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());

            ssfFactory = sc.getSocketFactory();
        } catch (Exception e) {
        }
        return ssfFactory;
    }
    private static class TrustAllHostnameVerifier implements HostnameVerifier {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }

    private static class TrustAllCerts implements X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }

我這裏是信任所有證書,對於添加證書的例子,百度就可以找到了
只是把設置證書的地方替換了就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章