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

如何在React Native安卓应用中集成Google Play Integrity API?

集成Google Play Integrity API到React Native安卓应用

1. 添加安卓依赖

在安卓项目的app/build.gradle文件中,引入Play Integrity库:

dependencies {
    // 保留原有依赖,新增以下行
    implementation "com.google.android.play:integrity:1.1.0"
}

2. 封装原生调用模块

React Native无官方Play Integrity封装,需自行编写原生模块:

2.1 创建模块类

在android/app/src/main/java/com/[你的应用包名]/路径下,新建PlayIntegrityModule.java:

package com.[你的应用包名];

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Promise;
import com.google.android.play.core.integrity.IntegrityManager;
import com.google.android.play.core.integrity.IntegrityManagerFactory;
import com.google.android.play.core.integrity.IntegrityTokenRequest;
import com.google.android.play.core.integrity.IntegrityTokenResponse;
import com.google.android.play.core.tasks.Task;
import com.google.android.play.core.tasks.Tasks;

public class PlayIntegrityModule extends ReactContextBaseJavaModule {
    private final IntegrityManager integrityManager;

    public PlayIntegrityModule(ReactApplicationContext reactContext) {
        super(reactContext);
        integrityManager = IntegrityManagerFactory.create(reactContext);
    }

    @Override
    public String getName() {
        return "PlayIntegrity";
    }

    @ReactMethod
    public void requestIntegrityToken(String nonce, Promise promise) {
        try {
            IntegrityTokenRequest request = IntegrityTokenRequest.builder()
                    .setNonce(nonce)
                    .setCloudProjectNumber([你的Google Cloud项目编号])
                    .build();

            Task<IntegrityTokenResponse> task = integrityManager.requestIntegrityToken(request);
            IntegrityTokenResponse response = Tasks.await(task);
            promise.resolve(response.token());
        } catch (Exception e) {
            promise.reject("PLAY_INTEGRITY_ERROR", e.getMessage());
        }
    }
}

2.2 注册模块包

同路径下新建PlayIntegrityPackage.java:

package com.[你的应用包名];

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PlayIntegrityPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new PlayIntegrityModule(reactContext));
        return modules;
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

2.3 接入到应用主类

修改MainApplication.java的getPackages方法:

@Override
protected List<ReactPackage> getPackages() {
    List<ReactPackage> packages = new PackageList(this).getPackages();
    // 添加以下行注册模块
    packages.add(new PlayIntegrityPackage());
    return packages;
}

3. React Native端调用

创建工具文件PlayIntegrity.js:

import { NativeModules } from 'react-native';

const { PlayIntegrity } = NativeModules;

export const requestIntegrityToken = async (nonce) => {
  try {
    const token = await PlayIntegrity.requestIntegrityToken(nonce);
    // 将token发送至后端进行验证,切勿在前端处理验证逻辑
    return token;
  } catch (error) {
    console.error('获取完整性令牌失败:', error);
    throw error;
  }
};

4. 后端验证令牌

拿到前端传回的令牌后,在后端调用Google的验证接口(以Node.js为例):

const { google } = require('googleapis');

async function verifyIntegrityToken(token) {
  const client = await google.auth.getClient({
    scopes: ['https://www.googleapis.com/auth/playintegrity'],
  });

  const response = await google.playintegrity({
    version: 'v1',
    auth: client,
  }).v1.decodeIntegrityToken({
    packageName: '[你的应用包名]',
    requestBody: {
      integrityToken: token,
    },
  });

  return response.data;
}

关键注意点

  • 替换代码中[你的应用包名]、[你的Google Cloud项目编号]为实际值
  • Nonce需为随机生成的唯一字符串,用于防范重放攻击
  • 必须使用Google Play签名的APK/App Bundle测试,本地调试包无法获取有效令牌

内容的提问来源于stack exchange,提问作者GaboMndz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:10:24