以下是一个iOS开发中内购购买详细逻辑代码的封装示例,使用OC语言实现。

首先,创建一个名为IAPManager的类,用于处理内购相关的逻辑。

IAPManager.h文件:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

typedef void(^IAPCompletionHandle)(NSString *productId, NSError *error);

@interface IAPManager : NSObject

+ (instancetype)sharedInstance;

- (void)startIAPWithProductId:(NSString *)productId
              completionHandle:(IAPCompletionHandle)completionHandle;

@end

NS_ASSUME_NONNULL_END

IAPManager.m文件:

#import 'IAPManager.h'
#import <StoreKit/StoreKit.h>

@interface IAPManager() <SKPaymentTransactionObserver, SKProductsRequestDelegate>

@property (nonatomic, copy) IAPCompletionHandle completionHandle;

@end

@implementation IAPManager

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

- (void)startIAPWithProductId:(NSString *)productId
              completionHandle:(IAPCompletionHandle)completionHandle {
    self.completionHandle = completionHandle;
    
    if ([SKPaymentQueue canMakePayments]) {
        [self requestProductData:productId];
    } else {
        NSError *error = [NSError errorWithDomain:@'com.example.iap' code:-1 userInfo:@{NSLocalizedDescriptionKey: '用户禁止应用内购买'}];
        completionHandle(productId, error);
    }  
}

- (void)requestProductData:(NSString *)productId {
    NSSet *productIdSet = [NSSet setWithObject:productId];
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdSet];
    request.delegate = self;
    [request start];
}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSArray *productArray = response.products;
    if (productArray.count == 0) {
        NSError *error = [NSError errorWithDomain:@'com.example.iap' code:-1 userInfo:@{NSLocalizedDescriptionKey: '无法获取产品信息'}];
        self.completionHandle(response.invalidProductIdentifiers.firstObject, error);
    } else {
        SKProduct *product = productArray.firstObject;
        SKPayment *payment = [SKPayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}

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

- (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 {
    NSString *productId = transaction.payment.productIdentifier;
    self.completionHandle(productId, nil);
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void)failedTransaction:(SKPaymentTransaction *)transaction {
    if (transaction.error.code != SKErrorPaymentCancelled) {
        self.completionHandle(transaction.payment.productIdentifier, transaction.error);
    }
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
    NSString *productId = transaction.originalTransaction.payment.productIdentifier;
    self.completionHandle(productId, nil);
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

@end

使用示例:

[[IAPManager sharedInstance] startIAPWithProductId: 'com.example.product1' completionHandle:^(NSString *productId, NSError *error) {
    if (error) {
        NSLog('购买失败,错误信息:% ', error.localizedDescription);
    } else {
        NSLog('购买成功,产品ID:% ', productId);
        // 进行相应的处理,比如解锁功能、发放虚拟货币等
    }
}];

以上是一个简单的iOS内购购买逻辑封装示例,可以根据实际需求进行修改和扩展。

需要注意的是:

  • 以上代码仅供参考,实际项目中需要根据具体的需求进行调整和完善。
  • 在进行内购开发时,需要严格遵守苹果的内购相关规定。
  • 确保您的代码能够处理各种可能的错误情况,例如网络错误、用户取消支付等。
  • 在使用内购功能之前,请务必在App Store Connect中配置好您的内购产品。
iOS 内购购买详细逻辑代码封装 (OC)

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

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