以下是一个 iOS 开发中封装内购的单例类的详细代码示例:

// InAppPurchaseManager.h

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

typedef void(^PurchaseCompletionHandler)(BOOL success, NSString *message);

@interface InAppPurchaseManager : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver>

@property (nonatomic, copy) PurchaseCompletionHandler completionHandler;

+ (instancetype)sharedManager;

- (void)purchaseProductWithIdentifier:(NSString *)productIdentifier completionHandler:(PurchaseCompletionHandler)completionHandler;

@end

// InAppPurchaseManager.m

#import "InAppPurchaseManager.h"

@implementation InAppPurchaseManager {
    SKProductsRequest *_productsRequest;
    NSArray<SKProduct *> *_products;
}

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

- (instancetype)init {
    self = [super init];
    if (self) {
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    }
    return self;
}

- (void)dealloc {
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

- (void)purchaseProductWithIdentifier:(NSString *)productIdentifier completionHandler:(PurchaseCompletionHandler)completionHandler {
    self.completionHandler = completionHandler;
    
    if ([SKPaymentQueue canMakePayments]) {
        NSSet *productIdentifiers = [NSSet setWithObject:productIdentifier];
        _productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
        _productsRequest.delegate = self;
        [_productsRequest start];
    } else {
        completionHandler(NO, 'In-App Purchase is disabled on this device.');
    }
}

#pragma mark - SKProductsRequestDelegate

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    _products = response.products;
    
    if (_products.count > 0) {
        SKProduct *product = _products.firstObject;
        SKPayment *payment = [SKPayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    } else {
        self.completionHandler(NO, 'Product not found.');
    }
}

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

#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 {
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    self.completionHandler(YES, 'Purchase successful.');
}

- (void)failedTransaction:(SKPaymentTransaction *)transaction {
    if (transaction.error.code != SKErrorPaymentCancelled) {
        self.completionHandler(NO, transaction.error.localizedDescription);
    } else {
        self.completionHandler(NO, 'Purchase cancelled.');
    }
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    self.completionHandler(YES, 'Purchase restored.');
}

@end

使用示例:

[[InAppPurchaseManager sharedManager] purchaseProductWithIdentifier:'com.example.product' completionHandler:^(BOOL success, NSString *message) {
    if (success) {
        NSLog('Purchase successful: %@', message);
    } else {
        NSLog('Purchase failed: %@', message);
    }
}];

在使用时,需要先导入 StoreKit.framework,并添加相应的支付产品标识符。

iOS 内购单例封装详细代码示例 (OC)

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

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