iOS 内购购买代码封装 - OC 代码示例
以下是一个简单的 iOS 内购购买代码封装的示例,使用 OC 代码实现:
首先,创建一个名为 'IAPManager' 的类来处理内购操作:
#import <StoreKit/StoreKit.h>
@interface IAPManager : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver>
+ (instancetype)sharedManager;
- (void)requestProductWithId:(NSString *)productId;
- (void)buyProduct:(SKProduct *)product;
- (void)restorePurchases;
@end
#import "IAPManager.h"
@interface IAPManager()
@property (nonatomic, strong) SKProductsRequest *productsRequest;
@property (nonatomic, copy) void (^completionHandler)(BOOL success, NSArray<SKProduct *> *products);
@end
@implementation IAPManager
+ (instancetype)sharedManager {
static IAPManager *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[self alloc] init];
});
return sharedManager;
}
- (void)requestProductWithId:(NSString *)productId {
if ([SKPaymentQueue canMakePayments]) {
NSSet *productIdentifiers = [NSSet setWithObject:productId];
self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
self.productsRequest.delegate = self;
[self.productsRequest start];
}
else {
NSLog('User is not allowed to make payments.');
}
}
- (void)buyProduct:(SKProduct *)product {
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (void)restorePurchases {
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
#pragma mark - SKProductsRequestDelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
if (self.completionHandler) {
self.completionHandler(YES, response.products);
self.completionHandler = nil;
}
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
if (self.completionHandler) {
self.completionHandler(NO, nil);
self.completionHandler = nil;
}
}
#pragma mark - SKPaymentTransactionObserver
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased:
// TODO: 处理购买成功逻辑
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
// TODO: 处理购买失败逻辑
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
// TODO: 处理已恢复购买逻辑
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
default:
break;
}
}
}
@end
在你的视图控制器中,你可以使用 'IAPManager' 类来请求产品信息并执行购买操作:
- (void)viewDidLoad {
[super viewDidLoad];
[[SKPaymentQueue defaultQueue] addTransactionObserver:[IAPManager sharedManager]];
}
- (IBAction)requestProductButtonTapped:(id)sender {
[[IAPManager sharedManager] requestProductWithId:'com.yourproductid'];
[IAPManager sharedManager].completionHandler = ^(BOOL success, NSArray<SKProduct *> *products) {
if (success && products.count > 0) {
// TODO: 显示产品信息
SKProduct *product = products.firstObject;
NSLog('Product Title: %@', product.localizedTitle);
NSLog('Product Price: %@', product.price);
}
else {
NSLog('Failed to fetch product information.');
}
};
}
- (IBAction)buyProductButtonTapped:(id)sender {
// TODO: 从请求的产品中选择一个进行购买
SKProduct *product = // 从请求的产品列表中选择一个产品
[[IAPManager sharedManager] buyProduct:product];
}
- (IBAction)restorePurchasesButtonTapped:(id)sender {
[[IAPManager sharedManager] restorePurchases];
}
在你的项目中,你还需要在 'Info.plist' 文件中添加一个名为 'In-App Purchase' 的条目,并设置为 'YES',以启用内购功能。
注意:上面的代码只是一个简单的示例,你需要根据你的项目需求进行适当的修改和扩展。
原文地址: https://www.cveoy.top/t/topic/qyuG 著作权归作者所有。请勿转载和采集!