昨天使用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