swift3 - 횟수 - 앱에서 인앱 구매 프로모션 코드 소모품을 사용할 수 없음




플레이 도움말 (2)

내 앱에는 인앱 구매가 내장되어 있습니다 (이 tutorial 따랐습니다). 구매 기능이 작동합니다. 그러나 앱 스토어에서 인앱 구매 제품 중 하나의 프로모션 코드를 사용하면 앱이 이에 응답하지 않습니다. 앱 스토어에서도 제품이 성공적으로 사용되었으므로 앱이 응답하지 않습니다.

앱에서 프로모션 코드를 처리 할 수 ​​있다면 인앱 구매를 테스트 한 사람이 있습니까? 해결책을 공유해 주시겠습니까?

나는 이것으로 시작했다.

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)
    }
}

감사.


Andrew가 말한 것 (프로덕션 환경에서만 작동하는 프로모션 코드) 이외에 "App Purchases"처리 메커니즘과 관련하여 문제가있을 수 있습니다.

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

당신은 실제로 사과가 추천하지 않는 것을하고 있습니다.

대신 StoreKit 옵저버를 AppDelegate에 추가하십시오.

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"메서드 내에서 AppUelegate를 인스턴스화하기 만하면됩니다.

같은 것 :

class AppDelegate: UIResponder, UIApplicationDelegate {

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

        store = IAPHelper();

        return true
    }

    // OTHER STUFF...

}

편집 : (여기 스택 오버플로 모든 정보를 유지하려면)

Apple의 Employee 응답에 따르면 : https://forums.developer.apple.com/message/204476#204476

프로모션 코드는 프로덕션 상점에서만 테스트 할 수 있습니다.

그래서 그들을 테스트하기 위해서 :

  1. 앱 검토를 위해 앱을 제출하십시오.
  2. App Review가 앱을 승인하면 일반 사용자는 사용할 수 없도록 앞으로 앱의 출시일을 설정하십시오.
  3. 앱 프로모션 코드를 사용하여 앱 설치
  4. 인앱 프로모션 코드를 사용하십시오.

마지막으로 개발자의 게시물은 앱이 승인 된 후 코드가 작동되기 까지 48 시간기다려야 한다고 경고합니다.

따라서 위에서 설명한 단계를 수행 한 후에 앱이 예상대로 작동하지 않습니다. 그렇다면 애플이 "구매 성공"알림을 보냈을 때 "준비중"상태가 아니라는 문제가 있습니다. 따라서이 답변의 첫 번째 부분에 설명 된 지침을 따르는 이유는 무엇입니까? (앱이 시작되면 곧바로 거래 청취자 초기화에 대해)


프로모션 코드는 프로덕션 환경에서만 작동합니다.

실제 응용 프로그램 릴리스없이 IAP가 작동하도록하려면 응용 프로그램이 "개발자 릴리스 보류 중"상태 인 경우 (검토 후) 프로모션 코드를 사용하십시오. 하나의 앱 프로모션 코드는 앱을 설치하고 다른 하나는 IAP를 테스트합니다. 때로는 모든 Apple 서버의 데이터를 배포하는 데 최대 2 일이 걸릴 수 있습니다.

공식 devforum 대답