2016-05-24 10 views
1

Appleが提供するアプリ内購入について学習しています。そこで、このチュートリアルに従っていました。 http://www.appcoda.com/in-app-purchase-tutorial/アプリ内購入が動作しない、商品が表示されない

このチュートリアルのすべての手順を実行しました。まず、アプリIDを作成し、そのアプリIDを使用してiTunesでアプリを作成しました。次に、商品IDが「com.outlines.feature1」と「com.outlines.feature2」の2つのアプリ内購入を作成しました。どちらも消耗品です。 コードの残りの部分は、私は単に

import UIKit 
import StoreKit 

protocol IAPurchaceViewControllerDelegate { 
    func didBuyColorsCollection(collectionIndex: Int) 
} 


class IAPurchaceViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, SKProductsRequestDelegate, SKPaymentTransactionObserver { 

@IBOutlet weak var tblProducts: UITableView! 

var delegate: IAPurchaceViewControllerDelegate! 

var selectedProductIndex: Int! 
var transactionInProgress = false 

let productIdentifiers = NSSet(array: ["com.outlines.feature1", "com.outlines.feature2"]) 
var product: SKProduct? 
var productsArray = Array<SKProduct>() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    tblProducts.delegate = self 
    tblProducts.dataSource = self 

    //checks whether the In-App feature is activated or not 
    requestProductInfo() 

    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
} 

func requestProductInfo(){ 
    if SKPaymentQueue.canMakePayments() { 
     let request = SKProductsRequest(productIdentifiers: 
      productIdentifiers as! Set<String>) 
     print("This is the request to be sent \(request)") 
     request.delegate = self 
     request.start()//calls productsRequest() function 
    } 
    else { 
     print("Cannot perform In App Purchases.") 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

// MARK: IBAction method implementation 

@IBAction func dismiss(sender: AnyObject) { 
    dismissViewControllerAnimated(true, completion: nil) 
} 


// MARK: UITableView method implementation 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return productsArray.count 
} 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("idCellProduct", forIndexPath: indexPath) as UITableViewCell 

    let product = productsArray[indexPath.row] 
    cell.textLabel?.text = product.localizedTitle 
    cell.detailTextLabel?.text = product.localizedDescription 

    return cell 
} 


func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    selectedProductIndex = indexPath.row 
    showActions() 
    tableView.cellForRowAtIndexPath(indexPath)?.selected = false 
} 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 80.0 
} 




///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 


func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) { 
    if response.products.count != 0 { 
     for product in response.products { 
      productsArray.append(product as SKProduct) 
     } 

     tblProducts.reloadData() 
    } 
    else { 
     print("There are no products.") 
    } 

    if response.invalidProductIdentifiers.count != 0 { 
     print("Invalid "+response.invalidProductIdentifiers.description) 
    } 
} 

func showActions() { 
    if transactionInProgress { 
     return 
    } 

    let actionSheetController = UIAlertController(title: "IAPDemo", message: "What do you want to do?", preferredStyle: UIAlertControllerStyle.ActionSheet) 

    let buyAction = UIAlertAction(title: "Buy", style: UIAlertActionStyle.Default) { (action) -> Void in 
     let payment = SKPayment(product: self.productsArray[self.selectedProductIndex] as SKProduct) 
     SKPaymentQueue.defaultQueue().addPayment(payment) 
     self.transactionInProgress = true 
    } 

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { (action) -> Void in 

    } 

    actionSheetController.addAction(buyAction) 
    actionSheetController.addAction(cancelAction) 

    presentViewController(actionSheetController, animated: true, completion: nil) 
} 

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
    for transaction in transactions as [SKPaymentTransaction] { 
     switch transaction.transactionState { 
     case SKPaymentTransactionState.Purchased: 
      print("Transaction completed successfully.") 
      SKPaymentQueue.defaultQueue().finishTransaction(transaction) 
      transactionInProgress = false 
      delegate.didBuyColorsCollection(selectedProductIndex) 

     case SKPaymentTransactionState.Failed: 
      print("Transaction Failed"); 
      SKPaymentQueue.defaultQueue().finishTransaction(transaction) 
      transactionInProgress = false 

     default: 
      print(transaction.transactionState.rawValue) 
     } 
    } 
} 
} 

はエラーはありません上記のチュートリアルからの手順に従ったが、私はiPhone上でそれを実行すると、コンソールが表示さ:

This is the request to be sent <SKProductsRequest: 0x15d86210> 
There are no products. 
Invalid ["com.outlines.feature1", "com.outlines.feature2"] 

コンソールショー製品はありませんが、iTunes IDに2つのアプリ内機能を追加しました。ここにスクリーンショットがあります: In-App Purchases in iTunes

私が何を間違っているのか教えてもらえますか?アプリ内購入が完全に設定されていない

+1

InApp Purchaseの画面が表示されます。ステータスが「準備完了」に変わったら、それが動作するかどうかを確認してください。 [InAppチュートリアル](https://www.raywenderlich.com/122144/in-app-purchase-tutorial)に従うことをお勧めします。 – TheTiger

答えて

19

私はそれを最後に解決しました。コードやアプリ内購入のプロセスにエラーはありませんでした。スナップショットをアップロードするために言及された初期の解決策も問題ではありませんでした。

問題は、契約、税金、ベーキングでの契約でした。このチュートリアルでは言及されていませんでしたが、私がやっていなかったiTunesのAgreements、Tax and Bankingで契約を完了する必要があります。契約の書式を記入した後、処理されます。契約が有効になると、iTunesで作成されたアプリ内購入が認識されます。

+1

私は同じ問題があります。私はすべての銀行業務と課税情報を記入しましたが、まだ商品を入手できません。私は4時間から5時間前のような情報を必要としたが、それでも何も設定していない。もっと時間が必要ですか? – rootpanthera

+0

遅くて申し訳ありませんが、はい、正しく覚えていれば、2〜4日かかります... –

+0

iTunesで情報を追加した後、約5〜10分後に働いています –

0

、あなたが見るように、彼らは、「スクリーンショットの待機中」ステータスを持っている:

あなたが審査のためのあなたのアプリ内購入を提出する前に、あなたが をアップロードする必要がありますスクリーンショット。このスクリーンショットは、レビューのためのものです。 はApp Storeに表示されません。スクリーンショットは少なくとも 312x390ピクセルと少なくとも72 DPIでなければなりません。

通常、私はアプリ内購入提案のアラートでスクリーンショットを作成し、カットしてiTunesConnectにアップロードします。

enter image description here

P.S.:あなたが現在購入が提出のステータスレディを持つべき、ということやった後

新しい変更を加えるには時間がかかりますので、気をつけてください。

+0

アップロードする必要があるスクリーンショットは何ですか?私はちょうどサンプルのテストアプリケーションを意味する、私はスクリーンショットや何も持っていない... –

+0

それは重要ではなく、あなたの購入を編集し、画面がアップロードされるべきセクションの下部に表示されます。 –

+0

OKランダム写真を試してみてください。 –

7

あなたのデバイスでIAPをテストするには、スクリーンショットを提出する必要はありません。アプリを提出するときにのみ必要です。

は、あなたがこれらの質問のそれぞれに「はい」答えることができていることを確認してください:

  1. はあなたのApp IDのためのアプリ内購入を有効にしていますか?
  2. お使いの製品の販売を終了したことを確認しましたか?
  3. プロジェクトの.plist Bundle IDがあなたのアプリケーションIDと一致していますか?
  4. 新しいApp IDの新しいプロビジョニングプロファイルを生成してインストールしましたか?
  5. この新しいプロビジョニングプロファイルを使用してコード署名するようにプロジェクトを設定しましたか?
  6. SKProductRequestの作成時に完全な製品IDを使用していますか?
  7. iTunes Connectに製品を追加してから数時間お待ちですか?
  8. 端末からアプリを削除して再インストールしましたか?
  9. あなたのデバイスはjailbreakですか?もしそうなら、あなたはIAPが機能するための脱獄を元に戻す必要があります。

これらの質問のいずれかに「いいえ」と答えた場合は、問題があります。

tableViewを使用している場合は、セルにロードする正しいパラメータも設定していることを確認してください。あなたの問題が接続中で、テーブルビューに関連するかもしれません。

+0

これらの中で、私は最後の2つの選択肢にノーと言う必要があります。しかし、チュートリアルプロジェクトをダウンロードしてエミュレータで実行しました。これはIAP製品を表示するように見えますが、購入機能はエミュレータでは機能しません。しかし、私の場合、IAP製品は無効です。チュートリアルの正確な手順に従っているため、わかりません。 –

+0

あなたは同じプロジェクトをダウンロードしましたか?または新しいものを作った? – Done

+0

私はそのチュートリアルからスタータープロジェクトをダウンロードし、それに取り組みました –

関連する問題