iOS 開發 應用內購買 In-App Purchase

如今有不少應用都使用了In-App Purchase,雖然對於不少用戶來講,可能並不喜歡甚至討厭這個模式,覺得一點擊就要從帳戶里扣錢。可是,應用內購買對於開發者而言不失爲一種好的商業模式,並且人們也將愈來愈接受這種購買模式。編程

下面開始介紹一下應用內購買的基本原理和編程方法。安全

一、基本原理app

這裏參考了Apple的開發文檔In-App Purchase Programming Guideide


簡要介紹一下整個流程:post

Pre 0:在iTunesConnect中對於的App建立相應的產品,並在應用信息中加入這些產品。具體步驟以後介紹。測試

Step 1:應用內根據建立的產品的bundle identifier來獲取產品的List。ui

Step 2:應用請求產品的信息。產品信息爲SKProduct對象。spa

Step 3:App Store返回信息。在實際編程中,Step1,2,3是在一塊兒的。經過建立SKProductsRequest獲得SKProductsResponse。SKProducts信息就在SKProductsResponse的對象中,是其Property。rest

Step 4:在應用中顯示產品信息給用戶code

Step 5:用戶點擊了一個產品。

Step 6:應用向App Store發出一個購買請求 Payment Request

Step 7:App Store處理請求,完成交易,並返回信息到應用。

Step 8:  應用獲取信息而後根據交易狀況將購買的內容解鎖給用戶使用。


這是In-App Purchase的一個基本的過程描述。在咱們實際的編程過程當中。對於這個產品列表,咱們可能會選擇直接提供給用戶,而不是經過App Store獲取信息。只有當用戶點擊了某個產品後,咱們纔開始去獲取產品信息並完成購買。另外一方面,在購買過程當中,咱們在應用中應該顯示足夠的提示信息,所以交易過程當中的Notification也很重要。


下面開始StepByStep介紹整個具體的實現過程。這裏只是介紹最基本的實現方法,以non-consumable產品爲例。

Step 1:建立產品

首先要說明一下爲了實現應用內購買,你的AppID就是com.companyname.appname必須是惟一的,不能帶*。

在iTunesConnect中Manage My Applications中選擇Manage In-App Purchases



有四種產品類型,具體詳見開發文檔。這裏選擇non-consumable,就是一次購買終身受用的產品。consumable就是消費類能夠不斷購買的,這種在遊戲中比較常見。


上面是產品的詳細信息填寫。這裏特別注意的是ProductID的填寫,其實就是ProductIdentifier,這個和應用的BundleIdentifier相似,必須獨一無二,通常的作法是填寫成com.companyname.appname.productname,固然從本質上講能夠是任意字符串,只要獨一無二就能夠了。這個ProductID是以後在程序中獲取產品信息的依據。其餘方面的信息填寫很簡單,這裏不在費述。

Step 2:在應用版本信息中加入產品

進入到應用頁面,點擊View Detail,而後在下面能夠看到

In-App Purchases,點擊Edit而後加入以前建立的Products。

Step 3:建立測試User

爲了在開發階段測試In-App Purchase,Apple爲咱們提供了Test User功能,經過它,能夠在開發時用這個帳號免費實現應用內購買。

具體就是在iTunesConnect首頁,點擊Manage Users

點擊Test User進行建立。

Step 4:開始編程。在Xcode中要加入StoreKit.framework,經過它來實現功能

Step 5:通常咱們會單首創建一個類來實現應用內購買的功能。因爲這個是教程,而不是案例,因此不打算把整個類的編寫都搬進來。只是介紹一下重要的東西和流程。

在類中要加入

<SKProductsRequestDelegate,SKPaymentTransactionObserver>

對於SKPaymentTransactionObserver這個東西能夠監測交易的整個過程,即便交易時退出應用,交易也能夠繼續進行,固然要回到應用內的頁面才能最後完成交易,顯示產品相應內容。類的初始化應加入

[[SKPaymentQueuedefaultQueueaddTransactionObserver:self];

加入這句代碼來實現TransactionObserver的功能,後面有相應的Methods能夠加入

paymentQueue:開頭

Step 6:下面的介紹不侷限在一個類的編寫,而是按照購買流程。假設咱們已經編寫好了一個應用內購買的類,而後咱們要實現購買。首先就是Request Products。

_productRequest = [[SKProductsRequestalloc]initWithProductIdentifiers:_productIdentifiers];

_productRequest.delegate =self;

[_productRequest start];


一個完整的請求如上,對於productsIdentifiers,這是一個Set,就是在這裏建立一個set加入各個ProductIdentifer

 NSSet *productIdentifiers = [NSSetsetWithObjects:

                                    K_CAMERA_ANGLE_MODE,

                                    K_SLOPE_ANGLE_MODE,

                                    K_DIHEDRAL_ANGLE_MODE,

                                    K_LINE_PLANE_ANGLE_MODE,

                                    nil];

而後就是request delegate的methods

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

   NSArray *skProducts = response.products;

    // process....

}


- (void)request:(SKRequest *)request didFailWithError:(NSError*)error

{

   // process....   

}


請求成功,就能獲取Products,一個NSArray,裏面就是SKProduct 對象的產品信息了。產品信息有名稱,價格,等等,很容易找到。這些東西只是在顯示信息時有用,購買時不須要,只要用SKProduct就好了

Step 7:購買

SKPayment *payment = [SKPaymentpaymentWithProduct:product];

[[SKPaymentQueuedefaultQueueaddPayment:payment];

代碼如上。而後就開始鏈接App Store了。主要看下面

#pragma mark - SKPaymentTransactionObserver

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

{

   for (SKPaymentTransaction *transactionin transactions) {

       switch (transaction.transactionState) {

            caseSKPaymentTransactionStatePurchased:

                [selfcompleteTransaction:transaction];

               break;

            caseSKPaymentTransactionStateFailed:

                [selffailedTransaction:transaction];

               break;

            caseSKPaymentTransactionStateRestored:

                [selfrestoreTransaction:transaction];

                

           default:

               break;

        }

    }

}


這裏說一下上面的第三種交易狀態Restore,恢復。這個是這樣的。若是有些人在iPhone上用一個帳號購買了一個產品,那麼在iPad上又下載了這個應用,還要再從新購買嗎?不用了,經過Restore在App Store中檢測你這個帳號的購買記錄,若是有購買記錄存在,那就不用再次購買了,直接restoreTransaction。


接下來就是根據購買的狀態分別進行處理

- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
    // Your application should implement these two methods.
    [self recordTransaction:transaction];
    [self provideContent:transaction.payment.productIdentifier];
    // Remove the transaction from the payment queue.
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

通常咱們用NSUserDefaults來進行交易的記錄就好了。

注意程序中finishTransaction這一行代碼,這樣TransactionObserver就再也不監測這個交易了。

其餘狀態Restore,failed都是差很少的處理,這些代碼在開發文檔中有。


固然,對於restore,還有一個Method要注意

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error

若是restore失敗,能夠顯示相應的信息提示


Step 8:附加

在整個購買過程當中,咱們通常要給用戶一下提示信息,好比等待,好比正在鏈接,好比交易已完成。要實現這些功能,就應該用notification,在上面的交易環節加入postNotification,而後對notification進行有效處理。本文只講In-App Purchase,關於notification的編程不作介紹。


基本上,經過上面的環節就能完成整個應用內購買了。固然,從安全性上考慮,Apple在交易完成後會發送驗證信息,經過發送驗證信息給App Store來判斷這筆交易是否出自App Store,從而確認交易的合法性。

關於這方面,Apple 有一個代碼包提供了validationController來實現很方便的驗證。

相關文章
相關標籤/搜索