1. 程式人生 > >iOS應用內付費(IAP)開發步驟列表

iOS應用內付費(IAP)開發步驟列表

前兩天和服務端同事一起,完成了應用內付費(以下簡稱IAP, In app purchase)的開發工作。步驟繁多,在此把開發步驟列表整理如下。因為只是步驟列表,所以並不含詳細的說明教程,需要看教程的新手,可以看我附在最後的一些參考連結。

配置Developer.apple.com

  1. 為應用建立建立一個不帶萬用字元的App ID
  2. 用該App ID生成和安裝相應的Provisioning Profile檔案。

配置iTunes Connect

  1. 用該App ID建立一個新的應用。
  2. 在該應用中,建立應用內付費專案,選擇付費型別,通常可選的是可重複消費(Consumable)的或是永久有效(Non-Consumable)的2種,然後設定好價格和Product ID以及購買介紹和截圖即可,這裡的Product ID是需要記住的,後面開發的時候需要。如下圖所示: 

  3. 新增一個用於在sandbox付費的測試使用者,如下圖所示。注意蘋果對該測試使用者的密碼要求 和正式賬號一樣,必須是至少8位,並且同時包含數字和大小寫字母: 

  4. 填寫相關的稅務,銀行,聯絡人資訊。如下圖所示: 

開發工作(ios端)

1、 在工程中引入 storekit.framework 和 #import <StoreKit/StoreKit.h>

2、 獲得所有的付費Product ID列表。這個可以用常量儲存在本地,也可以由自己的伺服器返回。

3、 製作一個介面,展示所有的應用內付費專案。這些應用內付費專案的價格和介紹資訊可以是自己的伺服器返回。但如果是不帶伺服器的單機遊戲應用或工具類應用,則可以通過向App Store查詢獲得。我在測試時發現,向App Store查詢速度非常慢,通常需要2-3秒鐘,所以不建議這麼做,最好還是搞個自己的伺服器吧。

4、當用戶點選了一個IAP專案,我們先查詢使用者是否允許應用內付費,如果不允許則不用進行以下步驟了。程式碼如下:

1
2
3
4
5
6
if ([SKPaymentQueue canMakePayments]) {
    // 執行下面提到的第5步:
    [self getProductInfo];
} else {
    NSLog(@"失敗,使用者禁止應用內付費購買.");
}

5、 我們先通過該IAP的ProductID向AppStore查詢,獲得SKPayment例項,然後通過SKPaymentQueue的 addPayment方法發起一個購買的操作。

1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// 下面的ProductId應該是事先在itunesConnect中新增好的,已存在的付費專案。否則查詢會失敗。
- (void)getProductInfo {
  NSSet * set = [NSSet setWithArray:@[@"ProductId"]];
  SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
  request.delegate = self;
  [request start];
}
// 以上查詢的回撥函式
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSArray *myProduct = response.products;
    if (myProduct.count == 0) {
        NSLog(@"無法獲取產品資訊,購買失敗。");
        return;
    }
    SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

6、 在viewDidLoad方法中,將購買頁面設定成購買的Observer。

1
2
3
4
5
6
7
8
9
10
- (void)viewDidLoad {
    [super viewDidLoad];
    // 監聽購買結果
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
- (void)viewDidUnload {
    [super viewDidUnload];
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

7、 當用戶購買的操作有結果時,就會觸發下面的回撥函式,相應進行處理即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case