Himi ?原創, 歡迎轉載,轉載請在明顯處注明! 謝謝。
原文地址:[http://blog.csdn.net/xiaominghimi/article/details/6937097](http://blog.csdn.net/xiaominghimi/article/details/6937097)
//——2012-12-11日更新 ? 獲取"產品付費數量等于0這個問題"的原因
看到很多童鞋問到,為什么每次都返回數量等于0??
其實有童鞋已經找到原因了,原因是你在 ItunesConnect 里的 “[Contracts, Tax, and Banking?](https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/wo/13.0.9.15.3)”沒有完成設置賬戶信息。
確定?ItunesConnect 里 “[Contracts, Tax, and Banking?](https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/wo/13.0.9.15.3)”的狀態,如下圖所示,即可:
[](http://www.himigame.com/wp-content/uploads/2012/02/QQ20131209-2.png)
這里也是由于Himi疏忽的原因沒有說明,這里先給童鞋們帶來的麻煩,致以歉意。
//——2012-6-25日更新iap恢復
看到很多童鞋說讓Himi講解如何恢復iap產品,其實博文已經給出了。這里再詳細說下:
首先向AppStore請求恢復交易:
~~~
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
~~~
然后當用戶輸入正確的appStore賬號密碼后,進入
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易結果
進入上面函數中的
~~~
case SKPaymentTransactionStateRestored://恢復
{
[self restoreTransaction:transaction];
}
break;
~~~
然后我們再以下重寫函數中處理即可!
-(void) restoreTransaction: (SKPaymentTransaction *)transaction
終于在11月公司的游戲即將上線了,那么對于iOS游戲來說當今都是內置道具收費屬于主流,那么我們的游戲也是內置收費,所以Himi這里分享給大家關于內置應用收費以及申請測試賬號進行測試購買的經驗;
在應用內嵌入付費代碼這一快Himi可以直接將代碼分享給大家,所以我們來說一些主要流程,畢竟沒有接觸過這一塊的童鞋肯定相當頭疼 =。 ?=
OK,步入整體,如果你想在iOS里內嵌收費,那么分為以下幾步:
【提示:以下創建App部分內容,你不用非要等項目能打包了才開始做,可以隨時并且隨便的創建個測試項目即可,因為嵌入付費并不要求上傳App的ipa包的!!】
第一步:你需要在iTunesConnect中創建個新的App,然后為這個App設置一些產品(付費道具)等;
OK,這里Himi稍微解釋下,iTunesConnect是蘋果提供的一個平臺,主要提供AP發布和管理App的,最重要的功能是創建管理項目信息,項目付費產品(道具)管理、付費的測試賬號、提交App等等,這里就簡單介紹這么多,關于產品一詞在此我們可以理解成游戲道具即可;在蘋果看來所有付費都屬于產品 =。 =千萬不要糾結字眼哦~
OK,打開iTunesConnect網站:[https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa](https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa)?(注意:企業級的用戶必須使用公司主開發者賬號登陸才可!)
成功登陸后的頁面如下:

這里大概說下重要的一些項:
Contracts, Tax, and Banking???: 管理銀行賬號、聯系人以及稅等等;這里要根據提示完成對應的信息填寫!一定要詳細填寫喔~
Manage Users :管理用戶的,比如主賬號以及測試付費的(測試App)賬號;
Manage Your Applictions:管理應用程序的,你所有發布的應用和每個應用的狀態都在這里面;
下面我們新建一個App項目,大家放心,我們這里創建的是不會直接提交給App審核的,所以放心創建,只要控制好App的狀態不要是待審核狀態即可,不過即使你不小心將項目提交了,也沒事,直接更改App狀態即可了;
選擇Manage Your Applictions選項,然后新建一個項目:【Add New App】,根據提示來填寫吧,這里就不細致說明了~
創建好一個App之后,在點擊Manage Your Applictions后的界面應該如下:

這里你將看到自己創建的App,點擊你創建的App項目,這里Himi創建的項目名字叫”ProjectForBuyTest“,點擊你的App進入如下界面:

(注意:這里的Bundle ID一定要跟你的項目中的info.plist中的Bundle ID保證一致!!!!)
這里可以管理你的項目的信息、狀態、是否嵌入GameCenter等等選項,那么本章我們重點介紹如何使用IAp沙盒測試程序內付費,所以這里我們點擊右上角的”Manage?In-App Purchases“選項進入創建產品(游戲道具)界面如下:

上圖中的下方看到Himi創建過的四個產品(道具)了,你可以點擊”Create New“選項新建一個產品(付費道具),點擊新建如下界面:

上圖中Himi沒有截圖出所有的選項,這里大概介紹下,這個界面是選擇你的消費道具的種類,種類說明如下:
類型選擇有四種選擇:
1.Consumable(消耗品): 每次下載都需要付費;
2.Non-consumable(非消耗品): 僅需付費一次;
3.Auto-Renewable Subscriptions:自動訂閱;
4.Free Subscription:免費訂閱
最下方是你沙盒測試的截圖,暫且不管即可;
這里Himi選擇Consumable選項,比如很多游戲都是購買金幣啦這樣子就可以選擇這個;然后出現如下界面:

Reference Name:?付費產品(道具的)參考名稱
Product ID(產品ID): 你產品的唯一id。通常格式是 com.xx.yy,但它可以是任何形式,不要求以程序的App ID作為前綴。
Add Language: 添加產品名稱與描述語言;
Price Tier:選擇價格,這里你選擇價格后,會出現如上圖最下方的價格對照表
Screenshot(截屏): 展示你產品的截屏。(這個直接無視,測試App務必要管這個的)
Product ID(產品ID)可以創建多個,比如我想游戲中分為0.99$ 、1.99$等道具那就創建對應多個產品ID**!
我們填寫好了”Reference Name“與”Product ID“以及”Price Tier“后,點擊”Add Language“選項然后出現如下界面:

上圖中的選項:
Language:語言
Displayed Name(顯示名稱): 用戶看到的產品名稱。
Description(描述): 對產品進行描述。
Ok,一路 Save保存回到”Manage?In-App Purchases“界面中會看到我們新建的產品(道具)如下:

大家可以看到新建的產品(道具)ID:這里Himi創建的產品ID是com.himi.wahaha ,這里要記住這個產品ID哦~
第二步:申請測試賬號,利用沙盒測試模擬AppStore購買道具流程!
回到itunesconnect主頁中,選擇“Manage Users”然后選擇“Test User”,然后出現的界面如下圖:

這里Himi已經創建了兩個測試賬號了,點擊界面中的 “Add New User”進行創建即可;記住賬號和密碼哈,記不住就刪掉重新建 娃哈哈~(切記:不能用于真正的AppStore中使用此賬號,不僅不能用,而且一旦AppStore發現后果你懂得~)?
第三步:在項目中申請購買產品代碼以及監聽;
這里關于購買的代碼部分呢,我都有備注的,Himi這里就不詳細講解了,Himi只是在代碼后介紹幾點值得注意的地方:
這里Himi是新建的一個Cocos2d的項目,然后給出HelloWorldLayer.h以及HelloWorldLayer.m的全部代碼,所有購買代碼也全在里面也對應有Himi的注釋!
**HelloWorldLayer.h**
~~~
//
// HelloWorldLayer.h
// buytest
//
// Created by 華明 李 on 11-10-29.
// Copyright Himi 2011年. All rights reserved.
//
// When you import this file, you import all the cocos2d classes
#import "cocos2d.h"
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
enum{
IAP0p99=10,
IAP1p99,
IAP4p99,
IAP9p99,
IAP24p99,
}buyCoinsTag;
@interface HelloWorldLayer : CCLayer<SKProductsRequestDelegate,SKPaymentTransactionObserver>
{
int buyType;
}
+(CCScene *) scene;
- (void) requestProUpgradeProductData;
-(void)RequestProductData;
-(bool)CanMakePay;
-(void)buy:(int)type;
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
- (void) completeTransaction: (SKPaymentTransaction *)transaction;
- (void) failedTransaction: (SKPaymentTransaction *)transaction;
-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction;
-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;
- (void) restoreTransaction: (SKPaymentTransaction *)transaction;
-(void)provideContent:(NSString *)product;
-(void)recordTransaction:(NSString *)product;
@end
~~~
**HelloWorldLayer.m**
~~~
//
// IapLayer.m
//
// Created by Himi on 11-5-25.
// Copyright 2011年 李華明 . All rights reserved.
//
#import "HelloWorldLayer.h"
#define ProductID_IAP0p99 @"com.buytest.one"//$0.99
#define ProductID_IAP1p99 @"com.buytest.two" //$1.99
#define ProductID_IAP4p99 @"com.buytest.three" //$4.99
#define ProductID_IAP9p99 @"com.buytest.four" //$19.99
#define ProductID_IAP24p99 @"com.buytest.five" //$24.99
@implementation HelloWorldLayer
+(CCScene *) scene
{
CCScene *scene = [CCScene node];
HelloWorldLayer *layer = [HelloWorldLayer node];
[scene addChild: layer];
return scene;
}
-(id)init
{
if ((self = [super init])) {
CGSize size = [[CCDirector sharedDirector] winSize];
CCSprite *iap_bg = [CCSprite spriteWithFile:@"Icon.png"];
[iap_bg setPosition:ccp(size.width/2,size.height/2)];
[self addChild:iap_bg z:0];
//---------------------
//----監聽購買結果
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
//申請購買
/*
enum{
IAP0p99=10,
IAP1p99,
IAP4p99,
IAP9p99,
IAP24p99,
}buyCoinsTag;
*/
[self buy:IAP24p99];
}
return self;
}
-(void)buy:(int)type
{
buyType = type;
if ([SKPaymentQueue canMakePayments]) {
//[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
[self RequestProductData];
CCLOG(@"允許程序內付費購買");
}
else
{
CCLOG(@"不允許程序內付費購買");
UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"Alert"
message:@"You can‘t purchase in app store(Himi說你沒允許應用程序內購買)"
delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(關閉)",nil) otherButtonTitles:nil];
[alerView show];
[alerView release];
}
}
-(bool)CanMakePay
{
return [SKPaymentQueue canMakePayments];
}
-(void)RequestProductData
{
CCLOG(@"---------請求對應的產品信息------------");
NSArray *product = nil;
switch (buyType) {
case IAP0p99:
product=[[NSArray alloc] initWithObjects:ProductID_IAP0p99,nil];
break;
case IAP1p99:
product=[[NSArray alloc] initWithObjects:ProductID_IAP1p99,nil];
break;
case IAP4p99:
product=[[NSArray alloc] initWithObjects:ProductID_IAP4p99,nil];
break;
case IAP9p99:
product=[[NSArray alloc] initWithObjects:ProductID_IAP9p99,nil];
break;
case IAP24p99:
product=[[NSArray alloc] initWithObjects:ProductID_IAP24p99,nil];
break;
default:
break;
}
NSSet *nsset = [NSSet setWithArray:product];
SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];
request.delegate=self;
[request start];
[product release];
}
//<SKProductsRequestDelegate> 請求協議
//收到的產品信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSLog(@"-----------收到產品反饋信息--------------");
NSArray *myProduct = response.products;
NSLog(@"產品Product ID:%@",response.invalidProductIdentifiers);
NSLog(@"產品付費數量: %d", [myProduct count]);
// populate UI
for(SKProduct *product in myProduct){
NSLog(@"product info");
NSLog(@"SKProduct 描述信息%@", [product description]);
NSLog(@"產品標題 %@" , product.localizedTitle);
NSLog(@"產品描述信息: %@" , product.localizedDescription);
NSLog(@"價格: %@" , product.price);
NSLog(@"Product id: %@" , product.productIdentifier);
}
SKPayment *payment = nil;
switch (buyType) {
case IAP0p99:
payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p99]; //支付$0.99
break;
case IAP1p99:
payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p99]; //支付$1.99
break;
case IAP4p99:
payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p99]; //支付$9.99
break;
case IAP9p99:
payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p99]; //支付$19.99
break;
case IAP24p99:
payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p99]; //支付$29.99
break;
default:
break;
}
CCLOG(@"---------發送購買請求------------");
[[SKPaymentQueue defaultQueue] addPayment:payment];
[request autorelease];
}
- (void)requestProUpgradeProductData
{
CCLOG(@"------請求升級數據---------");
NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"];
SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];
}
//彈出錯誤信息
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
CCLOG(@"-------彈出錯誤信息----------");
UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]
delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];
[alerView show];
[alerView release];
}
-(void) requestDidFinish:(SKRequest *)request
{
NSLog(@"----------反饋信息結束--------------");
}
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{
CCLOG(@"-----PurchasedTransaction----");
NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
[self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
[transactions release];
}
//<SKPaymentTransactionObserver> 千萬不要忘記綁定,代碼如下:
//----監聽購買結果
//[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易結果
{
CCLOG(@"-----paymentQueue--------");
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased://交易完成
[self completeTransaction:transaction];
CCLOG(@"-----交易完成 --------");
CCLOG(@"不允許程序內付費購買");
UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"Alert"
message:@"Himi說你購買成功啦~娃哈哈"
delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(關閉)",nil) otherButtonTitles:nil];
[alerView show];
[alerView release];
break;
case SKPaymentTransactionStateFailed://交易失敗
[self failedTransaction:transaction];
CCLOG(@"-----交易失敗 --------");
UIAlertView *alerView2 = [[UIAlertView alloc] initWithTitle:@"Alert"
message:@"Himi說你購買失敗,請重新嘗試購買~"
delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(關閉)",nil) otherButtonTitles:nil];
[alerView2 show];
[alerView2 release];
break;
case SKPaymentTransactionStateRestored://已經購買過該商品
[self restoreTransaction:transaction];
CCLOG(@"-----已經購買過該商品 --------");
case SKPaymentTransactionStatePurchasing: //商品添加進列表
CCLOG(@"-----商品添加進列表 --------");
break;
default:
break;
}
}
}
- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
CCLOG(@"-----completeTransaction--------");
// Your application should implement these two methods.
NSString *product = transaction.payment.productIdentifier;
if ([product length] > 0) {
NSArray *tt = [product componentsSeparatedByString:@"."];
NSString *bookid = [tt lastObject];
if ([bookid length] > 0) {
[self recordTransaction:bookid];
[self provideContent:bookid];
}
}
// Remove the transaction from the payment queue.
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
//記錄交易
-(void)recordTransaction:(NSString *)product{
CCLOG(@"-----記錄交易--------");
}
//處理下載內容
-(void)provideContent:(NSString *)product{
CCLOG(@"-----下載--------");
}
- (void) failedTransaction: (SKPaymentTransaction *)transaction{
NSLog(@"失敗");
if (transaction.error.code != SKErrorPaymentCancelled)
{
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{
}
- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
NSLog(@" 交易恢復處理");
}
-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error{
CCLOG(@"-------paymentQueue----");
}
#pragma mark connection delegate
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"%@", [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
switch([(NSHTTPURLResponse *)response statusCode]) {
case 200:
case 206:
break;
case 304:
break;
case 400:
break;
case 404:
break;
case 416:
break;
case 403:
break;
case 401:
case 500:
break;
default:
break;
}
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"test");
}
-(void)dealloc
{
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除監聽
[super dealloc];
}
@end
~~~
代碼注釋的相當清楚了,沒有什么可解釋的,這里說幾點值得注意的地方:
1.添加對應對應代碼時不要忘記,添加框架 StoreKit.framework,如何添加框架請看我的博文[【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)](http://blog.csdn.net/xiaominghimi/article/details/6870259 "【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)")!
2.越獄機器無法沙盒測試!模擬器的話,Himi用4.3模擬器不可以,因為提示沒有開啟程序內付費- -(我都沒看到模擬器有store的選項,so~);但是使用iOS5的模擬器可以測試沙盒,但是執行的順序會有些問題,但是還沒真機的童鞋可以使用,建議一切以真機實測為準
3.千萬不要忘記在iTunesConnect中創建App?Bundle ID一定要跟你的項目中的info.plist中的Bundle ID保證一致!!!!
4.以上代碼中你需要修改的就是我在HelloWorldLayer.m類中的宏定義的Product ID(產品ID),例如Himi剛才新建了一個產品ID是“com.himi.wahaha"
然后我運行項目截圖如下以及運行控制臺打印的信息如下:

點擊Buy之后運行截圖以及打印信息:

輸入測試賬號密碼后以及打印信息:


這里Himi最后一張截圖是沒有購買成功,這里Himi是故意截圖出來的,原因就是想告訴童鞋們:
如果你的產品信息能夠正常得到,但是始終無法成功的話,不要著急,因為你的產品要進入iTunes Connect,并且Apple準備好沙箱環境需要一些時間。Himi之前遇到過,然后在過了段時間后我沒有修改任何一行代碼,但產品ID變為有效并能成功購買。=。 =郁悶ing~~ 其實要使產品發布到Apple的網絡系統是需要一段時間的,so~這里別太著急!
越獄機器無法正常測試沙盒的喔~
順便提示一下:Bundle ID 盡可能與開發者證書的app ID 一致。
好了,寫了這么多了,咳咳、Himi繼續忙了,做iOS的童鞋們我想此篇將成為你必須收藏的一篇哦~嘿嘿!
?
- 前言
- 【Iphone 游戲開發】游戲引擎剖析
- [Object-C語言隨筆之一]Mac os 下搭建iOS開發環境
- [Object-C語言隨筆之二] 《NSLog》常用的打印調試語句與自動排版
- [Object-C語言隨筆之三] 類的創建和實例化以及函數的添加和調用!
- [Object-C語言隨筆之四]創建視圖并繪制簡單圖形
- 【iOS-Cocos2d游戲開發之一】搭建cocos2d游戲引擎環境HelloWorld!
- 【iOS-Cocos2d游戲開發之二】Cocos2D 游戲開發資源貼(教程以及源碼)
- 【iOS-Cocos2d游戲開發之三】CCScene切換的所有特效(28種)以及設置屏幕橫豎屏!
- 【iOS-Cocos2d游戲開發之四】獨自收集Cocos2d提供的字體!共57種(有對照的字體圖)
- 【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)【11月28日更新】
- 【iOS-Cocos2d游戲開發之六】對觸屏事件追加講解,解決無法觸發ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】
- 【iOS-Cocos2d游戲開發之八】開啟高清(960*640)模式問題與解答、圖片適配以及設置iphone橫豎屏
- 【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的&quot;.pvr.ccz&quot;,&quot;.plist&quot;共用的終極精靈優化及注意事項!
- 【iOS-Cocos2d游戲開發之十】添加粒子系統特效并解決粒子特效與Layer之間的坐標問題;
- 【iOS-Cocos2d游戲開發之十一】使用Box2d物理系統以及在cocos2d框架添加Box2d物理系統lib包的方法
- 【iOS-Cocos2d游戲開發之十二】淺析使用C++/C/OC進行iOS游戲混編出現“failed with exit”問題與小結;
- 【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!
- 【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)
- 【iOS-Cocos2d游戲開發之十五】詳解CCProgressTimer 進度條并修改cocos2d源碼實現“理想”游戲進度條!
- 【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!
- 【iOS開發必備指南合集】申請企業級IDP、真機調試、游戲接入GameCenter 指南(實現仿官方的成就提示)、游戲接入OpenFeint指南;
- 【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!【2011年12月18日補充】
- 【iOS開發必收藏】詳解iOS應用程序內使用IAP/StoreKit付費、沙盒(SandBox)測試、創建測試賬號流程!【2012-12-11日更新獲取&quot;產品付費數量等于0的問題&quot;】
- 【iOS-cocos2d-X 游戲開發之一】在Mac下結合Xcode搭建Cocos2d-X開發環境!
- 【iOS-cocos2d-X 游戲開發之二】【必看篇】總結闡述Cocos2d-X與Cocos2d-iphone區別;
- 【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3
- 【iOS-Cocos2d游戲開發之二十】精靈的基礎知識點總匯(位圖操作/貼圖更換/重排z軸等)以及利用CCSprite與CCLayerColor制作簡單遮蓋層!
- 【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!
- 【iOS-Cocos2d游戲開發之二十二 】CCSpeed實現CCAnimate動畫進行時設置慢動作以及設置游戲加減速進行(塔防游戲必備)!
- 【iOS-cocos2d-X 游戲開發之三】Mac下配置Android NDK環境并搭建Cocos2d-x環境并Eclipse正常編譯運行Cocos2dX自帶TestsDemo項目!
- 【iOS-cocos2d-X 游戲開發之四】Cocos2dX創建Android NDK新項目并編譯導入Eclipse中正常運行!
- 【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;
- 【iOS-cocos2d-X 游戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault游戲存儲數據編碼!
- 【iOS-cocos2d-X 游戲開發之七】整合Cocos2dX的Android項目到Xcode項目中,Xcode編寫&amp;編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&amp;CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&amp;自定義類細節說明&amp;Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&amp;使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&amp;Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&amp;&amp;Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&amp;設置Android自適應屏幕、縮放比例方法!
- 【Cocoa(mac) Application 開發系列之四】動作編輯器(Cocos2dx)制作流程詳解及附上響應鼠標滾軸事件、反轉坐標系、導入/創建資源目錄等知識點代碼!
- 【Cocos2d-X(2.x) 游戲開發系列之一】cocos2dx(v2.x)與(v1.x)的一些常用函數區別講解!在2.x版CCFileData類被去除等
- 【Cocos2d-X(2.x) 游戲開發系列之二】cocos2dx最新2.0.1版本跨平臺整合NDK+Xcode,Xcode編寫&amp;編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d&#173;2.0&#173;x&#173;2.0.2使用新資源加載策略!不再沿用-hd、-ipad、-ipadhd添加后綴方式
- 【Cocos2d-X(1.x 2.x) 修復篇】iOS6 中 libcurl.a 無法通過armv7s編譯以及iOS6中無法正常游戲橫屏的解決方法
- 【Cocos2d-X(1.x 2.x) 】iOS6與iphone5適相關設置隨筆(解決第三方類庫無法通過armv7s編譯的方法、添加Default-568h@2x.png)