详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程

Himi  原创, 欢迎转载,转载请在明显处注明! 谢谢。

原文地址:http://blog.csdn.net/xiaominghimi/article/details/6937097

//——2012-12-11日更新   获取"产品付费数量等于0这个问题"的原因

看到很多童鞋问到,为什么每次都返回数量等于0??

其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成设置账户信息。

确定 ItunesConnect 里 “Contracts, Tax, and Banking”的状态,如下图所示,即可:

 

这里也是由于Himi疏忽的原因没有说明,这里先给童鞋们带来的麻烦,致以歉意。

//——2012-6-25日更新iap恢复

看到很多童鞋说让Himi讲解如何恢复iap产品,其实博文已经给出了。这里再详细说下:

首先向AppStore请求恢复交易:


1

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

然后当用户输入正确的appStore账号密码后,进入

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易结果

进入上面函数中的


1

2

3

4

5

6

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 (注意:企业级的用户必须使用公司主开发者账号登陆才可!)

成功登陆后的页面如下:

这里大概说下重要的一些项:

 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.m

  1. #import "HelloWorldLayer.h"
  2. #define ProductID_IAP0p99 @"com.buytest.one"//$0.99
  3. #define ProductID_IAP1p99 @"com.buytest.two" //$1.99
  4. #define ProductID_IAP4p99 @"com.buytest.three" //$4.99
  5. #define ProductID_IAP9p99 @"com.buytest.four" //$19.99
  6. #define ProductID_IAP24p99 @"com.buytest.five" //$24.99
  7. @implementation HelloWorldLayer
  8. +(CCScene *) scene
  9. {
  10. CCScene *scene = [CCScene node];
  11. HelloWorldLayer *layer = [HelloWorldLayer node];
  12. [scene addChild: layer];
  13. return scene;
  14. }
  15. -(id)init
  16. {
  17. if ((self = [super init])) {
  18. CGSize size = [[CCDirector sharedDirector] winSize];
  19. CCSprite *iap_bg  = [CCSprite spriteWithFile:@"Icon.png"];
  20. [iap_bg setPosition:ccp(size.width/2,size.height/2)];
  21. [self addChild:iap_bg z:0];
  22. [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
  23. [self buy:IAP24p99];
  24. }
  25. return self;
  26. }
  27. -(void)buy:(int)type
  28. {
  29. buyType = type;
  30. if ([SKPaymentQueue canMakePayments]) {
  31. [self RequestProductData];
  32. CCLOG(@"允许程序内付费购买");
  33. }
  34. else
  35. {
  36. CCLOG(@"不允许程序内付费购买");
  37. UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"Alert"
  38. message:@"You can‘t purchase in app store(Himi说你没允许应用程序内购买)"
  39. delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(关闭)",nil) otherButtonTitles:nil];
  40. [alerView show];
  41. [alerView release];
  42. }
  43. }
  44. -(bool)CanMakePay
  45. {
  46. return [SKPaymentQueue canMakePayments];
  47. }
  48. -(void)RequestProductData
  49. {
  50. CCLOG(@"---------请求对应的产品信息------------");
  51. NSArray *product = nil;
  52. switch (buyType) {
  53. case IAP0p99:
  54. product=[[NSArray alloc] initWithObjects:ProductID_IAP0p99,nil];
  55. break;
  56. case IAP1p99:
  57. product=[[NSArray alloc] initWithObjects:ProductID_IAP1p99,nil];
  58. break;
  59. case IAP4p99:
  60. product=[[NSArray alloc] initWithObjects:ProductID_IAP4p99,nil];
  61. break;
  62. case IAP9p99:
  63. product=[[NSArray alloc] initWithObjects:ProductID_IAP9p99,nil];
  64. break;
  65. case IAP24p99:
  66. product=[[NSArray alloc] initWithObjects:ProductID_IAP24p99,nil];
  67. break;
  68. default:
  69. break;
  70. }
  71. NSSet *nsset = [NSSet setWithArray:product];
  72. SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];
  73. request.delegate=self;
  74. [request start];
  75. [product release];
  76. }
  77. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
  78. NSLog(@"-----------收到产品反馈信息--------------");
  79. NSArray *myProduct = response.products;
  80. NSLog(@"产品Product ID:%@",response.invalidProductIdentifiers);
  81. NSLog(@"产品付费数量: %d", [myProduct count]);
  82. for(SKProduct *product in myProduct){
  83. NSLog(@"product info");
  84. NSLog(@"SKProduct 描述信息%@", [product description]);
  85. NSLog(@"产品标题 %@" , product.localizedTitle);
  86. NSLog(@"产品描述信息: %@" , product.localizedDescription);
  87. NSLog(@"价格: %@" , product.price);
  88. NSLog(@"Product id: %@" , product.productIdentifier);
  89. }
  90. SKPayment *payment = nil;
  91. switch (buyType) {
  92. case IAP0p99:
  93. payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p99];
  94. break;
  95. case IAP1p99:
  96. payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p99];
  97. break;
  98. case IAP4p99:
  99. payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p99];
  100. break;
  101. case IAP9p99:
  102. payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p99];
  103. break;
  104. case IAP24p99:
  105. payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p99];
  106. break;
  107. default:
  108. break;
  109. }
  110. CCLOG(@"---------发送购买请求------------");
  111. [[SKPaymentQueue defaultQueue] addPayment:payment];
  112. [request autorelease];
  113. }
  114. - (void)requestProUpgradeProductData
  115. {
  116. CCLOG(@"------请求升级数据---------");
  117. NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"];
  118. SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
  119. productsRequest.delegate = self;
  120. [productsRequest start];
  121. }
  122. - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
  123. CCLOG(@"-------弹出错误信息----------");
  124. UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]
  125. delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];
  126. [alerView show];
  127. [alerView release];
  128. }
  129. -(void) requestDidFinish:(SKRequest *)request
  130. {
  131. NSLog(@"----------反馈信息结束--------------");
  132. }
  133. -(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{
  134. CCLOG(@"-----PurchasedTransaction----");
  135. NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
  136. [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
  137. [transactions release];
  138. }
  139. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
  140. {
  141. CCLOG(@"-----paymentQueue--------");
  142. for (SKPaymentTransaction *transaction in transactions)
  143. {
  144. switch (transaction.transactionState)
  145. {
  146. case SKPaymentTransactionStatePurchased:
  147. [self completeTransaction:transaction];
  148. CCLOG(@"-----交易完成 --------");
  149. CCLOG(@"不允许程序内付费购买");
  150. UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"Alert"
  151. message:@"Himi说你购买成功啦~娃哈哈"
  152. delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(关闭)",nil) otherButtonTitles:nil];
  153. [alerView show];
  154. [alerView release];
  155. break;
  156. case SKPaymentTransactionStateFailed:
  157. [self failedTransaction:transaction];
  158. CCLOG(@"-----交易失败 --------");
  159. UIAlertView *alerView2 =  [[UIAlertView alloc] initWithTitle:@"Alert"
  160. message:@"Himi说你购买失败,请重新尝试购买~"
  161. delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(关闭)",nil) otherButtonTitles:nil];
  162. [alerView2 show];
  163. [alerView2 release];
  164. break;
  165. case SKPaymentTransactionStateRestored:
  166. [self restoreTransaction:transaction];
  167. CCLOG(@"-----已经购买过该商品 --------");
  168. case SKPaymentTransactionStatePurchasing:
  169. CCLOG(@"-----商品添加进列表 --------");
  170. break;
  171. default:
  172. break;
  173. }
  174. }
  175. }
  176. - (void) completeTransaction: (SKPaymentTransaction *)transaction
  177. {
  178. CCLOG(@"-----completeTransaction--------");
  179. NSString *product = transaction.payment.productIdentifier;
  180. if ([product length] > 0) {
  181. NSArray *tt = [product componentsSeparatedByString:@"."];
  182. NSString *bookid = [tt lastObject];
  183. if ([bookid length] > 0) {
  184. [self recordTransaction:bookid];
  185. [self provideContent:bookid];
  186. }
  187. }
  188. [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
  189. }
  190. -(void)recordTransaction:(NSString *)product{
  191. CCLOG(@"-----记录交易--------");
  192. }
  193. -(void)provideContent:(NSString *)product{
  194. CCLOG(@"-----下载--------");
  195. }
  196. - (void) failedTransaction: (SKPaymentTransaction *)transaction{
  197. NSLog(@"失败");
  198. if (transaction.error.code != SKErrorPaymentCancelled)
  199. {
  200. }
  201. [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
  202. }
  203. -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{
  204. }
  205. - (void) restoreTransaction: (SKPaymentTransaction *)transaction
  206. {
  207. NSLog(@" 交易恢复处理");
  208. }
  209. -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error{
  210. CCLOG(@"-------paymentQueue----");
  211. }
  212. #pragma mark connection delegate
  213. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  214. {
  215. NSLog(@"%@",  [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);
  216. }
  217. - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
  218. }
  219. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
  220. switch([(NSHTTPURLResponse *)response statusCode]) {
  221. case 200:
  222. case 206:
  223. break;
  224. case 304:
  225. break;
  226. case 400:
  227. break;
  228. case 404:
  229. break;
  230. case 416:
  231. break;
  232. case 403:
  233. break;
  234. case 401:
  235. case 500:
  236. break;
  237. default:
  238. break;
  239. }
  240. }
  241. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
  242. NSLog(@"test");
  243. }
  244. -(void)dealloc
  245. {
  246. [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
  247. [super dealloc];
  248. }
  249. @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~这里别太着急!

           越狱机器无法正常测试沙盒的喔~

顺便提示一下:Bundle ID 尽可能与开发者证书的app ID 一致。

好了,写了这么多了,咳咳、Himi继续忙了,做iOS的童鞋们我想此篇将成为你必须收藏的一篇哦~嘿嘿!

时间: 2024-10-09 22:39:33

详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程的相关文章

【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】

转的别人的 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成设置账户信息. 确定 ItunesConnect 里 “Contracts, Tax, and Banking”的状态,如下图所示,即可: 这里也是由于Himi疏忽的原因没有说明,这里先给童鞋们带来的麻烦,致以歉意. //——2012-6-25日更新iap恢复 看到很多童鞋说让Himi讲解如何恢复i

<转>iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!

原文地址:http://blog.csdn.net/xiaominghimi/article/details/6937097 //——2012-12-11日更新   获取"产品付费数量等于0这个问题"的原因 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成设置账户信息. 确定 ItunesConnect 里 “Contracts, Tax, and

详解 IOS 7.1 程序启动原理

程序都是从Main方法入口的 IOS 也不例外 int main(int argc,char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 在IOS 里main 方法里有个UIApplicationMain里面带有4个参数 param 1: argc : 对应argv的参数数量 param 2: argv: 

iOS教程:详解iOS多图下载的缓存机制

ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cell里显示一张图片,而且这些图片都需要从网上下载. 2. 容易遇到的问题 如果不知道或不使用异步操作和缓存机制,那么写出来的代码很可能会是这样: cell.textLabel.text = app.name; cell.detailTextLabel.text = app.download;NSDat

[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) ——通过知识共享树立个人品牌.   继上七篇:            [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)            [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之

详解iOS开发之自定义View

iOS开发之自定义View是本文要将介绍的内容,iOS SDK中的View是UIView,我们可以很方便的自定义一个View.创建一个 Window-based Application程序,在其中添加一个Hypnosister的类,这个类选择继承UIObject.修改这个类,使他继承:UIView @interface HypnosisView : UIView 自定义View的关键是定义drawRect: 方法,因为主要是通过重载这个方法,来改变view的外观.例如,可以使用下面代码绘制一个很

详解IOS开发应用之并发Dispatch Queues (2011)

详解IOS开发应用之并发Dispatch Queues是本文哟啊介绍的内容,我们几乎可以调度队列去完成所有用线程来完成的任务.调度队列相对于线程代码更简单,易于使用,更高效.下面讲主要简述调度队列,在应用中如何使用调度队列去执行任务. 1.关于调度队列 所有的调度队列都是先进先出队列,因此,队列中的任务的开始的顺序和添加到队列中的顺序相同.GCD自动的为我们提供了一些调度队列,我们也可以创建新的用于具体的目的. 下面列出几种可用的调度队列类型以及如何使用. (1)serial queues(串行

转----详解IOS开发应用之并发Dispatch Queues

详解IOS开发应用之并发Dispatch Queues是本文要介绍的内容,我们几乎可以调度队列去完成所有用线程来完成的任务.调度队列相对于线程代码更简单,易于使用,更高效.下面讲主要简述调度队列,在应用中如何使用调度队列去执行任务. 1.关于调度队列 所有的调度队列都是先进先出队列,因此,队列中的任务的开始的顺序和添加到队列中的顺序相同.GCD自动的为我们提供了一些调度队列,我们也可以创建新的用于具体的目的. 下面列出几种可用的调度队列类型以及如何使用. (1)serial queues(串行队

无处不在,详解iOS集成第三方登录(SSO授权登录<无需密码>)

1.前言 不多说,第三登录无处不在!必备技能,今天以新浪微博为例. 这是上次写的iOS第三方社交分享:http://www.cnblogs.com/qingche/p/3727559.html 可以和今天的一起集成使用. 2.集成前的准备工作 2.1.去ShareSDK(现为Mob)注册帐号,下载SDK,然后添加自己的应用后得到AppKey 下载地址:http://sharesdk.cn/Download 2.2.申请第三方登录的Appkey 例如: 新浪微博.腾讯微博.QQ.微信.豆瓣应用.人