You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Android端启用TLS 1.1/1.2步骤及上架疑虑咨询

React Native低版本Android(API 16-19)TLS 1.1/1.2启用方案及Play Store上架疑虑解答

嗨,我之前在React Native项目里也遇到过一模一样的问题,针对低版本Android的TLS支持问题,我给你整理了一步一步的操作步骤,同时也帮你理清Play Store上架的顾虑~

一、具体实现步骤(无需深入Java知识)

你的项目minSdkVersion是16,对应Android 4.1及以上,而这些版本默认没开启TLS 1.1/1.2,我们只需要修改少量Android原生代码就能解决:

  1. 创建TLS配置类
    打开你的RN项目中android/app/src/main/java/com/[你的项目包名]/目录(比如你的包名是com/myapp,就找到这个文件夹),新建一个名为TLSSocketFactory.java的Java文件,复制以下代码进去:

    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.security.KeyManagementException;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    
    public class TLSSocketFactory extends SSLSocketFactory {
    
        private SSLSocketFactory internalSSLSocketFactory;
    
        public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init((KeyStore) null);
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
    
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
            internalSSLSocketFactory = context.getSocketFactory();
        }
    
        @Override
        public String[] getDefaultCipherSuites() {
            return internalSSLSocketFactory.getDefaultCipherSuites();
        }
    
        @Override
        public String[] getSupportedCipherSuites() {
            return internalSSLSocketFactory.getSupportedCipherSuites();
        }
    
        @Override
        public Socket createSocket() throws IOException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
        }
    
        @Override
        public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
        }
    
        @Override
        public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
        }
    
        @Override
        public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
        }
    
        @Override
        public Socket createSocket(InetAddress host, int port) throws IOException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
        }
    
        @Override
        public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
        }
    
        private Socket enableTLSOnSocket(Socket socket) {
            if(socket != null && (socket instanceof SSLSocket)) {
                ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
            }
            return socket;
        }
    }
    

    这个类会帮低版本系统启用TLS 1.1/1.2,同时沿用系统默认的证书信任机制,保证安全性,这也是Play Store上架的关键。

  2. 修改Application类
    在同一个包目录下找到MainApplication.java文件,做两处修改:

    • 在文件顶部添加两个导入语句:
      import android.os.Build;
      import javax.net.ssl.HttpsURLConnection;
      
    • 在onCreate方法里添加启用TLS的逻辑(放在原有RN初始化代码之前,比如SoLoader.init之前):
      @Override
      public void onCreate() {
          super.onCreate();
          // 仅针对Android 4.1-4.4(API 16-19)启用TLS 1.1/1.2
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT_WATCH) {
              try {
                  TLSSocketFactory socketFactory = new TLSSocketFactory();
                  HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          // 保留你原有的React Native初始化代码
          SoLoader.init(this, /* native exopackage */ false);
          // ...其他原有代码
      }
      
  3. 测试验证
    回到RN项目根目录,执行npx react-native run-android,在Android 4.1、4.4、5.1的设备或模拟器上测试,应该就能正常获取API数据了。

二、关于Play Store上架的疑虑

你看到的“启用后无法上架”的说法大概率是过时或者误解,现在完全可以正常上架,原因如下:

  • Google Play政策支持:Google早在2018年就要求所有应用必须支持TLS 1.2,针对低版本系统通过代码启用TLS 1.2是符合政策要求的,甚至是推荐的做法,能提升低版本用户的安全性。
  • 安全合规性:我们上面用的代码沿用了系统默认的证书信任机制,不会信任所有未知证书(有些错误的实现会用信任所有证书的代码,这才会被Play Store拒),完全符合安全规范。
  • 低版本支持的合理性:只要你的minSdkVersion设置符合要求(你现在是16),Google允许应用支持这些旧版本,启用TLS不会成为上架的障碍。

如果还有其他问题,随时留言~

内容的提问来源于stack exchange,提问作者Lil-Rav El Génio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:07:35