苹果内购那些事

在内购项目中的那些奇葩事

一、 首先就是在自己的开发者账号中设置的一些乱七八糟的东西,在我们公司这些东西都是运营的哥哥姐姐们搞得,不过在其它的博客中也有详细的说明,我也不再多说。

注意:在开始撸代码的时候银行卡的一些税务信息必须是通过苹果审核通过的,否则是无法撸代码进行测试的。

二、 接下来就是搞代码的时候了:

1、 #import <StoreKit/StoreKit.h>导入文件
2、 <SKPaymentTransactionObserver,SKProductsRequestDelegate,SKRequestDelegate>这些代理协议是必须遵守的
3、 在你的充值控制器里面自定义自己的方法
/**
 请求产品信息
 @param product prodect
 */
-(void)requestProductData:(NSString *)product;
/**
是否允许购买
 @param buy buy
 */
- (void)allowedBuy:(NSString *)buy;
/**
交易结果
 @param queue queue
 @param transactions ransactions
 * /
- (void)paymentQueue:(SKPaymentQueue *)queue         updatedTransactions:(NSArray *)transactions;
/**
 购买交易
 @param transaction transaction
 */
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
/**
 交易完成
 @param transaction transaction
 */
- (void) completeTransaction: (SKPaymentTransaction *)transaction;
/**
 交易失败
@param transaction transaction
 */
- (void) failedTransaction: (SKPaymentTransaction *)transaction;
去实现这些方法
1.、在ViewDidLoad里面添加苹果的监听
//添加苹果支付监听
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
2、 在dealloc里面接触这个监听
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除监听
3、 #pragma mark -- /*苹果支付*/
/**
 是否允许购买
 @param buy buy
 */
- (void)allowedBuy:(NSString *)buy {
    if ([SKPaymentQueue canMakePayments]) {
        NSLog(@"允许程序内购买此商品");
        [self requestProductData:buy];    
    }else {
        NSLog(@"不允许程序内购买此商品");
    }
}
/**
 请求产品信息
 @param product prodect
 */
-(void)requestProductData:(NSString *)product {
    NSArray *productArray = @[product];
    NSSet *productSet = [NSSet setWithArray:productArray];//集合
    //开始请求
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productSet];
    request.delegate = self;
    [request start];
}
/**
 收到产品的反馈信息
 @param request request
 @param response response
 */
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSArray *myProduct = response.products;
    SKProduct *p = nil;
    for (SKProduct *product in myProduct) {    
    p = product;
    }
    SKPayment *payment = [SKPayment paymentWithProduct:p];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}
/**
 请求失败
 @param request request
 @param error error
 */
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
    [self.loading stop];
    UIAlertController *alertController = [[UIAlertController alloc] init];
    UIAlertAction *errorAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Alert", NULL) style:UIAlertActionStyleCancel handler:nil];
    [alertController addAction:errorAction];
    [self presentViewController:alertController animated:YES completion:nil];
}
/**
 结束反馈
 @param request request
 */
- (void)requestDidFinish:(SKRequest *)request {
    NSLog(@"-----反馈结束-----");
}
/**
 交易结果
 @param queue queue
 @param transactions ransactions
 */
- (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: {    
            }
                break;
            case SKPaymentTransactionStatePurchasing:      //商品添加进列表
                break;
            default:
                break;
        }
    }
}
/**
 购买交易
 @param transaction transaction
 */
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction {
    NSLog(@"-----购买交易----");
    NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
    [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
}
/**
 交易完成
 @param transaction transaction
 */
- (void) completeTransaction: (SKPaymentTransaction *)transaction { 
    NSURL *recepitURL = [[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:recepitURL];
    NSDictionary *requestContents = @{
                                  @"receipt": [receipt base64EncodedStringWithOptions:0]
                                  };
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
/*中间在这个地方做二次验证,可以去服务器验证也可以在客户端完成验证,建议在服务器验证(但是时间稍微慢一点) 根据个人需求吧 */
}
/**
 交易失败
 @param transaction transaction
 */
- (void) failedTransaction: (SKPaymentTransaction *)transaction     {    
    [self.loading stop];
    if (transaction.error.code != SKErrorPaymentCancelled)
{    
    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

特别注意:
1、 在提交审核的时候App内购项目的产品名称建议统一化,包括在购买界面的显示问题。否则被苹果打回的可能性非常高❗️
2、 记得在内购的地方上传内购的照片,有的app上传的是购买列表的照片,有的app是上传的购买成功的照片。
3、 具体是哪一张后续继续更新❗️
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:http://blog.csdn.net/xiaominghimi/article/details/69...
    LuxDark阅读 6,012评论 2 4
  • 做了很多电商的项目了,都在用各大第三方支付,作为一名iOS开发,苹果已经在强制推行内购了,所以,你不得不了解一下啦...
    Xcode_6阅读 1,227评论 0 0
  • 2017、10、31 深圳 晴 前两天进了一个学习如何发声,如果发出好听的声音群,群里面有老师讲解怎...
    梅子日记阅读 224评论 3 5
  • 本文翻译自Matt Galloway的博客 之前的文章(译)窥探Blocks(1)我们已经了解了block的内部原...
    foolishBoy阅读 1,151评论 0 2
  • 痰湿体质最常见的外在表现是“肥胖”,而湿热体质的就是痘痘。我们有时也可以遇到一些四五十岁的人也还在长痘,这究竟是为...
    胡钧阅读 675评论 0 0