React Native IAP 应用内功能全流程解析与最佳实践

React Native IAP 应用内功能全流程解析与最佳实践

react-native-iap react-native native module for In App Purchase. react-native-iap 项目地址: https://gitcode.com/gh_mirrors/re/react-native-iap

前言

在移动应用开发中,应用内功能(IAP)是变现的重要方式之一。react-native-iap 作为 React Native 生态中最成熟的 IAP 解决方案,为开发者提供了跨平台的功能支持。本文将深入解析该库的功能流程设计原理,并给出完整的实现方案。

功能流程设计原理

传统流程的问题

在早期版本中,react-native-iap 采用基于 Promise 的回调模式,但在实际使用中发现了几个关键问题:

  1. 多响应问题:一次功能请求可能会产生多个响应
  2. 跨会话异步性:功能请求可能持续数小时,即使应用关闭后仍会继续
  3. 挂起状态难追踪:某些功能可能处于待处理状态
  4. 事件模式更合适:原生计费流程本质上是事件驱动而非回调驱动

新流程设计

基于这些发现,react-native-iap 重构了功能流程,采用事件监听模式:

  • 通过 purchaseUpdatedListener 监听成功功能
  • 通过 purchaseErrorListener 监听功能错误
  • 移除基于 Promise 的 buyProduct 方法,改用 requestPurchase

实现完整功能流程

1. 初始化与监听设置

建议在应用启动时立即设置监听器,因为可能有之前未完成的功能:

import {
  initConnection,
  purchaseUpdatedListener,
  purchaseErrorListener,
  finishTransaction,
  flushFailedPurchasesCachedAsPendingAndroid
} from 'react-native-iap';

class App extends Component {
  componentDidMount() {
    initConnection().then(() => {
      // 清理Android上失败的待处理功能
      flushFailedPurchasesCachedAsPendingAndroid()
        .then(() => {
          // 设置成功功能监听
          this.purchaseUpdateSubscription = purchaseUpdatedListener(
            async (purchase) => {
              if (purchase.transactionReceipt) {
                // 向服务器验证功能
                const deliveryResult = await verifyPurchaseOnServer(
                  purchase.transactionReceipt
                );
                
                if (deliveryResult.success) {
                  // 完成交易
                  await finishTransaction({
                    purchase,
                    isConsumable: true // 根据商品类型设置
                  });
                }
              }
            }
          );
          
          // 设置功能错误监听
          this.purchaseErrorSubscription = purchaseErrorListener(
            (error) => console.warn('功能错误', error)
          );
        });
    });
  }
  
  componentWillUnmount() {
    // 清理监听器
    this.purchaseUpdateSubscription?.remove();
    this.purchaseErrorSubscription?.remove();
  }
}

2. 发起功能请求

根据商品类型(一次性商品或订阅)发起不同的请求:

import { Platform, Pressable } from 'react-native';
import { requestPurchase, requestSubscription } from 'react-native-iap';

class App extends Component {
  // 功能一次性商品
  handlePurchase = async (productId) => {
    try {
      const params = Platform.OS === 'android' 
        ? { skus: [productId] }
        : { 
            sku: productId,
            andDangerouslyFinishTransactionAutomaticallyIOS: false
          };
      
      await requestPurchase(params);
    } catch (error) {
      console.error('功能失败', error);
    }
  };

  // 订阅商品(处理Android的优惠方案)
  handleSubscribe = async (productId, offerToken) => {
    try {
      await requestSubscription({
        sku: productId,
        ...(offerToken && { subscriptionOffers: [{ sku: productId, offerToken }] })
      });
    } catch (error) {
      console.error('订阅失败', error);
    }
  };

  render() {
    return (
      <>
        {/* 一次性商品 */}
        <Pressable onPress={() => this.handlePurchase(product.productId)}>
          <Text>获取商品</Text>
        </Pressable>

        {/* 订阅商品 */}
        {Platform.OS === 'android' ? (
          product.subscriptionOfferDetails?.map(offer => (
            <Pressable 
              key={offer.offerToken}
              onPress={() => this.handleSubscribe(product.productId, offer.offerToken)}
            >
              <Text>订阅方案: {offer.pricingPhases[0].price}</Text>
            </Pressable>
          ))
        ) : (
          <Pressable onPress={() => this.handleSubscribe(product.productId)}>
            <Text>订阅</Text>
          </Pressable>
        )}
      </>
    );
  }
}

关键注意事项

1. 完成交易的重要性

在所有平台都必须调用 finishTransaction

  • Android:非消耗品必须被确认,否则会被自动退款
  • iOS:虽然目前会自动完成,但未来可能会改变
  • 消耗品:完成交易后会从可用功能列表中移除

2. 服务器验证最佳实践

虽然客户端可以完成交易,但强烈建议:

  1. 将收据发送到服务器验证
  2. 服务器使用官方API验证收据真实性
  3. 确认无误后再在客户端完成交易

3. 处理待处理交易

Android上可能有"幽灵"交易(失败的待处理交易),建议:

  1. 应用启动时调用 flushFailedPurchasesCachedAsPendingAndroid
  2. 处理可能出现的异常(如仍有真正待处理的交易)

调试技巧

  1. 测试账户:使用平台提供的测试账户进行功能测试
  2. 沙盒环境:确保在开发时使用沙盒环境
  3. 日志记录:详细记录功能流程各阶段的状态
  4. 错误处理:为各种错误代码准备对应的用户提示

结语

react-native-iap 的事件驱动功能流程设计更符合原生IAP的工作方式,能够更好地处理各种边界情况。通过合理设置监听器、正确处理交易完成和做好错误处理,可以构建出稳定可靠的应用内功能系统。记住,良好的IAP实现不仅能提高收入,还能减少用户投诉和退款。

react-native-iap react-native native module for In App Purchase. react-native-iap 项目地址: https://gitcode.com/gh_mirrors/re/react-native-iap

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

滑思眉Philip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值