2017-06-02 23 views
13

संभाल नहीं करता है। मेरे ऐप में इन-एप खरीद है (मैंने 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) 
    } 
} 

धन्यवाद।

+0

कृपया इस [वीडियो] को फेंक दें (https://www.youtube.com/watch?v=dwPFtwDJ7tc) इससे आपको बहुत मदद मिलेगी। – Rex

उत्तर

1

प्रोमो कोड केवल उत्पादन वातावरण में काम करते हैं।

यदि आप सुनिश्चित करना चाहते हैं कि आईएपी वास्तविक एप्लिकेशन रिलीज के बिना काम करते हैं तो एप्लिकेशन "लंबित डेवलपर रिलीज" स्थिति (समीक्षा के बाद) में प्रोमो कोड का उपयोग करें। आईएपी का परीक्षण करने के लिए ऐप इंस्टॉल करने के लिए एक ऐप प्रोमो कोड। कभी-कभी सभी ऐप्पल सर्वरों के लिए डेटा वितरित करने में अतिरिक्त समय (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

तुम वास्तव में कर रहे हैं क्या सेब की सिफारिश नहीं है।

इसके बजाय अपने AppDelegate अंदर 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... 

} 

आप वास्तव में अपने अनुप्रयोग समय पर अनुपलब्ध हो सकता है इस वजह से खरीद प्राप्त करता है।

वैसे, आपके पास पहले से ही "ऐप खरीद" सहायक ऑब्जेक्ट (IAPHealper) है। आपको बस इतना करना है कि, अपने ऐपडिलेगेट को एक वैरिएबल स्टोर करें, और इसे "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... 

} 

संपादित करें: https://forums.developer.apple.com/message/204476#204476

प्रोमो: एक एप्पल कर्मचारी प्रतिक्रिया के अनुसार

(ढेर अतिप्रवाह पर सभी जानकारी यहाँ रखने के लिए) कोड केवल उत्पादन स्टोर में परीक्षण किया जा सकता है।

तो, क्रम में उन्हें परीक्षण करने के लिए:

  1. अनुप्रयोग समीक्षा के लिए अपना एप्लिकेशन को जमा करें।
  2. भविष्य में कभी-कभी ऐप की रिलीज़ तिथि सेट करें ताकि एक बार ऐप समीक्षा ऐप को मंजूरी दे, तो यह सामान्य उपयोगकर्ता के लिए उपलब्ध नहीं है।
  3. ऐप
  4. इंस्टॉल करने के लिए ऐप प्रोमो कोड का उपयोग करें ऐप प्रोमो कोड का उपयोग करें।

और अंत में, डेवलपर के पद भी हमें चेतावनी देते हैं कि, के बाद एक अनुप्रयोग अनुमोदित किया गया है आप 48 घंटे प्रतीक्षा करने के लिए इससे पहले कि कोड काम शुरू।


तो यदि ऊपर वर्णित चरणों का पालन करने के बाद, आपका ऐप अपेक्षित व्यवहार नहीं कर रहा है। तब आप जिस समस्या का सामना कर रहे हैं वह है कि आपका ऐप "तैयार" नहीं हो रहा है जब सेब आपको "खरीदारी सफल" अधिसूचना भेजता है। इसलिए आपको इस उत्तर के पहले भाग पर वर्णित दिशानिर्देश का पालन क्यों करना चाहिए। (जैसे ही आपका ऐप लॉन्च हो जाता है, अपने लेनदेन श्रोता को प्रारंभ करने के बारे में)

+0

काम नहीं करता है। क्या आपने कभी अपना समाधान करने की कोशिश की है? मूल रूप से यह बात इन-एप खरीद के लिए समाधान काम करती है लेकिन यह प्रोमो कोड रिडेम्प्शन के लिए काम नहीं करती है। – zsong

+0

बात यह है कि, इन-ऐप प्रोमो कोड बिल्कुल "इन-ऐप खरीदारी" के समान होते हैं। हालांकि वे ऐप लॉन्च पर सफल खरीद अधिसूचना प्राप्त करने के आपके ऐप के तर्क का पालन करते हैं। तो यदि आप यहां दिए गए चरणों का पालन कर चुके हैं: https://forums.developer.apple.com/message/204476#204476 और यह अभी भी काम नहीं करता है इसका मतलब है कि "सफल" खरीद अधिसूचना खो रही है क्योंकि आपका ऐप है इसे प्राप्त होने तक "तैयार नहीं", इसलिए मैंने ऐप लॉन्च पर अधिसूचनाएं प्राप्त करने के लिए ऐप खरीद में उचित तरीके से कॉन्फ़िगर करने के निर्देश क्यों लिखे। – Pochi

+0

@zsong कि ऐप्पल की कर्मचारी प्रतिक्रिया एक ही बात कहती है: "यदि in_app प्रोमो कोड SKProductsRequest काम करने के बाद सक्रिय नहीं हो रहे हैं, तो मैं सत्यापित करता हूं कि लेनदेन ओब्सर्वर लॉन्च समय पर सक्रिय है।" – Pochi

संबंधित मुद्दे