iOS 内购购买逻辑代码封装 - Objective-C 示例
以下是一个简单的 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 {
// 请求商品失败
}
}];
以上代码仅作为示例,实际开发中可能需要根据具体需求进行适当的修改和完善。
原文地址: https://www.cveoy.top/t/topic/qywt 著作权归作者所有。请勿转载和采集!