昨天使用ios7SDK build的時候,發現了幾個warning,原來以前寫的內購方法,有些在ios7下棄用了。今天改了下,順便代碼也發上。
PGStoreKitManager.h
// // PGStoreKitManager.h // OCPhysicGame // // Created by LiuYanghui on 14-1-26. // Copyright (c) 2014年 LiuYanghui. All rights reserved. // #import#import #import @class ViewController; @interface PGStoreKitManager : NSObject { UIAlertView *_loadingAlert; BOOL _enableGameCenter; } @property (nonatomic, readwrite, strong) ViewController* viewController; + (PGStoreKitManager *)getInstance; // game center ---------------------------------------- /** 登陸gamecenter,請先設置setViewController */ - (void)authenticateLocalPlayer; /** 上傳積分 */ - (void)reportScore : (NSString*)identifier hiScore:(int64_t)score; /** 上傳成就 */ - (void)reportAchievementIdentifier : (NSString*)identifier percentComplete:(float)percent; /** 顯示排行版 */ - (void)showLeaderboard : (NSString*)leaderboard; /** 顯示成就 */ - (void)showAchievements; // iap ---------------------------------------- /** 初始化內消費 */ - (void)initStoreKit; /** 購買產品 */ - (void)purchaseItem: (NSString*)identifier; @end
PGStoreKitManager.m
// // PGStoreKitManager.m // OCPhysicGame // // Created by LiuYanghui on 14-1-26. // Copyright (c) 2014年 LiuYanghui. All rights reserved. // #import PGStoreKitManager.h #import ViewController.h @implementation PGStoreKitManager + (PGStoreKitManager *)getInstance { static PGStoreKitManager *mgr = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ mgr = [[self alloc] init]; }); return mgr; } - (id)init { self = [super init]; if (self) { [self initData]; return self; } return nil; } - (void)initData { _enableGameCenter = NO; _viewController = nil; } - (void)showMessage:(NSString *)title Message:(NSString *)msg { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@確定 otherButtonTitles:nil, nil]; [alert show]; } - (void)showLoadingView:(NSString *)title { _loadingAlert= [[UIAlertView alloc] initWithTitle:title message:@ delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil]; [_loadingAlert show]; } - (void)removeLoadingView { [_loadingAlert dismissWithClickedButtonIndex:0 animated:YES]; } #pragma mark - GameCenter - (void)authenticateLocalPlayer { GKLocalPlayer* localPlayer = [GKLocalPlayer localPlayer]; if ([localPlayer isAuthenticated] == NO) { localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { if (error) { _enableGameCenter = NO; }else{ _enableGameCenter = YES; if(viewController) { [_viewController presentViewController:viewController animated:YES completion:nil]; } } }; }else{ _enableGameCenter = YES; } } /** 上傳積分 */ - (void)reportScore : (NSString*)identifier hiScore:(int64_t)score; { if (score < 0 || !_enableGameCenter) return; GKScore *scoreBoard = [[GKScore alloc] initWithLeaderboardIdentifier:identifier]; scoreBoard.value = score; [GKScore reportScores:@[scoreBoard] withCompletionHandler:^(NSError *error) { if (error) { // handle error } }]; } /** 上傳成就 */ - (void)reportAchievementIdentifier : (NSString*)identifier percentComplete:(float)percent { if (percent < 0 || !_enableGameCenter) return; GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier: identifier]; if (achievement){ achievement.percentComplete = percent; [GKAchievement reportAchievements:@[achievement] withCompletionHandler:^(NSError *error) { if (error) { // handle error } }]; } } /** 顯示排行版 */ - (void)showLeaderboard : (NSString*)leaderboard { if (!_enableGameCenter) return; GKGameCenterViewController *gameCenterViewController = [[GKGameCenterViewController alloc] init]; gameCenterViewController.viewState = GKGameCenterViewControllerStateLeaderboards; gameCenterViewController.gameCenterDelegate = self; [_viewController presentViewController:gameCenterViewController animated:YES completion:nil]; } /** 顯示成就 */ - (void)showAchievements { if (!_enableGameCenter) return; GKGameCenterViewController *gameCenterViewController = [[GKGameCenterViewController alloc] init]; gameCenterViewController.viewState = GKGameCenterViewControllerStateAchievements; gameCenterViewController.gameCenterDelegate = self; [_viewController presentViewController:gameCenterViewController animated:YES completion:nil]; } #pragma mark gameCenterViewController Close回調 - (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController { [_viewController dismissViewControllerAnimated:YES completion:nil]; } //--------------------------------------------------------- #pragma mark - IAP - (BOOL)canProcessPayments { if ([SKPaymentQueue canMakePayments]) { return YES; } else { return NO; } } /** 初始化內消費 */ - (void)initStoreKit { [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; } /** 購買產品 */ - (void)purchaseItem: (NSString *)identifier { [self showLoadingView:@Access Store...]; if (![self canProcessPayments]) { NSLog(@1.失敗-->SKPaymentQueue canMakePayments NO); [self removeLoadingView]; return; } NSLog(@1.成功-->請求產品信息...%@, identifier); // 使用請求商品信息式購買 SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject: identifier]]; request.delegate = self; [request start]; } // SKProductsRequest 的回調 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { NSArray *myProduct = response.products; if (myProduct.count == 0) { NSLog(@2.失敗-->無法獲取產品信息,購買失敗。invalidProductIdentifiers = %@,response.invalidProductIdentifiers); [self removeLoadingView]; return; } NSLog(@2.成功-->獲取產品信息成功,正在購買...); SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]]; [[SKPaymentQueue defaultQueue] addPayment:payment]; } // SKPayment 的回調 - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { NSLog(@3.成功-->接收蘋果購買數據,正在處理...); 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) completeTransaction: (SKPaymentTransaction*)transaction { NSLog(@4.成功-->結束交易 SKPaymentTransactionStatePurchased); [self removeLoadingView]; // 記錄交易和提供產品 這兩方法必須處理 [self recordTransaction: transaction]; [self provideContent: transaction.payment.productIdentifier]; // 移除 transaction from the payment queue. [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; } // 重置交易 - (void) restoreTransaction: (SKPaymentTransaction*)transaction { NSLog(@4.成功-->重置交易 SKPaymentTransactionStateRestored); [self recordTransaction: transaction]; [self provideContent: transaction.originalTransaction.payment.productIdentifier]; [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; } // 交易失敗 - (void) failedTransaction: (SKPaymentTransaction*)transaction { [self removeLoadingView]; NSLog(@4.成功-->交易失敗 SKPaymentTransactionStateRestored error.code:%d,(int)transaction.error.code); [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; } // 交易記錄 - (void) recordTransaction: (SKPaymentTransaction*)transacation { NSLog(@4.成功-->交易記錄, 可以在此處存儲記錄); } // 提供產品 - (void) provideContent: (NSString*)identifier { NSLog(@4.成功-->交易成功,請提供產品 identifier = %@, identifier); [self removeLoadingView]; [self showMessage:@Success Message:@You have successfully purchased.]; } @end