iOS 内购购买详细代码封装 (Objective-C)
以下是一个基本的 iOS 内购购买的代码封装,使用 Objective-C 语言编写:
首先,创建一个名为 IAPManager 的类,用于处理内购相关逻辑。
IAPManager.h 文件:
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
@protocol IAPManagerDelegate <NSObject>
- (void)purchaseProductSuccess:(NSString *)productIdentifier;
- (void)purchaseProductFailed:(NSError *)error;
@end
@interface IAPManager : NSObject<SKProductsRequestDelegate, SKPaymentTransactionObserver>
@property (nonatomic, weak) id<IAPManagerDelegate> delegate;
+ (instancetype)sharedInstance;
- (void)requestProducts;
- (void)purchaseProduct:(SKProduct *)product;
@end
IAPManager.m 文件:
#import "IAPManager.h"
@implementation IAPManager
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
static IAPManager *instance = nil;
dispatch_once(&onceToken, ^{ instance = [[IAPManager alloc] init]; });
return instance;
}
- (void)requestProducts {
NSSet *productIdentifiers = [NSSet setWithObjects:'com.example.product1', 'com.example.product2', nil]; // 替换为你自己的产品标识符
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSArray *products = response.products;
if (products.count > 0) {
SKProduct *product = [products objectAtIndex:0]; // 取第一个产品
[self purchaseProduct:product];
}
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
[self.delegate purchaseProductFailed:error];
}
- (void)purchaseProduct:(SKProduct *)product {
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)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 {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
[self.delegate purchaseProductSuccess:transaction.payment.productIdentifier];
}
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
if (transaction.error.code != SKErrorPaymentCancelled) {
[self.delegate purchaseProductFailed:transaction.error];
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
@end
在使用内购功能的类中,可以通过以下代码调用 IAPManager:
#import "ViewController.h"
#import "IAPManager.h"
@interface ViewController () <IAPManagerDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 请求产品信息
[[IAPManager sharedInstance] setDelegate:self];
[[IAPManager sharedInstance] requestProducts];
}
- (void)purchaseProductSuccess:(NSString *)productIdentifier {
// 内购购买成功处理逻辑
}
- (void)purchaseProductFailed:(NSError *)error {
// 内购购买失败处理逻辑
}
@end
上述代码中的 'com.example.product1' 和 'com.example.product2' 是示例产品标识符,你需要替换为你自己的产品标识符。同时,你需要在 Xcode 中配置好 App 内购的相关设置,并在代码中添加相应的处理逻辑。
这是一个简单的 iOS 内购购买的代码封装,你可以根据自己的需求进行扩展和修改。
原文地址: https://www.cveoy.top/t/topic/qyue 著作权归作者所有。请勿转载和采集!