iOS-iOS内购流程(手把手图文教程)
来源:互联网 发布:好听的翻唱知乎 编辑:程序博客网 时间:2024/06/05 14:29
前言
一直觉得苹果生态圈很安全,iOS操作系统也很流畅,而且软件有严格的审核机制,软件来源唯一(当然是你不越狱),但是这也为苹果的霸权铺路;上家公司做了一个APP,可以充值虚拟金币,但是如果是虚拟道具,就必须使用苹果内购,不然审核过不了,而且很黑,三七分;当然,你如果购买真是东西,比如淘宝、京东等等就不需要了!这里我就来说说苹果内购流程,附上图文教程,希望大家喜欢!
一、提交资料
1.填写协议
2.请求合同
3.填写地址
4.阅读并同意协议
5.填写联系方式
6.添加地址
7.选择设置地址
8.继续填写第二个
9.绑定银行卡和选择添加
10.选择国家
11.添加国际银行标识
注意:查询银行标识的方法的地址如下。
https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp
12.银行卡信息
13.填写最后一项
14.内容比较多
15.一堆条约
16.继续填写
17.核对信息
18.继续
19.澳大利亚的不要管了
20.加拿大的也不用管了
21.填写完成
二、创建内购项目
1.添加内购项目
2.选择内购类型
3.根据自己APP的需求选择类型
4.继续
5.商品列表
6.选择APP商品
三、添加内购测试账号
1.选择用户职能
2.添加测试人员
四、工程代码
1.先导入StoreKit.framework库;
2.创建AppPayManager管理类,遵循协议<SKPaymentTransactionObserver,SKProductsRequestDelegate>
3.创建单利和支付方法
#import <Foundation/Foundation.h>#import <StoreKit/StoreKit.h>@interface AppPayManager : NSObject//个人信息单例+ (AppPayManager *)manager;- (void)buyProductsWithId:(NSString *)productsId andQuantity:(NSInteger)quantity;@end
4.程序启动添加SKPay观察者,同事像我们的服务器请求商品列表
//1. 程序启动添加SKPay观察者,同时像后端请求产品列表信息- (void)launch { [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; [self requestProductList];}- (void)requestProductList{ NSLog(@"requestProductList");}
5.程序结束移除观察者
- (void)terminate { [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];}
6.根据商品ID进行购买
- (void)buyProductsWithId:(NSString *)productsId andQuantity:(NSInteger)quantity { self.productsId = productsId; self.quantity = quantity; if ([SKPaymentQueue canMakePayments]) { //允许程序内付费购买 [self RequestProductData:@[self.productsId]]; } else { //您的手机没有打开程序内付费购买 UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"您的手机没有打开程序内付费购买" message:nil delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:nil]; [alerView show]; }}
7.根据商品ID数组,SKProductsRequest请求购买- (void)RequestProductData:(NSArray *)productsIdArr { //请求对应的产品信息 NSSet *nsset = [NSSet setWithArray:productsIdArr]; SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset]; request.delegate = self; [request start];}
8.SKProductsRequestDelegate 会接收到请求响应,在此回调中,发送购买请求
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { //收到产品反馈信息 NSArray *myProduct = response.products; NSLog(@"产品Product ID:%@", response.invalidProductIdentifiers); NSLog(@"产品付费数量: %d", (int) [myProduct count]); // populate UI for (SKProduct *product in myProduct) { // NSLog(@"product info"); // NSLog(@" 基本描述: %@", [product description]); // NSLog(@" IAP的id: %@", product.productIdentifier); // NSLog(@" 地区编码: %@", product.priceLocale.localeIdentifier); // NSLog(@" 本地价格: %@", product.price); // NSLog(@" 语言代码: %@", [product.priceLocale objectForKey:NSLocaleLanguageCode]); // NSLog(@" 国家代码: %@", [product.priceLocale objectForKey:NSLocaleCountryCode]); // NSLog(@" 货币代码: %@", [product.priceLocale objectForKey:NSLocaleCurrencyCode]); // NSLog(@" 货币符号: %@", [product.priceLocale objectForKey:NSLocaleCurgegrencySymbol]); // NSLog(@" 本地标题: %@", product.localizedTitle); // NSLog(@" 本地描述: %@", product.localizedDescription); [self updateProductPriceWithId:product.productIdentifier andPrice:product.price]; if ([[product.priceLocale objectForKey:NSLocaleCurrencyCode] isEqualToString:@"CNY"]) { self.currencyCode = @"¥"; } else { self.currencyCode = [product.priceLocale objectForKey:NSLocaleCurrencySymbol]; } } //发送购买请求 for (SKProduct *prct in myProduct) { if ([self.productsId isEqualToString:prct.productIdentifier]) { SKMutablePayment *payment = nil; payment = [SKMutablePayment paymentWithProduct:prct]; payment.quantity = self.quantity; [[SKPaymentQueue defaultQueue] addPayment:payment]; } }}- (void)updateProductPriceWithId:(NSString *)productIdentifier andPrice:(NSDecimalNumber *)price{ NSLog(@"productIdentifier == %@",productIdentifier); NSLog(@"price == %@",price);}
9.SKPaymentTransactionObserver 此协议会监听到购买结果,根据购买结果的不同,做出不同的逻辑#pragma mark - SKPaymentTransactionObserver//----监听购买结果- (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]; UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"交易失败" message:nil delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:nil]; [alerView show]; } break; case SKPaymentTransactionStateRestored: { //已经购买过该商品 [self restoreTransaction:transaction]; UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"已经购买过该商品" message:nil delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:nil]; [alerView show]; } break; case SKPaymentTransactionStatePurchasing: { //商品添加进列表 NSLog(@"商品添加进列表"); } break; case SKPaymentTransactionStateDeferred: { NSLog(@"SKPayment Transaction State Deferred"); } break; default: break; } }}- (void)failedTransaction: (SKPaymentTransaction *)transaction{ NSLog(@"失败"); if (transaction.error.code != SKErrorPaymentCancelled) { } [[SKPaymentQueue defaultQueue] finishTransaction: transaction];}- (void)restoreTransaction:(SKPaymentTransaction *)transaction{ NSLog(@"交易恢复处理");}
9.购买成功后,将信息上传自己的服务器- (void)completeTransaction:(SKPaymentTransaction *)transaction{ NSLog(@"-----completeTransaction--------"); NSString *product = transaction.payment.productIdentifier; if ([product length] > 0) { NSArray *tt = [product componentsSeparatedByString:@"."]; NSString *bookid = [tt lastObject]; if ([bookid length] > 0) { [self recordTransaction:bookid]; [self provideContent:bookid];} }}
//记录交易- (void)recordTransaction:(NSString *)product{ NSLog(@"记录交易--product == %@",product);}//处理下载内容- (void)provideContent:(NSString *)product{ NSLog(@"处理下载内容--product == %@",product);}
希望对你有所帮助!
0 0
- iOS-iOS内购流程(手把手图文教程)
- iOS开发内购全套图文教程
- iOS开发内购全套图文教程
- iOS - 最新苹果内购图文教程
- iOS开发内购全套图文教程
- iOS开发内购全套图文教程
- iOS开发内购全套图文教程
- iOS开发内购全套图文教程
- iOS的开发内购全套图文教程
- iOS App 上架流程图文教程
- ios 内购流程
- iOS 内购( IAP)处理流程
- IOS内购流程(图片)
- iOS 内购流程整理
- iOS开发 内购流程
- 史上最完整的iOS证书说明和发布内购流程图文详解
- iOS-APP国际化(快速手把手教程)
- iOS苹果内购流程(Apple Pay)
- Spring注解@Component、@Repository、@Service、@Controller区别
- 一维数组、二维数组、字符数组的&、sizeof等操作
- maven环境变量的配置及+eclipse的配置使用
- 解决CTS测试项testIsUserAMonkey
- 在iOS 8中使用UIAlertController
- iOS-iOS内购流程(手把手图文教程)
- 什么是抽象类
- 2 find命令之xargs
- poj3233Matrix Power Series (等比矩阵求和)
- 459. Repeated Substring Pattern
- Android 使用DialogFragment创建对话框
- Hive总结(零)Hive的基础知识
- 深入理解java虚拟机阅读后精华摘要
- 内网、外网IP地址