内购——应用内购买

通过苹果应用程序商店有三种主要赚钱的方式:

直接收费(与国内大部分用户的消费习惯相悖)

广告

O2O -> Online推广 & Offline交易,闭环

不要砍功能,增加内容,而不是增加功能

内购:应用程序本身的增值产品,游戏装备,应用程序中增值功能同样可以内购

第三方支付:跟应用程序无关的

内购:三(苹果)七(开发商)开

 

提示:

要做好游戏 & 应用,一定要研究心理,要研究哲学

人人都是产品经理

 

内购的五种产品类别

非消耗品(Nonconsumable)一旦购买,终身拥有

指的是在游戏中一次性购买并拥有永久访问权的物品或服务。非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上共享

消耗品(Consumable),买了就用,用了就没

消耗品购买不可被再次下载,根据其特点,消耗品不能在用户的设备之间跨设备使用,除非自定义服务在用户的账号之间共享这些信息

 

以下三种类别在iBooks中使用,目前iBooks不支持大陆市场

ISBN:每本书的一个ID

免费订阅(Free subscriptions)

自动续费订阅(Auto-renewing subscriptions)

非自动续费订阅(Nonrenewing subscriptions)

内购流程

添加StoreKit框架

要使用内购,需要导入StoreKit框架

内购的常用方法

请求有效的产品代号集合

购买指定产品

验证购买(在购买完成之后,验证)

恢复购买(针对非消耗品)

请求有效产品集合

// 1) 实例化产品请求

SKProductsRequest *request = [[SKProductsRequest alloc]initWithProductIdentifiers:identifiers];

// 2) 设置代理

[request setDelegate:self];

 

// 3) 启动请求

[request start];

 

提示:

1. 实例化请求时,必须指定有效的identifiers集合,之所以如此处理,主要是为了确保提交的内购商品真的通过了苹果的审批,处于可用状态!

2. 要想获取到准确的可用产品集合,需要通过代理方法实现

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

3. 越狱用户无法测试内购,但是可以购买

购买产品

1. 内购的交易过程是通过SKPaymentTransactionObserver监控的,因此需要为IAPHelper添加交易观察者:

 

// 添加交易观察者对象

[[SKPaymentQueue defaultQueue]addTransactionObserver:sharedInstance];

 

2. 由于发起交易需要使用SKProduct对象,因此需要使用字典记录所有可用的商品

 

NSMutableDictionary         *_productsDict;

交易队列回调方法

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

{

    for (SKPaymentTransaction *transaction in transactions) {

        // 购买完成

            if (transaction.transactionState == SKPaymentTransactionStatePurchased) {

            NSLog(@"购买完成 %@", transaction.payment.productIdentifier);

 

            [queue finishTransaction:transaction];

        } else if (transaction.transactionState == SKPaymentTransactionStateFailed) {

            if (transaction.error.code != SKErrorPaymentCancelled) {

                NSLog(@"交易失败: %@", transaction.error.localizedDescription);

            }

        }

    }

}

恢复购买

[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];

验证购买

#if DEBUG

    #define ITMS_VERIFY_RECEIPT_URL             @"https://sandbox.itunes.apple.com/verifyReceipt"

#else

    #define ITMS_VERIFY_RECEIPT_URL             @"https://buy.itunes.apple.com/verifyReceipt"

#endif

验证购买iOS7(部分)

// 1. 从Bundle中获取到购买凭据

NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL];

NSData *receiptData = [NSData dataWithContentsOfURL:receiptUrl];

// 2. 对交易凭据进行Base64编码

NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

// 3. 将凭据发送给苹果的服务器验证购买

NSURL *url = [NSURL URLWithString:ITMS_SANDBOX_VERIFY_RECEIPT_URL];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];

request.HTTPMethod = @"POST";

 

NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];

NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];

 

request.HTTPBody = payloadData;

验证购买iOS6(1)

// 1. 使用base64加密交易凭据

NSString *encodeStr = [transction.transactionReceipt base64EncodedString];

 

// 2. 建立验证请求

// 1) URL

NSURL *url = [NSURL URLWithString:ITMS_SANDBOX_VERIFY_RECEIPT_URL];

// 2) 建立请求

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0f];

 

// 1> 请求数据体

NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];

NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];

// 2> 设置数据体

[request setHTTPBody:payloadData];

[request setHTTPMethod:@"POST"];

验证购买iOS6(2)

// 3. 发送同步请求

NSURLResponse *response = nil;

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

 

// 4. 使用JSON解析返回数据

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

[jsonDict writeToFile:@"/users/liufan9/Desktop/123.plist" atomically:YES];

 

if ([jsonDict[@"status"]integerValue] == 0) {

    NSLog(@"验证通过");

}

购买数据记录问题——系统偏好

[[NSUserDefaults standardUserDefaults]setBool:isPurchased forKey:productId];

[[NSUserDefaults standardUserDefaults]synchronize];

广告简介

 

在苹果的广告市场上有两套系统

-展现,程序只要嵌入广告即可

-发布

 

广告的展现

-广告的展现内容,是由苹果根据应用程序的关键字,分类,上架地区等综合评定后自动推送的

-应用程序无需关心

广告

广告收益三七开

添加 iAd.framework 框架

添加 ADBannerView 视图,并设置代理方法

广告条加载完成之前最好隐藏

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {

    self.bannerBottomConstraint.constant = 20.0;    

    [UIView animateWithDuration:0.5 animations:^{

        [self.view layoutIfNeeded];

    }];    

    NSLog(@"加载广告成功");

}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {

    NSLog(@"加载广告失败 %@", error);

}

 

 

 

转载于:https://my.oschina.net/itcastBlogs/blog/693047

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值