iOS内购In-App Purchase
内购In-App Purchase
转载自:http://blog.csdn.net/gwh111/article/details/19334259
https://developer.apple.com/in-app-purchase/In-App-Purchase-Guidelines.pdf
允许范围:
电子书或者电子相册
额外游戏关数
地图
电子杂志
数字资料
四种种类:
内容
功能
服务
子部件
五种类别:
可消耗
不可消耗
自动更新
免费订阅?
不可更新
对于内容:设置一个binary,enable it 当用户购买后
https://developer.apple.com/in-app-purchase/
invalid product IDs
1.有没有enabled In-App Purchases for your App ID?
2.有没有设置为Cleared for Sale
3.有没有上传过二进制文件(然后rejected it?
4.你的project's .plist BundleID 是否和你的App ID 一致?
5.有没有安装新的provisioning profile?
6. 使用完整的product ID?
7.等待两个小时以上
8.删除旧的应用,重新安装一遍
9. 有没有越狱? (我就是越狱了-。-) 越狱的机子无法测试内购
测试购买失败?
有没有注销你设备上的app store。必须第一次就注销,否则出现什么情况
提示你已经购买了此程序内购买项目,但尚未下载.
解决办法:1.换一台设备?2.等几天
.h
- #import <UIKit/UIKit.h>
- #import <StoreKit/StoreKit.h>
- #define kInAppPurchaseManagerProductsFetchedNotification @"kInAppPurchaseManagerProductsFetchedNotification"
- #define kInAppPurchaseManagerTransactionFailedNotification @"kInAppPurchaseManagerTransactionFailedNotification"
- #define kInAppPurchaseManagerTransactionSucceededNotification @"kInAppPurchaseManagerTransactionSucceededNotification"
- @interface cgViewController : UIViewController<UITableViewDelegate,UITableViewDataSource,SKProductsRequestDelegate,SKPaymentTransactionObserver>{
- SKProduct *proUpgradeProduct;
- SKProductsRequest *productsRequest;
- }
- - (void)loadStore;
- - (BOOL)canMakePurchases;
- - (void)purchaseProUpgrade;
- @end
.m
- #define kInAppPurchaseProUpgradeProductId @"完整的product id"
- #pragma -
- #pragma Public methods
- //
- // call this method once on startup
- //
- - (void)loadStore
- {
- // restarts any purchases if they were interrupted last time the app was open
- [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
- // get the product description (defined in early sections)
- [self requestProUpgradeProductData];
- }
- //
- // call this before making a purchase
- //
- - (BOOL)canMakePurchases
- {
- NSLog(@"%d",[SKPaymentQueue canMakePayments]);
- return [SKPaymentQueue canMakePayments];
- }
- //
- // kick off the upgrade transaction
- //
- - (void)purchaseProUpgrade
- {
- NSLog(@"ppp");
- SKPayment *payment = [SKPayment paymentWithProductIdentifier:kInAppPurchaseProUpgradeProductId];
- [[SKPaymentQueue defaultQueue] addPayment:payment];
- }
- #pragma -
- #pragma Purchase helpers
- //
- // saves a record of the transaction by storing the receipt to disk
- //
- - (void)recordTransaction:(SKPaymentTransaction *)transaction
- {
- if ([transaction.payment.productIdentifier isEqualToString:kInAppPurchaseProUpgradeProductId])
- {
- // save the transaction receipt to disk
- [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@"proUpgradeTransactionReceipt" ];
- [[NSUserDefaults standardUserDefaults] synchronize];
- }
- }
- //
- // enable pro features
- //
- - (void)provideContent:(NSString *)productId
- {
- if ([productId isEqualToString:kInAppPurchaseProUpgradeProductId])
- {
- // enable the pro features
- [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isProUpgradePurchased" ];
- [[NSUserDefaults standardUserDefaults] synchronize];
- }
- }
- //
- // removes the transaction from the queue and posts a notification with the transaction result
- //
- - (void)finishTransaction:(SKPaymentTransaction *)transaction wasSuccessful:(BOOL)wasSuccessful
- {
- // remove the transaction from the payment queue.
- [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
- NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:transaction, @"transaction" , nil];
- if (wasSuccessful)
- {
- // send out a notification that we’ve finished the transaction
- NSLog(@"succ");
- [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:userInfo];
- }
- else
- {
- // send out a notification for the failed transaction
- NSLog(@"fail");
- [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionFailedNotification object:self userInfo:userInfo];
- }
- }
- //
- // called when the transaction was successful
- //
- - (void)completeTransaction:(SKPaymentTransaction *)transaction
- {
- [self recordTransaction:transaction];
- [self provideContent:transaction.payment.productIdentifier];
- [self finishTransaction:transaction wasSuccessful:YES];
- }
- //
- // called when a transaction has been restored and and successfully completed
- //
- - (void)restoreTransaction:(SKPaymentTransaction *)transaction
- {
- [self recordTransaction:transaction.originalTransaction];
- [self provideContent:transaction.originalTransaction.payment.productIdentifier];
- [self finishTransaction:transaction wasSuccessful:YES];
- }
- //
- // called when a transaction has failed
- //
- - (void)failedTransaction:(SKPaymentTransaction *)transaction
- {
- if (transaction.error.code != SKErrorPaymentCancelled)
- {
- // error!
- [self finishTransaction:transaction wasSuccessful:NO];
- }
- else
- {
- // this is fine, the user just cancelled, so don’t notify
- [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
- }
- }
- #pragma mark -
- #pragma mark SKPaymentTransactionObserver methods
- //
- // called when the transaction status is updated
- //
- - (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:
- [self restoreTransaction:transaction];
- break;
- default:
- break;
- }
- }
- }
- - (void)requestProUpgradeProductData
- {
- NSSet *productIdentifiers = [NSSet setWithObject:@"gwh.syzg.syzgtext" ];
- productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
- productsRequest.delegate = self;
- [productsRequest start];
- // we will release the request object in the delegate callback
- }
- #pragma mark -
- #pragma mark SKProductsRequestDelegate methods
- - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
- {
- NSArray *products = response.products;
- proUpgradeProduct = [products count] == 1 ? [products firstObject] : nil;
- if (proUpgradeProduct)
- {
- NSLog(@"Product title: %@" , proUpgradeProduct.localizedTitle);
- NSLog(@"Product description: %@" , proUpgradeProduct.localizedDescription);
- NSLog(@"Product price: %@" , proUpgradeProduct.price);
- NSLog(@"Product id: %@" , proUpgradeProduct.productIdentifier);
- }
- for (NSString *invalidProductId in response.invalidProductIdentifiers)
- {
- NSLog(@"Invalid product id: %@" , invalidProductId);
- }
- // finally release the reqest we alloc/init’ed in requestProUpgradeProductData
- [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];
- }
demo:http://download.csdn.net/detail/gwh111/6932009
Important: To associate In-App Purchase products with the release of your app, make sure its status is “Prepare for Upload.”
https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnectInAppPurchase_Guide/Chapters/SubmittingInAppPurchases.html#//apple_ref/doc/uid/TP40013727-CH5-SW1
更多内容参考:
http://www.cocoachina.com/bbs/read.php?tid=69165&keyword=IAP%3C/p%3E
http://www.cocoachina.com/gamedev/misc/2012/0409/4129.html
iOS内购In-App Purchase相关推荐
- iOS 内购(In-App Purchase)详解
iOS 内购(In-App Purchase)详解 概述 IAP 全称:In-App Purchase,是指苹果 App Store 的应用内购买,是苹果为 App 内购买虚拟商品或服务提供的一套交易 ...
- iOS内购—— In-App Purchase(消耗型)
iOS应用如果涉及到支付功能,分为两类:第三方支付和苹果内购.那么什么情况下选择使用第三方支付,又在什么情况下选择苹果内购呢?让我们先来简单了解一下: Understanding What You C ...
- iOS 内购项目的App Store推广
iOS 11以后的用户可以在App Store内的下载页面内直接购买应用的内购商品,这项功能苹果称作做Promoting In-App Purchases,如果你的App需要在App Store推广自 ...
- iOS内购-防越狱破解刷单
---------------------------2018.10.16更新--------------------------- 最近我们公司丢单率上涨,尤其是10月份比9月份来说丢单率翻了3倍, ...
- iOS 内购StoreKit 框架介绍
StoreKit 框架介绍 一.StoreKit 能做什么? In-App Purchase 提供和促进内容和服务的应用内购买. Apple Music 检查用户的Apple Music功能并提供订阅 ...
- Unity接入iOS内购
1.内购种类 consumable:可消费的,如游戏中的金币,用完还可以再购买. non-consumable:不可销毁的,一次购买,永久生效.比如去广告,解锁游戏关卡,这种商品只能购买一次. sub ...
- iOS 内付费(in-app purchase)--非消耗品的购买与恢复
iOS内付费的功能对于一个app来说是非常重要的,如果在这一环节出了一些致命的问题,那就很可能会影响app的推广和公司的利益了. 我在很早之前写过一篇关于iOS内付费的文章(文章地址),在那篇博客中讲 ...
- ios内购二次验证安全性问题_iOS 内购遇到的坑
一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 您以购买过此APP内购项目,此项目将免费恢复.PNG 原因: 当使用内 ...
- iOS内购:自动续期订阅总结
前言:内购类型有四种:消耗型商品,非消耗型商品,非续期订阅,自动续期订阅. 顾名思义,从中最有难度的就是自动续期订阅的实现,开通自动续期订阅后,订阅会员的处理将会遇到如下问题:自动订阅的到期继续自动订 ...
- iOS内购二:购买和恢复
iOS内购二:购买和恢复 购买 构建一个SKPayment对象,传递SKProduct.SKPayment被创建后,就会将其加入到SKPaymentQueue队列中 然后用户会授权,payment是异 ...
最新文章
- nginx 反向代理 apache 服务
- Linux(DeepInOS) 下 mysql 的安装与基本配置
- 激活层是每一层都有吗_89小户型复式这样装,每一层都设计得很棒,完工后秒变小区样板间,邻居前来取经...
- ABP入门系列(5)——展现层实现增删改查
- 最全元素水平垂直居中方法
- mysql服务突然丢失解决方案
- np.argmin和argmax
- 使用SDL2中SDL_CreateWindow()函数时报错跳进wincore.cpp(wntdll.pbd not load)
- ovnif摄像头修改ip
- 如何搭建个人博客网站
- css html5布局方式_创建新HTML5 / CSS3单页布局–艺术主题
- ‘primordial is not defined‘ node 报错解决方法 终极篇!!
- 计算机科技手抄报内容,科技手抄报内容-科技在我身边
- 数据禾|全国10米DEM数字高程数据
- 硕士毕业论文写不出来导致严重焦虑,怎么办?
- xls和 xlsx的区别 xlsx Excel文件怎么转换成 xls文件
- TensorRT下FP32转INT8的过程
- 【python学习】数据预处理-如何归一化?
- SecureCRT8.1破解版下载及修改显示行数
- 神经网络与深度学习笔记汇总一
热门文章
- C++排序——Bookshelf B
- 2018-2019-2 网络对抗技术 20165230 Exp4 恶意代码分析
- 服务器如何ghost系统安装,如何在Ubuntu Server 14.04 LTS上安装Ghost
- ibm tivoli_了解Tivoli Federated Identity Manager信息服务6.2
- ERA5 积雪 降雪 区别_“雪走霾来” 河南降雪今夜停止 19-24日将迎雾霾天
- 《我学区块链》—— 八、用区块链投票
- html5的交互式微课,交互式微课这样制作更轻松
- 项目数据表中的并发控制机制之version
- 在OpenCV里实现扑克牌识别1
- 利用JBOSS漏洞抓肉鸡