以下是一个简单的 iOS 内购购买功能的代码封装示例,使用 Objective-C 编写:

首先,创建一个名为 IAPManager 的类,实现内购功能的封装:

#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>

@protocol IAPManagerDelegate <NSObject>

// 内购完成回调
- (void)purchaseCompletedWithProductId:(NSString *)productId;
// 内购失败回调
- (void)purchaseFailedWithError:(NSError *)error;

@end

@interface IAPManager : NSObject<SKProductsRequestDelegate, SKPaymentTransactionObserver>

@property (nonatomic, weak) id<IAPManagerDelegate> delegate;

+ (instancetype)sharedManager;

// 发起内购请求
- (void)purchaseProductWithId:(NSString *)productId;

@end

接下来,在 IAPManager.m 文件中实现内购功能的具体逻辑:

#import "IAPManager.h"

@implementation IAPManager

+ (instancetype)sharedManager {
    static IAPManager *sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{ 
        sharedManager = [[self alloc] init];
    });
    return sharedManager;
}

- (void)purchaseProductWithId:(NSString *)productId {
    if ([SKPaymentQueue canMakePayments]) {
        // 开始进行内购
        SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productId]];
        productsRequest.delegate = self;
        [productsRequest start];
    } else {
        // 无法进行内购,提示用户
        NSLog('用户禁止应用内付费购买');
    }
}

#pragma mark - SKProductsRequestDelegate

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSArray *products = response.products;
    if (products.count > 0) {
        SKProduct *product = products.firstObject;
        SKPayment *payment = [SKPayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    } else {
        NSLog('无法获取产品信息');
    }
}

#pragma mark - SKPaymentTransactionObserver

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased:
                // 内购成功
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                // 内购失败
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                // 恢复购买
                [self restoreTransaction:transaction];
                break;
            default:
                break;
        }
    }
}

- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    // 内购完成,验证购买凭证等操作
    // ...
    
    // 通知代理内购完成
    if ([self.delegate respondsToSelector:@selector(purchaseCompletedWithProductId:)]) {
        [self.delegate purchaseCompletedWithProductId:transaction.payment.productIdentifier];
    }
    
    // 结束交易
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void)failedTransaction:(SKPaymentTransaction *)transaction {
    // 内购失败
    // ...
    
    // 通知代理内购失败
    if ([self.delegate respondsToSelector:@selector(purchaseFailedWithError:)]) {
        [self.delegate purchaseFailedWithError:transaction.error];
    }
    
    // 结束交易
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
    // 恢复购买
    // ...
    
    // 结束交易
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

@end

使用时,在需要进行内购的地方调用以下代码:

NSString *productId = 'your_product_id';
IAPManager *iapManager = [IAPManager sharedManager];
iapManager.delegate = self; // 设置代理,用于接收内购完成或失败的回调
[iapManager purchaseProductWithId:productId]; // 发起内购请求

然后,在实现 IAPManagerDelegate 协议的类中,处理内购完成或失败的回调:

#import "YourViewController.h"
#import "IAPManager.h"

@interface YourViewController () <IAPManagerDelegate>

@end

@implementation YourViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // ...
    
    IAPManager *iapManager = [IAPManager sharedManager];
    iapManager.delegate = self;
}

#pragma mark - IAPManagerDelegate

- (void)purchaseCompletedWithProductId:(NSString *)productId {
    // 内购完成
    if ([productId isEqualToString:'your_product_id']) {
        // 根据 productId 判断具体购买的产品
        
        // 执行购买成功后的操作
    }
}

- (void)purchaseFailedWithError:(NSError *)error {
    // 内购失败
    // 处理错误信息等
}

@end

以上是一个简单的 iOS 内购购买功能的代码封装示例,你可以根据实际需求进行修改和扩展。需要注意的是,内购功能需要在 App Store Connect 上配置相应的产品和内购项目,并且在真机上测试时需要使用真实的 Apple ID 进行内购测试。

iOS 内购购买代码封装 - Objective-C 实现

原文地址: https://www.cveoy.top/t/topic/qyuy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录