ios7内购、Game Center 实现 in-App Purchases & Game Center
猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢!
原文地址: http://www.cocos2dev.com/?p=514
昨天使用ios7SDK build的时候,发现了几个warning,原来以前写的内购方法,有些在ios7下弃用了。今天改了下,顺便代码也发上。
PGStoreKitManager.h
//
// PGStoreKitManager.h
// OCPhysicGame
//
// Created by LiuYanghui on 14-1-26.
// Copyright (c) 2014年 LiuYanghui. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <GameKit/GameKit.h>
#import <StoreKit/StoreKit.h>
@class ViewController;
@interface PGStoreKitManager : NSObject<GKGameCenterControllerDelegate, SKPaymentTransactionObserver, SKProductsRequestDelegate>
{
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
注释已经写的很清楚了,再有不清楚的可以留言。
ios7内购、Game Center 实现 in-App Purchases & Game Center的更多相关文章
- 苹果开发——App内购以及验证store的收据(一)
原地址:http://zengwu3915.blog.163.com/blog/static/27834897201375105236580?suggestedreading 发了几天时间在网上折腾了 ...
- iOS内购图文流程(2017)
什么是内购? 只要在iPhone App上购买的不是实物产品(也就是虚拟产品如qq币.虎牙币.电子书......) 都需要走内购流程,苹果这里面抽走三成. 使用内购需要走的流程. 1,填写协议,税 ...
- 萝卜保卫战3内购破解+Toast窗口增加(Love版)
涉及到一些不同的破解的方法,以及不同的破解思路,还有一些重要权限的删除等. 作者:HAI_ 这次目标是经常玩的萝卜保卫战,不知不觉,已经更新到3了.详细分析请参考https://bbs.ichunqi ...
- iOS- 给App添加内购& 验证购买iOS7新特性
1.内购——应用内购买 我所说的内购——也可以说是应用内购买 大家都知道通过苹果应用程序商店有三种主要赚钱的方式: 1.直接收费(与国内大部分用户的消费习惯相悖,如果要收费,直接收高的,别收6块钱) ...
- [IPA]IOS In App Purchase(内购)验证
参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...
- 苹果开发——App内购以及验证store的收据(二)
原地址:http://zengwu3915.blog.163.com/blog/static/2783489720137605156966?suggestedreading 三. 客户端使用Store ...
- iOS APP内购
看到网上文章一大把,看了这个觉得挺不错的,谢谢 iOS大全 公众平台; 原文:http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=2652 ...
- [Xcode 实际操作]九、实用进阶-(29)为App添加IAP(支付方式)内购项目
目录:[Swift]Xcode实际操作 首先请阅读:[Xcode10 实际操作]九.实用进阶-(28)在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP 本文将演示如何给刚刚 ...
- 苹果APP内购客户付款成功,没收到相应虚拟产品的解决办法
一.引导用户走申请苹果的退款 1.告知用户新版本可以使用支付宝.微信支付,更划算 2.苹果可申请90天以内的退款,一般情况申请后48小时内就有反馈. 参考链接 https://jingyan.baid ...
随机推荐
- poj 2960 S-Nim
S-Nim Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4113 Accepted: 2158 Description ...
- 【Miller-Rabin随机判素数算法】
实用性介绍: #include<bits/stdc++.h> #define go(i,a,b) for(int i=a;i<=b;i++) #define T 5 #define ...
- MySQL的常用操作命令详解
系统管理">系统管理 mysql服务">启动MySQL服务 通过windows服务管理器启动MySQL服务 ? 1 开始-->运行-->输入services ...
- C语言程序设计第六次作业——循环结构(2)
C语言程序设计第六次作业--循环结构(2) 之前的博客园图片没处理好,对大家说一声抱歉.希望大家能够多多指出我的错误,我来认真修改 ^ - ^ !. (1)改错题 序列求和:输入一个正实数eps,计算 ...
- JQuery when() done() then()
jQuery.when(deferreds) 参数deferreds,一个或多个延时对象或JS对象,我们初略的认为它就是一个或多个异步请求. 例如:$.when($.ajax("page1. ...
- Flexible DEMO 实现手淘H5页面的终端适配
<!DOCTYPE html> <html> <head> <title>淘宝flexiblejs</title> <meta cha ...
- 利用css3+js实现简单带立体过渡效果的图片切换(chrome浏览器)
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- consul怎么在windows下安装
1.去官网下载:https://www.consul.io/downloads.html 2.解压: 3.设置环境变量:path添加 E:\programfiles\consul: 4.cmd启动: ...
- 使用linux部署tomcat项目
1.下载对应的Tomcat服务器包 Apache Tomcat官网下载: http://tomcat.apache.org/download-70.cgi 比如我们使用的是 apache-tomca ...
- jsp&servlet——session监听
session监听,需要实现HttpSessionAttributeListener接口 attributeAdded:监听添加session attributeRemoved:监听删除session ...