標籤:ios 內付費 appstore storekitstorekit.h itunesconnect
很久之前就想出一篇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]; 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帳密,使用測試產生的即可
確定購買:
交易完成:
好了,所有的內購流程基本上講完了,原諒我在圖片上的塗抹,因為關係到產品的禁用語所以希望大家能夠不介意。趕這篇部落格的時間比較匆忙,如果有童鞋還有什麼疑問或者我寫的那個地方不對歡迎私信我或者評論,我會在第一時間回複。謝謝~
IOS AppStore內付費教程(一)