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

基于Expo的React Native iOS应用IAP集成遇E_IAP_NOT_AVAILABLE错误求助

Expo React Native iOS内购集成问题解决方案

一、注册流程集成IAP的可行性确认

Expo官方的expo-in-app-purchases模块完全支持在用户注册流程中集成iOS内购,只要配置和代码逻辑正确,即可实现购买后完成注册的流程。

二、E_IAP_NOT_AVAILABLE错误排查与解决

该错误通常由环境配置或权限问题导致,按以下步骤逐一排查:

  • 必须使用真实iOS设备测试
    iOS模拟器不支持内购功能,务必切换到真实设备进行测试。

  • 配置沙箱测试账号

    1. 在Apple开发者后台的「用户和访问」→「沙箱测试员」中创建测试账号
    2. 退出设备上的真实Apple ID(设置→App Store→退出登录),测试内购时会自动弹出沙箱账号登录提示,使用创建的测试账号登录
  • 检查内购商品状态

    1. Apple开发者后台创建的内购商品需处于「已批准」或「准备提交」状态(不能是「等待审核」)
    2. 代码中使用的productId必须与后台配置的完全一致,大小写、拼写不能有误差
  • Expo项目配置验证
    在app.json中添加内购权限配置:

    {
      "expo": {
        "ios": {
          "infoPlist": {
            "SKPaymentTransactionObserverEnabled": true
          }
        }
      }
    }
    

    确保已安装依赖包:npx expo install expo-in-app-purchases

三、TypeScript类型适配问题解决

  • 安装官方类型定义包:
    npm install @types/expo-in-app-purchases --save-dev
    
  • 自定义业务类型(如购买结果处理):
    interface PurchaseResult {
      productId: string;
      transactionId: string;
      receipt: string;
    }
    
  • 调用IAP方法时的类型断言示例:
    import * as IAP from 'expo-in-app-purchases';
    
    const fetchProducts = async () => {
      const { responseCode, results } = await IAP.getProductsAsync(['your_product_id']);
      if (responseCode === IAP.IAPResponseCode.OK) {
        const validProducts = results as IAP.Product[];
        // 处理商品数据
      }
    };
    

四、注册流程集成IAP示例代码

注册页面核心逻辑

import React, { useEffect, useState } from 'react';
import { View, Button, Alert } from 'react-native';
import * as IAP from 'expo-in-app-purchases';

const RegisterScreen = () => {
  const [isIAPReady, setIsIAPReady] = useState(false);
  const PREMIUM_REG_PRODUCT_ID = 'com.yourapp.premium_reg';

  useEffect(() => {
    initIAPConnection();
    return () => IAP.endConnectionAsync();
  }, []);

  const initIAPConnection = async () => {
    const { available } = await IAP.isAvailableAsync();
    if (!available) {
      Alert.alert('提示', '当前设备不支持内购');
      return;
    }
    await IAP.connectAsync();
    setIsIAPReady(true);
  };

  const handlePurchaseAndRegister = async () => {
    if (!isIAPReady) return;

    try {
      const { responseCode, results } = await IAP.requestPurchaseAsync(PREMIUM_REG_PRODUCT_ID);
      if (responseCode === IAP.IAPResponseCode.OK && results.length > 0) {
        const receipt = await IAP.getReceiptAsync();
        // 调用后端接口验证凭证,完成注册
        await verifyReceiptAndRegister(receipt);
        Alert.alert('成功', '已完成高级注册');
      } else {
        Alert.alert('失败', '购买未完成,请重试');
      }
    } catch (err) {
      Alert.alert('错误', (err as Error).message);
    }
  };

  const verifyReceiptAndRegister = async (receipt: string) => {
    // 后端验证Apple内购凭证的逻辑
    // 验证通过后创建用户账号
  };

  return (
    <View>
      <Button 
        title="购买高级注册" 
        onPress={handlePurchaseAndRegister} 
        disabled={!isIAPReady} 
      />
    </View>
  );
};

export default RegisterScreen;

App.tsx全局IAP连接配置

import { useEffect } from 'react';
import * as IAP from 'expo-in-app-purchases';

export default function App() {
  useEffect(() => {
    const setupIAP = async () => {
      const { available } = await IAP.isAvailableAsync();
      if (available) await IAP.connectAsync();
    };
    setupIAP();
    return () => IAP.endConnectionAsync();
  }, []);

  // 其他App路由、组件逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:33:20