手机自己制作表白网站,网站渗透,网页设计图片为980是参考,甘肃多元网络Himi 原创#xff0c; 欢迎转载#xff0c;转载请在明显处注明#xff01; 谢谢。 原文地址#xff1a;http://blog.csdn.net/xiaominghimi/article/details/6937097 终于在11月公司的游戏即将上线了#xff0c;那么对于iOS游戏来说当今都是内置道具收费属于主流#xf… Himi 原创 欢迎转载转载请在明显处注明 谢谢。 原文地址http://blog.csdn.net/xiaominghimi/article/details/6937097 终于在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 (注意企业级的用户必须使用公司主开发者账号登陆才可) 成功登陆后的页面如下 这里大概说下重要的一些项 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 view plain // // 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{ IAP0p9910, IAP1p99, IAP4p99, IAP9p99, IAP24p99, }buyCoinsTag; interface HelloWorldLayer : CCLayerSKProductsRequestDelegate,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 view plain // // 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{ IAP0p9910, 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 storeHimi说你没允许应用程序内购买 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.delegateself; [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 { [super dealloc]; } end 代码注释的相当清楚了没有什么可解释的这里说几点值得注意的地方 1.添加对应对应代码时不要忘记添加框架 StoreKit.framework,如何添加框架请看我的博文【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这里别太着急 好了写了这么多了咳咳、Himi继续忙了做iOS的童鞋们我想此篇将成为你必须收藏的一篇哦嘿嘿 转载于:https://www.cnblogs.com/lexiaoyao-jun/archive/2011/11/12/5208287.html