iOS 内购单例封装详细代码示例 (OC)
以下是一个 iOS 开发中封装内购的单例类的详细代码示例:
// InAppPurchaseManager.h
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
typedef void(^PurchaseCompletionHandler)(BOOL success, NSString *message);
@interface InAppPurchaseManager : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver>
@property (nonatomic, copy) PurchaseCompletionHandler completionHandler;
+ (instancetype)sharedManager;
- (void)purchaseProductWithIdentifier:(NSString *)productIdentifier completionHandler:(PurchaseCompletionHandler)completionHandler;
@end
// InAppPurchaseManager.m
#import "InAppPurchaseManager.h"
@implementation InAppPurchaseManager {
SKProductsRequest *_productsRequest;
NSArray<SKProduct *> *_products;
}
+ (instancetype)sharedManager {
static InAppPurchaseManager *_sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedManager = [[self alloc] init];
});
return _sharedManager;
}
- (instancetype)init {
self = [super init];
if (self) {
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
return self;
}
- (void)dealloc {
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
- (void)purchaseProductWithIdentifier:(NSString *)productIdentifier completionHandler:(PurchaseCompletionHandler)completionHandler {
self.completionHandler = completionHandler;
if ([SKPaymentQueue canMakePayments]) {
NSSet *productIdentifiers = [NSSet setWithObject:productIdentifier];
_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
_productsRequest.delegate = self;
[_productsRequest start];
} else {
completionHandler(NO, 'In-App Purchase is disabled on this device.');
}
}
#pragma mark - SKProductsRequestDelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
_products = response.products;
if (_products.count > 0) {
SKProduct *product = _products.firstObject;
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
} else {
self.completionHandler(NO, 'Product not found.');
}
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
self.completionHandler(NO, error.localizedDescription);
}
#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 {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
self.completionHandler(YES, 'Purchase successful.');
}
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
if (transaction.error.code != SKErrorPaymentCancelled) {
self.completionHandler(NO, transaction.error.localizedDescription);
} else {
self.completionHandler(NO, 'Purchase cancelled.');
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
self.completionHandler(YES, 'Purchase restored.');
}
@end
使用示例:
[[InAppPurchaseManager sharedManager] purchaseProductWithIdentifier:'com.example.product' completionHandler:^(BOOL success, NSString *message) {
if (success) {
NSLog('Purchase successful: %@', message);
} else {
NSLog('Purchase failed: %@', message);
}
}];
在使用时,需要先导入 StoreKit.framework,并添加相应的支付产品标识符。
原文地址: https://www.cveoy.top/t/topic/EjK 著作权归作者所有。请勿转载和采集!