iOS 内购购买代码封装 - Objective-C 实现
以下是一个简单的 iOS 内购购买功能的代码封装示例,使用 Objective-C 编写:
首先,创建一个名为 IAPManager 的类,实现内购功能的封装:
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
@protocol IAPManagerDelegate <NSObject>
// 内购完成回调
- (void)purchaseCompletedWithProductId:(NSString *)productId;
// 内购失败回调
- (void)purchaseFailedWithError:(NSError *)error;
@end
@interface IAPManager : NSObject<SKProductsRequestDelegate, SKPaymentTransactionObserver>
@property (nonatomic, weak) id<IAPManagerDelegate> delegate;
+ (instancetype)sharedManager;
// 发起内购请求
- (void)purchaseProductWithId:(NSString *)productId;
@end
接下来,在 IAPManager.m 文件中实现内购功能的具体逻辑:
#import "IAPManager.h"
@implementation IAPManager
+ (instancetype)sharedManager {
static IAPManager *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[self alloc] init];
});
return sharedManager;
}
- (void)purchaseProductWithId:(NSString *)productId {
if ([SKPaymentQueue canMakePayments]) {
// 开始进行内购
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productId]];
productsRequest.delegate = self;
[productsRequest start];
} else {
// 无法进行内购,提示用户
NSLog('用户禁止应用内付费购买');
}
}
#pragma mark - SKProductsRequestDelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSArray *products = response.products;
if (products.count > 0) {
SKProduct *product = products.firstObject;
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
} else {
NSLog('无法获取产品信息');
}
}
#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 {
// 内购完成,验证购买凭证等操作
// ...
// 通知代理内购完成
if ([self.delegate respondsToSelector:@selector(purchaseCompletedWithProductId:)]) {
[self.delegate purchaseCompletedWithProductId:transaction.payment.productIdentifier];
}
// 结束交易
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
// 内购失败
// ...
// 通知代理内购失败
if ([self.delegate respondsToSelector:@selector(purchaseFailedWithError:)]) {
[self.delegate purchaseFailedWithError:transaction.error];
}
// 结束交易
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
// 恢复购买
// ...
// 结束交易
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
@end
使用时,在需要进行内购的地方调用以下代码:
NSString *productId = 'your_product_id';
IAPManager *iapManager = [IAPManager sharedManager];
iapManager.delegate = self; // 设置代理,用于接收内购完成或失败的回调
[iapManager purchaseProductWithId:productId]; // 发起内购请求
然后,在实现 IAPManagerDelegate 协议的类中,处理内购完成或失败的回调:
#import "YourViewController.h"
#import "IAPManager.h"
@interface YourViewController () <IAPManagerDelegate>
@end
@implementation YourViewController
- (void)viewDidLoad {
[super viewDidLoad];
// ...
IAPManager *iapManager = [IAPManager sharedManager];
iapManager.delegate = self;
}
#pragma mark - IAPManagerDelegate
- (void)purchaseCompletedWithProductId:(NSString *)productId {
// 内购完成
if ([productId isEqualToString:'your_product_id']) {
// 根据 productId 判断具体购买的产品
// 执行购买成功后的操作
}
}
- (void)purchaseFailedWithError:(NSError *)error {
// 内购失败
// 处理错误信息等
}
@end
以上是一个简单的 iOS 内购购买功能的代码封装示例,你可以根据实际需求进行修改和扩展。需要注意的是,内购功能需要在 App Store Connect 上配置相应的产品和内购项目,并且在真机上测试时需要使用真实的 Apple ID 进行内购测试。
原文地址: https://www.cveoy.top/t/topic/qyuy 著作权归作者所有。请勿转载和采集!