iOS 内购购买详细逻辑代码封装 (OC)
以下是一个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中配置好您的内购产品。
原文地址: https://www.cveoy.top/t/topic/qywv 著作权归作者所有。请勿转载和采集!