提交
This commit is contained in:
37
QXLive/Manager/QXIAPManager.h
Normal file
37
QXLive/Manager/QXIAPManager.h
Normal file
@@ -0,0 +1,37 @@
|
||||
//
|
||||
// QXIAPManager.h
|
||||
// QXLive
|
||||
//
|
||||
// Created by 启星 on 2025/12/24.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface QXIAPManager : NSObject
|
||||
|
||||
|
||||
typedef void(^SubscriptionSuccessCompletionHandler)(void);//订阅成功的回调
|
||||
typedef void(^SubscriptionFailurreCompletionHandler)(void);//订阅失败的回调
|
||||
typedef void(^RestoreSuccessCompletionHandler)(void);//恢复成功的回调
|
||||
typedef void(^RestoreFailurreCompletionHandler)(void);//恢复失败的回调
|
||||
|
||||
// 添加回调属性
|
||||
@property (nonatomic, copy) SubscriptionSuccessCompletionHandler subscriptionSuccessCompletionHandler;
|
||||
@property (nonatomic, copy) SubscriptionFailurreCompletionHandler subscriptionFailurreCompletionHandler;
|
||||
@property (nonatomic, copy) RestoreSuccessCompletionHandler restoreSuccessCompletionHandler;
|
||||
@property (nonatomic, copy) RestoreFailurreCompletionHandler restoreFailurreCompletionHandler;
|
||||
|
||||
+ (instancetype)sharedInstance;
|
||||
|
||||
-(void)butGoodsWithId:(NSString*)productId;
|
||||
- (void)getReceiptState:(void (^)(BOOL success))completion;
|
||||
//恢复内购
|
||||
- (void)resumeInAppPurchase;
|
||||
//
|
||||
- (Boolean)getWhetherSubscrid;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
286
QXLive/Manager/QXIAPManager.m
Normal file
286
QXLive/Manager/QXIAPManager.m
Normal file
@@ -0,0 +1,286 @@
|
||||
//
|
||||
// QXIAPManager.m
|
||||
// QXLive
|
||||
//
|
||||
// Created by 启星 on 2025/12/24.
|
||||
//
|
||||
|
||||
|
||||
#import "QXIAPManager.h"
|
||||
#import <StoreKit/StoreKit.h>
|
||||
#import <AppTrackingTransparency/AppTrackingTransparency.h>
|
||||
#import <AdSupport/AdSupport.h>
|
||||
#import <AFNetworking/AFNetworking.h>
|
||||
|
||||
|
||||
@interface QXIAPManager()<SKPaymentTransactionObserver,SKProductsRequestDelegate,SKRequestDelegate>
|
||||
|
||||
@end
|
||||
|
||||
@implementation QXIAPManager
|
||||
|
||||
+ (instancetype)sharedInstance{
|
||||
static dispatch_once_t pred;
|
||||
static QXIAPManager *manager = nil;
|
||||
dispatch_once(&pred, ^{
|
||||
manager = [[self alloc] init];
|
||||
});
|
||||
return manager;
|
||||
}
|
||||
|
||||
/*
|
||||
购买
|
||||
*/
|
||||
-(void)butGoodsWithId:(NSString*)productId{
|
||||
//productId要跟服务端的关键字对应
|
||||
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
|
||||
|
||||
if ([SKPaymentQueue canMakePayments]) { //用户允许app内购
|
||||
if (productId.length) {
|
||||
NSLog(@"%@商品正在请求中...",productId);
|
||||
NSArray *product = [[NSArray alloc] initWithObjects:productId, nil];
|
||||
NSSet *set = [NSSet setWithArray:product];
|
||||
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
|
||||
productsRequest.delegate = self;
|
||||
[productsRequest start];
|
||||
}
|
||||
} else { //没有权限
|
||||
NSLog(@"没有购买权限");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
恢复购买
|
||||
*/
|
||||
- (void)resumeInAppPurchase {
|
||||
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
|
||||
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
|
||||
}
|
||||
|
||||
#pragma mark SKProductsRequestDelegate 查询成功后的回调
|
||||
- (void)productsRequest:(nonnull SKProductsRequest *)request didReceiveResponse:(nonnull SKProductsResponse *)response {
|
||||
NSArray *product = response.products;
|
||||
if (response.invalidProductIdentifiers.count) {
|
||||
NSLog(@"商品请求错误,error:%@", response.invalidProductIdentifiers);
|
||||
if (self.subscriptionFailurreCompletionHandler) {
|
||||
self.subscriptionFailurreCompletionHandler();
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
SKPayment *payment = [SKPayment paymentWithProduct:product[0]];
|
||||
[[SKPaymentQueue defaultQueue] addPayment:payment];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)paymentQueue:(nonnull SKPaymentQueue *)queue updatedTransactions:(nonnull NSArray<SKPaymentTransaction *> *)transactions {
|
||||
// NSInteger i = 0;
|
||||
for (SKPaymentTransaction *tran in transactions) {
|
||||
// if(i != transactions.count - 1){
|
||||
// i++;
|
||||
// continue;
|
||||
// }
|
||||
switch (tran.transactionState) {
|
||||
case SKPaymentTransactionStatePurchasing://正在交易
|
||||
break;
|
||||
|
||||
case SKPaymentTransactionStatePurchased://交易完成
|
||||
{
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
|
||||
|
||||
if (tran.originalTransaction) {
|
||||
// 如果是自动续费的订单,originalTransaction会有内容
|
||||
if (tran.originalTransaction.transactionIdentifier) {
|
||||
[self saveOrderId:tran.originalTransaction.transactionIdentifier];
|
||||
}
|
||||
} else {
|
||||
// 第一次购买自动订阅
|
||||
if (tran.transactionIdentifier) {
|
||||
[self saveOrderId:tran.transactionIdentifier];
|
||||
}
|
||||
}
|
||||
[self vertifyReceipt:^(BOOL success) {
|
||||
if(success){
|
||||
self.subscriptionSuccessCompletionHandler();
|
||||
}else{
|
||||
self.subscriptionFailurreCompletionHandler();
|
||||
}
|
||||
}]; //获取交易成功后的购买凭证
|
||||
NSLog(@"交易完成,正在校验凭证....");
|
||||
}
|
||||
break;
|
||||
|
||||
case SKPaymentTransactionStateFailed://交易失败
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
|
||||
|
||||
self.subscriptionFailurreCompletionHandler();
|
||||
|
||||
break;
|
||||
|
||||
case SKPaymentTransactionStateRestored://已经购买过该商品
|
||||
NSLog(@"已经购买过该商品");
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
|
||||
|
||||
if (tran.originalTransaction) {
|
||||
if (tran.originalTransaction.transactionIdentifier) {
|
||||
[self saveOrderId:tran.originalTransaction.transactionIdentifier];
|
||||
}
|
||||
} else {
|
||||
if (tran.transactionIdentifier) {
|
||||
[self saveOrderId:tran.transactionIdentifier];
|
||||
}
|
||||
}
|
||||
self.subscriptionFailurreCompletionHandler();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 恢复购买成功后的回调
|
||||
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
|
||||
if (queue.transactions.count > 0) {
|
||||
for (SKPaymentTransaction *tran in queue.transactions) {
|
||||
NSString *originalTransactionID = tran.originalTransaction.transactionIdentifier;
|
||||
if (originalTransactionID) {
|
||||
[self saveOrderId:originalTransactionID];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
[self getReceiptState:^(BOOL success) {
|
||||
if(success){
|
||||
self.restoreSuccessCompletionHandler();
|
||||
}else{
|
||||
self.restoreFailurreCompletionHandler();
|
||||
}
|
||||
}];
|
||||
|
||||
} else {
|
||||
self.restoreFailurreCompletionHandler();
|
||||
}
|
||||
}
|
||||
|
||||
// 恢复购买失败后的回调
|
||||
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {
|
||||
self.restoreFailurreCompletionHandler();
|
||||
}
|
||||
|
||||
/*
|
||||
保存订单编号到本地
|
||||
*/
|
||||
- (void)saveOrderId:(NSString*)orderId{
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
[defaults setObject:orderId forKey:@"orderId"];
|
||||
[defaults synchronize];
|
||||
}
|
||||
|
||||
- (Boolean)getWhetherSubscrid{
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
NSString *orderId = [defaults objectForKey:@"orderId"];
|
||||
return orderId != nil;
|
||||
}
|
||||
|
||||
/*
|
||||
获取订单凭证
|
||||
*/
|
||||
- (NSString *)getReceipt {
|
||||
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
|
||||
|
||||
if ([[NSFileManager defaultManager] fileExistsAtPath:[receiptURL path]]){
|
||||
NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
|
||||
NSString *encodeReceiptStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
|
||||
return encodeReceiptStr;
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
校验订单
|
||||
*/
|
||||
- (void)vertifyReceipt:(void (^)(BOOL success))completion {
|
||||
NSLog(@"~~~正在检验。。。");
|
||||
NSString *receipt = [self getReceipt];
|
||||
NSString *password = @"秘钥";
|
||||
|
||||
NSString *urlString = [NSString stringWithFormat:@"https://校验地址"];
|
||||
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
|
||||
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
|
||||
|
||||
NSDictionary *parameters = @{
|
||||
@"apple_receipt": receipt,
|
||||
@"password": password
|
||||
};
|
||||
|
||||
[manager POST:urlString parameters:parameters headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
|
||||
// 请求成功,处理返回的数据
|
||||
NSLog(@"弹窗提示用户请求成功");
|
||||
if (responseObject) {
|
||||
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
|
||||
if ([string isEqualToString:@"success"] || [string isEqualToString:@"订单已存在"]) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
completion(YES);
|
||||
});
|
||||
}else if ([string isEqualToString:@"failure"] || [string isEqualToString:@"fail"]){
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
completion(NO);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
|
||||
// 请求失败,处理错误信息
|
||||
NSLog(@"请求失败:%@", error.localizedDescription);
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
completion(NO);
|
||||
});
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)getReceiptState:(void (^)(BOOL success))completion {
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
NSString *order_id = [defaults objectForKey:@"orderId"];
|
||||
if(!order_id){
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
completion(NO);
|
||||
});
|
||||
return;
|
||||
}
|
||||
NSString *urlString = [NSString stringWithFormat:@"https://订单状态地址"];
|
||||
NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier];
|
||||
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
|
||||
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
|
||||
|
||||
NSDictionary *parameters = @{
|
||||
@"bundle_id": bundleID,
|
||||
@"order_id": order_id
|
||||
};
|
||||
|
||||
[manager GET:urlString parameters:parameters headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
|
||||
NSLog(@"订单状态获取");
|
||||
if (responseObject) {
|
||||
NSError *error = nil;
|
||||
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:&error];
|
||||
if([dictionary[@"status"] boolValue]){
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
completion(YES);
|
||||
});
|
||||
}else{
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
completion(NO);
|
||||
});
|
||||
}
|
||||
}
|
||||
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
|
||||
// 请求失败,处理错误信息
|
||||
NSLog(@"请求失败:%@", error.localizedDescription);
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
completion(NO);
|
||||
});
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -146,10 +146,11 @@
|
||||
/// 收到礼物
|
||||
QXRoomChatListModel *model = [QXRoomChatListModel yy_modelWithJSON:msg.Text];
|
||||
model.messageType = QXRoomChatMessageTypeGift;
|
||||
NSArray *arr = [model.GiftInfo.play_image componentsSeparatedByString:@","];
|
||||
[[QXGiftPlayerManager shareManager] displayFullEffectViewWithMorePlayImages:arr];
|
||||
if ([model.GiftInfo.play_image isExist]) {
|
||||
NSArray *arr = [model.GiftInfo.play_image componentsSeparatedByString:@","];
|
||||
[[QXGiftPlayerManager shareManager] displayFullEffectViewWithMorePlayImages:arr];
|
||||
}
|
||||
[[QXGiftDisplayManager sharedManager] receiveGift:model];
|
||||
|
||||
if (model.ToUserInfos.count>0) {
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(didRecieveGiftWithWithUserInfos:)]) {
|
||||
[self.delegate didRecieveGiftWithWithUserInfos:model.ToUserInfos];
|
||||
|
||||
Reference in New Issue
Block a user