以下是一个简单的 iOS 内购购买的逻辑代码封装的示例:

// 内购管理类
@interface IAPManager : NSObject

@property (nonatomic, strong) SKProductsRequest *productsRequest;
@property (nonatomic, strong) NSArray<SKProduct *> *products;

+ (instancetype)sharedManager;

- (void)requestProducts:(NSSet<NSString *> *)productIdentifiers
      completionHandler:(void (^)(BOOL success, NSArray<SKProduct *> *products))completionHandler;

- (void)buyProduct:(SKProduct *)product
 completionHandler:(void (^)(BOOL success, NSError *error))completionHandler;

@end

@implementation IAPManager

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

- (void)requestProducts:(NSSet<NSString *> *)productIdentifiers
      completionHandler:(void (^)(BOOL success, NSArray<SKProduct *> *products))completionHandler {
    self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    self.productsRequest.delegate = self;
    [self.productsRequest start];
    
    self.completionHandler = completionHandler;
}

- (void)buyProduct:(SKProduct *)product
 completionHandler:(void (^)(BOOL success, NSError *error))completionHandler {
    SKPayment *payment = [SKPayment paymentWithProduct:product];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
    
    self.buyCompletionHandler = completionHandler;
}

#pragma mark - SKProductsRequestDelegate

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

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

#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;
            case SKPaymentTransactionStateDeferred:
                // 处理支付延迟
                break;
            default:
                break;
        }
    }
}

- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    // 处理购买成功的逻辑
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    
    if (self.buyCompletionHandler) {
        self.buyCompletionHandler(YES, nil);
    }
}

- (void)failedTransaction:(SKPaymentTransaction *)transaction {
    // 处理购买失败的逻辑
    if (transaction.error.code != SKErrorPaymentCancelled) {
        NSLog('购买失败: %@', transaction.error.localizedDescription);
    }
    
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    
    if (self.buyCompletionHandler) {
        self.buyCompletionHandler(NO, transaction.error);
    }
}

- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
    // 处理恢复购买的逻辑
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    
    if (self.buyCompletionHandler) {
        self.buyCompletionHandler(YES, nil);
    }
}

@end

使用示例:

// 请求商品
NSSet<NSString *> *productIdentifiers = [NSSet setWithObject:'com.example.product'];
[[IAPManager sharedManager] requestProducts:productIdentifiers completionHandler:^(BOOL success, NSArray<SKProduct *> *products) {
    if (success && products.count > 0) {
        SKProduct *product = products.firstObject;
        // 购买商品
        [[IAPManager sharedManager] buyProduct:product completionHandler:^(BOOL success, NSError *error) {
            if (success) {
                // 购买成功
            } else {
                // 购买失败
            }
        }];
    } else {
        // 请求商品失败
    }
}];

以上代码仅作为示例,实际开发中可能需要根据具体需求进行适当的修改和完善。

iOS 内购购买逻辑代码封装 - Objective-C 示例

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

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