2017-06-02 7 views
13

アプリはアプリ内購入が組み込まれています(これはtutorialに従います)、購入機能が動作します。しかし、アプリストアのプロモーションコードをアプリ内購入商品の1つに交換すると、アプリはそのアプリに応答しません。 App Storeでさえ、製品が正常に償還されたと言われますが、私のアプリはそれに応答しません。アプリ内購入のプロモーションコードを使用すると、私のアプリはそれを処理しません。

あなたのアプリがプロモーションコードを処理できる場合、アプリ内購入をテストした人はいますか?解決策を共有してもよろしいですか?

私はこれを開始しました:

override func viewDidLoad() { 
    NotificationCenter.default.addObserver(self, 
     selector: #selector(applicationDidBecomeActive(notification:)), 
     name: NSNotification.Name.UIApplicationDidBecomeActive, 
     object: nil 
    ) 
} 

func applicationDidBecomeActive(notification: NSNotification){ 
    let store = IAPHealper() 

    //what needs to be put here? 
} 


extension IAPHelper: SKPaymentTransactionObserver { 

    public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
     for transaction in transactions { 
      switch (transaction.transactionState) { 
      case .purchased: 
       completeTransaction(transaction) 
       break 
      case .failed: 
       failedTransaction(transaction) 
       break 
      case .restored: 
       restoreTransaction(transaction) 
       break 
      case .deferred: 
       break 
      case .purchasing: 
       break 
      } 
     } 
    } 

    fileprivate func completeTransaction(_ transaction: SKPaymentTransaction) { 
     print("completeTransaction...") 
     deliverPurchaseNotificatioForIdentifier(transaction.payment.productIdentifier) 
     defaultQueue.finishTransaction(transaction) 
     purchaseCompletionHandler?(true, transaction) 
    } 

    fileprivate func restoreTransaction(_ transaction: SKPaymentTransaction) { 
     guard let productIdentifier = transaction.original?.payment.productIdentifier else { return } 

     print("restoreTransaction... \(productIdentifier)") 
     deliverPurchaseNotificatioForIdentifier(productIdentifier) 
     defaultQueue.finishTransaction(transaction) 
    } 

    fileprivate func failedTransaction(_ transaction: SKPaymentTransaction) { 
     print("failedTransaction...") 

     if transaction.error!._code != SKError.paymentCancelled.rawValue { 
      print("Transaction Error: \(String(describing: transaction.error?.localizedDescription))") 
      purchaseCompletionHandler?(false, transaction) 
     } 

     defaultQueue.finishTransaction(transaction) 
    } 

    fileprivate func deliverPurchaseNotificatioForIdentifier(_ identifier: String?) { 
     guard let identifier = identifier else { return } 
     purchasedProductIdentifiers.insert(identifier) 
     //NSNotificationCenter.defaultCenter().postNotificationName(IAPHelper.IAPHelperPurchaseNotification, object: identifier) 
    } 

    public func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]){ 
     print("Removed from queue.") 
     print(transactions) 
    } 
} 

感謝。

+0

この[ビデオ](https://www.youtube.com/watch?v=dwPFtwDJ7tc)をスローしてください。 – Rex

答えて

1

プロモーションコードは運用環境でのみ動作します。

実際のアプリケーションのリリースなしでIAPを確実に動作させるには、アプリケーションが「開発者が保留中」の状態(レビュー後)の状態で、プロモーションコードを使用します。 appをインストールする1つのアプリのプロモーションコードとIAPをテストするもう1つのコード。場合によっては、すべてのAppleサーバーのデータを配布するのにさらに時間がかかります(最大2日間)。 (唯一の本番環境のために働いてプロモーションコードについて)アンドリューが言うこと以外

from official devforum answer

4

あなたがメカニズムの取り扱いあなたの「アプリケーションの購入」に関する問題がある可能性がありますようです。

それはすぐに保留中の購入および作成した購入を受けるようにするには、AppDelegateに初期化されたオブジェクトを処理し、あなたの購入を持つべきである、(またはコードが償還され、この場合)

あなたは示されている例を確認した場合ここに:

https://developer.apple.com/library/content/technotes/tn2387/_index.html#//apple_ref/doc/uid/DTS40014795-CH1-BEST_PRACTICES-ADD_A_TRANSACTION_QUEUE_OBSERVER_AT_APPLICATION_LAUNCH

あなたが実際にAppleが推奨されていないものをやっています。

代わりにあなたのAppDelegate INSIDE StoreKitオブザーバを追加します。あなたが実際にタイミングのアプリ上で不足している可能性があります

class AppDelegate: UIResponder, UIApplicationDelegate { 
          .... 
    // Attach an observer to the payment queue. 
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // Attach an observer to the payment queue. 
     SKPaymentQueue.default().add(your_observer) 
     return true 
    } 

    // Called when the application is about to terminate. 
    func applicationWillTerminate(_ application: UIApplication) { 
     // Remove the observer. 
     SKPaymentQueue.default().remove(your_observer) 
    } 

    // OTHER STUFF... 

} 

このための購入を受けます。

ところで、あなたはすでに「In App Purchases」ヘルパーオブジェクト(IAPHealper)を持っています。必要なのは、AppDelegateに変数を格納させ、 "didFinishLaunchingWithOptions"メソッドの中でそのインスタンスをインスタンス化することだけです。

のような何か:

class AppDelegate: UIResponder, UIApplicationDelegate { 

    var store : IAPHealper; 
          .... 
    // Attach an observer to the payment queue. 
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     store = IAPHealper(); 

     return true 
    } 

    // OTHER STUFF... 

} 

はEDIT: https://forums.developer.apple.com/message/204476#204476

プロモ:Appleの従業員の対応によると

(スタックオーバーフロー上、ここですべての情報を維持するために)コードはプロダクションストアでのみテストできます。

ので、順番にそれらをテストするには:

  1. は、アプリのレビューのためにアプリを提出してください。
  2. App Reviewのアプリが承認されると、一般ユーザーはそれを利用できないように、いつかAppのリリース日を設定してください。
  3. アプリをインストールするには、アプリのプロモーションコードを使用してください。
  4. inアプリのプロモーションコードを使用してください。

そして最後に、開発者のポストはまた、アプリケーションが承認された後、あなたはコードが作業を開始する前に48時間を待たなければならない、と私たちに警告しています。


したがって、上記の手順を実行すると、アプリが予期したとおりに動作しなくなります。あなたが直面している問題は、アップルがあなたに「購入成功」通知を送信したときにあなたのアプリが「準備ができていない」ことです。したがって、なぜこの答えの最初の部分に記載されているガイドラインに従うべきですか。 (アプリケーションが起動するとすぐにトランザクションリスナーを初期化することについて)

+0

動作しません。ソリューションを試したことはありますか?基本的には、ソリューションはアプリ内購入のために機能しますが、プロモーションコードの償還にはうまくいきません。 – zsong

+0

これは、アプリ内のプロモーションコードが「アプリ内購入」とまったく同じであることです。しかし、彼らはあなたのアプリのロジックに従って、アプリの起動時に成功した購入通知を「受け取った」。したがって、既にhttps://forums.developer.apple.com/message/204476#204476に記載されている手順に従っていても、それでも問題が解決しない場合は、アプリがそれでは、私はApp Launchで通知を受け取るためにアプリの購入を適切に設定する方法の説明を書いたのです。 – Pochi

+0

@ zsong Appleの従業員からの返答でも同じことが言われる: "SKProductsRequestが動作した後にin_appのプロモーションコードがアクティブ化されないと、launchObjが起動時にアクティブであることが確認されます。 – Pochi

関連する問題