蘋果內(nèi)購(gòu)

內(nèi)購(gòu)簡(jiǎn)介:

在APP里面購(gòu)買一些東西的時(shí)候,必須要使用蘋果的支付方式進(jìn)行購(gòu)買.
如果你的APP當(dāng)中銷售的商品,跟APP功能相關(guān),必須通過內(nèi)購(gòu)的方式購(gòu)買.

內(nèi)購(gòu)的缺點(diǎn):

1.從商家的角度來看,需要分成給蘋果,分成比例過高 內(nèi)購(gòu)分成3:7
2.從用戶角度來看,內(nèi)購(gòu)支付,第一次需要綁定銀行卡 操作流程相對(duì)來說比較復(fù)雜
3.內(nèi)購(gòu)商品的價(jià)格,不能自定義,只有固定的級(jí)別.

下面是內(nèi)購(gòu)的操作流程,首先登陸了蘋果開發(fā)者賬號(hào)官網(wǎng).

1.png

1.創(chuàng)建APP, 并且創(chuàng)建設(shè)置需要銷售的商品

1.1 創(chuàng)建一個(gè)app


1.png

2.png

1.2 創(chuàng)建一個(gè)App IDs,并填寫相關(guān)信息.


3.png

4.png

5.png

6.png

1.4修改app信息


7.png

1.5選擇"功能"模塊--App內(nèi)購(gòu)購(gòu)買項(xiàng)目(如果你是第一次配置,出現(xiàn)的頁(yè)面和我的不一致的話,請(qǐng)?zhí)恋?步驟:內(nèi)購(gòu)流程- 稅務(wù)信息配置)
8.png

9.png

1.5.1創(chuàng)建一個(gè)消耗型項(xiàng)目
10.png

11.png

12.png

13.png

1.5.2創(chuàng)建一個(gè)非消耗型項(xiàng)目
14.png

15.png

16.png

17.png

至此,內(nèi)購(gòu)的商品創(chuàng)建完畢.

2.請(qǐng)求真正可以被銷售的商品列表(從蘋果服務(wù)器)

2.1在iTunes中我們已經(jīng)創(chuàng)建了要賣的商品,那么現(xiàn)在我們要開始寫代碼了.創(chuàng)建一個(gè)新的項(xiàng)目.并修改bundle id為我們創(chuàng)建的app IDs.

2.1.png

主要代碼邏輯如下:
demo下載地址.

  override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register( UINib(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier:cellID)
        //1.從我們自己的服務(wù)器,獲取需要銷售的商品
         //2.拿到需要銷售的商品,到蘋果服務(wù)器,進(jìn)行驗(yàn)證,看下哪些商品,才可以真正被銷售
        YFDataTools.getGoodsList { (ids:Set<String>) ->() in
            //2.拿到需要銷售的商品,到蘋果服務(wù)器,進(jìn)行驗(yàn)證,看下哪些商品,才可以真正被銷售
            //2.1 創(chuàng)建一個(gè)商品請(qǐng)求,請(qǐng)求哪些商品可以真正的被銷售
            let request :SKProductsRequest = SKProductsRequest(productIdentifiers: ids)      
            //2.1.1設(shè)置代理
            request.delegate = self
            //2.2 發(fā)送請(qǐng)求
            request.start()
        }    
    }
extension ViewController: SKProductsRequestDelegate{
    //當(dāng)請(qǐng)求完畢之后,從蘋果服務(wù)器獲取到數(shù)據(jù)之后調(diào)用
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        //response
        //products 可以被銷售的商品
        //invalidProductIdentifiers 無(wú)效的商品ID
        productsArr = response.products
        print("可以被銷售的商品:\(response.products)")
        print("無(wú)效的商品ID :\(response.invalidProductIdentifiers)")
    }  
}
extension ViewController : UITableViewDelegate,UITableViewDataSource{
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return productsArr.count
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 60
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! CustomTableViewCell
        //獲取對(duì)應(yīng)的商品數(shù)據(jù)模型
        let product = productsArr[indexPath.row]
        
        cell.titleLab?.text = product.localizedTitle
        cell.subTitleLab?.text = product.localizedDescription + "\(product.price)"
        
        return cell
        
    }
}

運(yùn)行我們得到了商品列表界面.此時(shí)我們點(diǎn)擊的時(shí)候應(yīng)該開始購(gòu)買,所以要添加到購(gòu)買隊(duì)列中,主要代碼如下:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //取出需要購(gòu)買的商品
        let product = productsArr[indexPath.row]
        
        //2.0判斷當(dāng)前的支付環(huán)境,是否可以支付
        if SKPaymentQueue.canMakePayments() {
            //2.購(gòu)買商品
            //2.1 根據(jù)商品,開一個(gè)支付小票
            let payment = SKPayment(product: product)
            //2.2添加到支付隊(duì)列,開始進(jìn)行購(gòu)買隊(duì)列
            SKPaymentQueue.default().add(payment)
            //2.3添加交易隊(duì)列堅(jiān)挺著,來監(jiān)聽交易狀態(tài)
            SKPaymentQueue.default().add(self)
        }
    }
//MARK:交易隊(duì)列的監(jiān)聽者
extension ViewController : SKPaymentTransactionObserver{
    
    //當(dāng)交易隊(duì)列列名添加的每一筆交易狀態(tài)發(fā)生變化的時(shí)候調(diào)用
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        
        for transaction in transactions {
            switch transaction.transactionState {
            case .deferred:
                print("延時(shí)處理")
            case .failed:
                print("支付失敗")
                //應(yīng)該移除交易隊(duì)列
                queue.finishTransaction(transaction)
            case .purchased:
                print("支付成功")
                //應(yīng)該移除交易隊(duì)列
                queue.finishTransaction(transaction)
            case .purchasing:
                print("正在支付")
            case .restored:
                print("恢復(fù)購(gòu)買")
                //應(yīng)該移除交易隊(duì)列
                queue.finishTransaction(transaction)
            }
        }
    }
}

運(yùn)行點(diǎn)擊商品,出現(xiàn)如下界面


02.png

這里讓我們輸入賬號(hào)和密碼,這里我不可能使用我自己的真是賬號(hào)和密碼如購(gòu)買.所以這里需要添加一個(gè)測(cè)試賬號(hào).

3.添加測(cè)試賬號(hào).

3.1 在用戶職能--沙箱技術(shù)測(cè)試員中添加


01.png

3.2 填寫測(cè)試人員的相關(guān)信息


02.png

3.3查看添加后的狀態(tài)
03.png

此時(shí),再次運(yùn)行,點(diǎn)擊一個(gè)商品進(jìn)行購(gòu)買,出現(xiàn)如下的界面:


01.png

點(diǎn)擊使用先用的Apple ID,輸入我們剛剛創(chuàng)建的沙盒測(cè)試員的賬號(hào)進(jìn)行購(gòu)買.


02.png

03.png

04.png

如果你購(gòu)買的是非消耗商品,再次購(gòu)買的時(shí)候會(huì)提示已經(jīng)購(gòu)買了此商品.


05.png
4. 內(nèi)購(gòu)流程- 稅務(wù)信息配置

4.1 登錄itunes connect


000.png

4.2協(xié)議、稅務(wù)和銀行業(yè)務(wù)


001.png

002.png

003.png

004.png

005.png

006.png

007.png

008.png

009.png

010.png

012.png

014.png

15.png

16.png

17.png

18.png
過程中遇到的問題

1.點(diǎn)擊購(gòu)買沒有彈出輸入賬戶密碼框,解決方法是 到手機(jī)設(shè)置里面iTunes Store 與 App Store 里面注銷你原本的賬號(hào)


01.png

2.運(yùn)行程序的時(shí)候,賬戶中明明添加了商品,但是無(wú)法獲得商品ID


bug.png

解決辦法:
bug2.png

第一次做內(nèi)購(gòu),這么多功能其實(shí)還是都是陌生的,因?yàn)閮?nèi)購(gòu)沒做過,但是人生不就是一次一次的挑戰(zhàn)嘛! 其實(shí)回過頭來看,大多數(shù)都是一些配置信息,內(nèi)購(gòu)的代碼其實(shí)是很少的,加油吧,多多挑戰(zhàn)一下自己,有時(shí)候不挑戰(zhàn)一下自己,都不知道什么是絕望??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容