你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 詳解iOS使用順序內購/內付費(一)

詳解iOS使用順序內購/內付費(一)

編輯:IOS開發綜合

很久之前就想出一篇IOS內付費的教程,但是一查網上的教程真實太多了,有的寫得真的蠻不錯的,就心想算了,於是就保管在草稿箱了。至於為什麼寫完它呢!真是說來話長,最近公司有個項目經理跑來問我有關蘋果內付費相關的細節,跟他聊了半天,從項目對接蘋果官方領取接口聊到了如何檢查App收益,最後終於使他有了一些眉目,但是悲催的是還要我持續去跟他們項目的順序員解說(真是瘋了),所以我就決議給他們項目寫一個內購的文檔,所以我特地把這篇博客完成吧!

首先進入蘋果的ItunesConnection(https://itunesconnect.apple.com)點擊左上角的加號新建一個App使用,點擊後該網站會彈出一個信息編輯框,大家只需將下面的信息填充終了點擊save即可在蘋果的app平台上擁有一個屬於自己的App。

 

在套裝ID的上,需求提早為該App請求一個AppID以及BundleID,只需是請求成功了就會在選擇列表中顯示出來。

這裡特地多說一句這個ItunesConnect是用來干嘛的,它是蘋果公司給團體或企業提供管理自己App的一個平台。在這個平台上開發者可以新建,刪除和管理自己的App使用,開發者可以依據需求對App使用停止上架與下架,編輯App信息,生成測試app所需的信息,例如賬號,約請碼等,還有就是我們明天要講的內付費功用。當然啦,他的功用可不止我講的這些,我大致說一下這個平台的作用,假如你常常跟它打交道的話就會漸漸熟習了。

接上去,我就來為大家演示一下如何添加付費道具,首先翻開iTunesConnect,顯示如下頁面:

選擇紅圈所圈起來的選項,然後將外面的相關信息補充終了,假如短少這一步,內購功用是不會成功的。

假設你曾經完成了上述相關銀行賬戶的設置,就點擊你的App,選擇下面標題欄中的"App 內購置項目"

隨後點擊左上角的 "create new"選項,如下圖所示,進入到下一個界面:

 

這個界面是讓你選擇消費道具的品種,如今改版的網站是有簡體中文翻譯的,所以不像以前翻開一看都不知道選哪一個,甚至都不知道每個代表的什麼意思(比方我第一次遇到的時分,在指導面前真是囧)。它的品種分為如下幾種:

普通對項目來說大少數都是選擇“耗費型項目”這個品種,比方游戲中購置金幣,寶石balabala~之類的,選中之後就會到這個界面中來:

在上圖所示的編輯框中輸出,商品稱號,產品ID以及價錢等級,在這邊闡明一下:

1.商品稱號依據你的消費道具的實踐意義來闡明,比方“100顆寶石”,“100金幣”等。

2.產品ID是比擬重要的,由項目自定義,只需獨一即可,像我普通都是用App的bundleID加一個後綴來表示,這樣既跟項目關聯又具有獨一性。

3.價錢等級的話“檢查價錢表”中有對應的闡明,可以對照著表中每個國度的貨幣價錢與等級來選擇。

我們持續,在這個網頁的接上去局部如圖所示:

選擇添加言語選項,彈出一個編輯頁面:

點擊save保管,則會在界面上顯示成如下:

最後一步就是點擊“選取文件”提交一張蘋果它指定像素(640*920)的商品圖片,當他上傳終了後點擊“save”按鈕,我們這第二局部就大工告成了。提交的商品最後會在內購的頁面上顯示為如圖:

這個圖是我在曾經發布的app下面截取的,添加了3個商品,曾經是經過的的形態了(顯示綠色),當您剛提交的時分,由於經過蘋果的審查需求一段時間所以會顯示黃色的等候形態,所以不用擔憂是不是商品編輯錯了。如圖:

這局部,我次要給大家演示一下,如何請求測試賬號,應用蘋果的沙盒測試環境來模仿AppStore的購置流程。
在ItunesConnect中選擇“用戶和職能”選項~

隨後在左上角的選項中選擇沙盒測試者,點擊左上角的加號圖標添加一位測試者,如圖:

編輯好相應的內容,點擊保管,就創立了一個測試賬號,是不是很復雜啊!當然這個賬號假如你遺忘了密碼可以重重生成一個,有關緊要。

順帶多句嘴,不要在正式的appstore下面用沙盒測試的賬號來登錄,千萬要牢記在心,此賬號只用於測試環境下~

接上去就是代碼局部啦~

1.首先在項目工程中參加“storekit.framework”,參加頭文件#import <StoreKit/StoreKit.h>

2.在.h文件中參加“SKPaymentTransactionObserver,SKProductsRequestDelegate”監聽機制

上面貼上內購的中心代碼,就幾個函數,我在這邊就不在做更多詳細的解釋了,各位看官可以運轉跑一下就了如指掌了。
.h文件

// 
// PaymentViewController.h 
// IAPPayTest 
// 
// Created by silicon on 14-10-28. 
// Copyright (c) 2014年 silicon. All rights reserved. 
// 
 
#import <UIKit/UIKit.h> 
 
#import <StoreKit/StoreKit.h> 
 
@interface PaymentViewController : UIViewController<SKPaymentTransactionObserver,SKProductsRequestDelegate> 
 
@property (strong, nonatomic) IBOutlet UITextField *productID; 
 
@property (strong, nonatomic) IBOutlet UIButton *purchase; 
 
- (IBAction)purchaseFunc:(id)sender; 
 
@end 

.m文件

// 
// PaymentViewController.m 
// IAPPayTest 
// 
// Created by silicon on 14-10-28. 
// Copyright (c) 2014年 silicon. All rights reserved. 
// 
 
#import "PaymentViewController.h" 
 
@interface PaymentViewController () 
 
@end 
 
@implementation PaymentViewController 
 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
  if (self) { 
    // Custom initialization 
  } 
  return self; 
} 
 
- (void)viewDidLoad 
{ 
  [super viewDidLoad]; 
  // Do any additional setup after loading the view from its nib. 
   
  [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
  self.productID.text = @"com.games.ztyxs.product_point.1"; 
} 
 
- (void)didReceiveMemoryWarning 
{ 
  [super didReceiveMemoryWarning]; 
  // Dispose of any resources that can be recreated. 
} 
 
- (IBAction)purchaseFunc:(id)sender { 
  NSString *product = self.productID.text; 
  if([SKPaymentQueue canMakePayments]){ 
    [self requestProductData:product]; 
  }else{ 
    NSLog(@"不允許順序內付費"); 
  } 
} 
 
//懇求商品 
- (void)requestProductData:(NSString *)type{ 
  NSLog(@"-------------懇求對應的產品信息----------------"); 
  NSArray *product = [[NSArray alloc] initWithObjects:type, nil nil]; 
 
  NSSet *nsset = [NSSet setWithArray:product]; 
  SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset]; 
  request.delegate = self; 
  [request start]; 
   
} 
 
//收到產品前往信息 
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ 
 
  NSLog(@"--------------收到產品反應音訊---------------------"); 
  NSArray *product = response.products; 
  if([product count] == 0){ 
    NSLog(@"--------------沒有商品------------------"); 
    return; 
  } 
   
  NSLog(@"productID:%@", response.invalidProductIdentifiers); 
  NSLog(@"產品付費數量:%d",[product count]); 
   
  SKProduct *p = nil; 
  for (SKProduct *pro in product) { 
    NSLog(@"%@", [pro description]); 
    NSLog(@"%@", [pro localizedTitle]); 
    NSLog(@"%@", [pro localizedDescription]); 
    NSLog(@"%@", [pro price]); 
    NSLog(@"%@", [pro productIdentifier]); 
     
    if([pro.productIdentifier isEqualToString:self.productID.text]){ 
      p = pro; 
    } 
  } 
   
  SKPayment *payment = [SKPayment paymentWithProduct:p]; 
   
  NSLog(@"發送購置懇求"); 
  [[SKPaymentQueue defaultQueue] addPayment:payment]; 
} 
 
//懇求失敗 
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{ 
  NSLog(@"------------------錯誤-----------------:%@", error); 
} 
 
- (void)requestDidFinish:(SKRequest *)request{ 
  NSLog(@"------------反應信息完畢-----------------"); 
} 
 
 
//監聽購置後果 
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{ 
  for(SKPaymentTransaction *tran in transaction){ 
     
    switch (tran.transactionState) { 
      case SKPaymentTransactionStatePurchased: 
        NSLog(@"買賣完成"); 
         
        break; 
      case SKPaymentTransactionStatePurchasing: 
        NSLog(@"商品添加進列表"); 
         
        break; 
      case SKPaymentTransactionStateRestored: 
        NSLog(@"曾經購置過商品"); 
       
        break; 
      case SKPaymentTransactionStateFailed: 
        NSLog(@"買賣失敗"); 
         
        break; 
      default: 
        break; 
    } 
  } 
} 
 
//買賣完畢 
- (void)completeTransaction:(SKPaymentTransaction *)transaction{ 
  NSLog(@"買賣完畢"); 
   
  [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 
 
 
- (void)dealloc{ 
  [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 
  [super dealloc]; 
} 
 
@end 

代碼就這麼多,到這邊我們的IOS內購教程就接近序幕了,在測試的時分還有幾點要素要留意一下:

1.沙盒環境測試appStore內購流程的時分,請運用沒越獄的設備。

2.請務必運用真機來測試,一切以真機為准。

3.項目的Bundle identifier需求與您請求AppID時填寫的bundleID分歧,不然會無法懇求到商品信息。

講了這麼多,附上幾張測試截屏給大家展現一下:

懇求商品時的打印日志:

買賣成功後:

手機截屏:

要求輸出AppStore帳密,運用測試生成的即可:

確定購置:

買賣完成:

當我們的買賣完成後還要去appstore 下面去驗證票據信息能否正確,這樣我們才可以給玩家發放道具,apple官方文檔:

//買賣完畢 
- (void)completeTransaction:(SKPaymentTransaction *)transaction{ 
  NSLog(@"買賣完畢"); 
  //買賣驗證 
  NSURL *recepitURL = [[NSBundle mainBundle] appStoreReceiptURL]; 
  NSData *receipt = [NSData dataWithContentsOfURL:recepitURL]; 
   
  if(!receipt){ 
     
  } 
   
  NSError *error; 
  NSDictionary *requestContents = @{ 
                   @"receipt-data": [receipt base64EncodedStringWithOptions:0] 
                   }; 
  NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents 
                             options:0 
                              error:&error]; 
   
  if (!requestData) { /* ... Handle error ... */ } 
   
  //In the test environment, use https://sandbox.itunes.apple.com/verifyReceipt 
  //In the real environment, use https://buy.itunes.apple.com/verifyReceipt 
  // Create a POST request with the receipt data. 
  NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"]; 
  NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; 
  [storeRequest setHTTPMethod:@"POST"]; 
  [storeRequest setHTTPBody:requestData]; 
   
  // Make a connection to the iTunes Store on a background queue. 
  NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
  [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue 
              completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
                if (connectionError) { 
                  /* ... Handle error ... */ 
                } else { 
                  NSError *error; 
                  NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 
                  if (!jsonResponse) { /* ... Handle error ...*/ } 
                  /* ... Send a response back to the device ... */ 
                  //Parse the Response 
                } 
              }]; 
 
   
   
  [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 

好了,一切的內購流程根本上講完了,原諒我在圖片上的塗抹,由於關系到產品的敏感詞匯所以希望大家可以不介意。以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持本站。

【詳解iOS使用順序內購/內付費(一)】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved