以下是一个简单的 iOS 内购购买代码封装的示例,使用 OC 代码实现:

首先,创建一个名为 'IAPManager' 的类来处理内购操作:

#import <StoreKit/StoreKit.h>

@interface IAPManager : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver>

+ (instancetype)sharedManager;

- (void)requestProductWithId:(NSString *)productId;
- (void)buyProduct:(SKProduct *)product;
- (void)restorePurchases;

@end
#import "IAPManager.h"

@interface IAPManager()

@property (nonatomic, strong) SKProductsRequest *productsRequest;
@property (nonatomic, copy) void (^completionHandler)(BOOL success, NSArray<SKProduct *> *products);

@end

@implementation IAPManager

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

- (void)requestProductWithId:(NSString *)productId {
    if ([SKPaymentQueue canMakePayments]) {
        NSSet *productIdentifiers = [NSSet setWithObject:productId];
        self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
        self.productsRequest.delegate = self;
        [self.productsRequest start];
    }
    else {
        NSLog('User is not allowed to make payments.');
    }
}

- (void)buyProduct:(SKProduct *)product {
    SKPayment *payment = [SKPayment paymentWithProduct:product];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

- (void)restorePurchases {
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

#pragma mark - SKProductsRequestDelegate

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    if (self.completionHandler) {
        self.completionHandler(YES, response.products);
        self.completionHandler = nil;
    }
}

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
    if (self.completionHandler) {
        self.completionHandler(NO, nil);
        self.completionHandler = nil;
    }
}

#pragma mark - SKPaymentTransactionObserver

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased:
                // TODO: 处理购买成功逻辑
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                // TODO: 处理购买失败逻辑
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                // TODO: 处理已恢复购买逻辑
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            default:
                break;
        }
    }
}

@end

在你的视图控制器中,你可以使用 'IAPManager' 类来请求产品信息并执行购买操作:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [[SKPaymentQueue defaultQueue] addTransactionObserver:[IAPManager sharedManager]];
}

- (IBAction)requestProductButtonTapped:(id)sender {
    [[IAPManager sharedManager] requestProductWithId:'com.yourproductid'];
    [IAPManager sharedManager].completionHandler = ^(BOOL success, NSArray<SKProduct *> *products) {
        if (success && products.count > 0) {
            // TODO: 显示产品信息
            SKProduct *product = products.firstObject;
            NSLog('Product Title: %@', product.localizedTitle);
            NSLog('Product Price: %@', product.price);
        }
        else {
            NSLog('Failed to fetch product information.');
        }
    };
}

- (IBAction)buyProductButtonTapped:(id)sender {
    // TODO: 从请求的产品中选择一个进行购买
    SKProduct *product = // 从请求的产品列表中选择一个产品
    [[IAPManager sharedManager] buyProduct:product];
}

- (IBAction)restorePurchasesButtonTapped:(id)sender {
    [[IAPManager sharedManager] restorePurchases];
}

在你的项目中,你还需要在 'Info.plist' 文件中添加一个名为 'In-App Purchase' 的条目,并设置为 'YES',以启用内购功能。

注意:上面的代码只是一个简单的示例,你需要根据你的项目需求进行适当的修改和扩展。

iOS 内购购买代码封装 - OC 代码示例

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

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