内购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.”
更多内容参考:
http://www.cocoachina.com/bbs/read.php?tid=69165&keyword=IAP%3C/p%3E