2011-05-19 11 views
6

को साफ़ नहीं करेगा मेरे ऐप में इनपैड क्रय सेटअप है। हालांकि मुझे कुछ अजीब व्यवहार है। प्रत्येक बार जब मैं ऐप शुरू करता हूं तो मैंआईफोन इनएप खरीद कतार

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

प्रारंभिक पर्यवेक्षक को सेट करने के लिए कॉल करता है। हालांकि यह तुरंत

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 

प्रत्येक लेनदेन की पूरी श्रृंखला के साथ ट्रिगर करता है। मैं सिर्फ

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
इन लेन-देन तो फिर एप्लिकेशन को पुन: प्रारंभ लेकिन paymentQueue अभी भी जैसे ही मैंने addTransactionObserver फोन को गति प्रदान कर रहा है में से प्रत्येक पर

बुला की कोशिश की है। मेरा मुख्य लक्ष्य अभी लेनदेन कतार को फ्लश करना और साफ़ करना है। मुझे नहीं पता कि मैं इस राज्य में कैसे पहुंचा, न ही इससे कैसे बाहर निकलना है।

उत्तर

5

यकीन है कि आप इस विधि को लागू किया है बनाओ:

-(void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions; 
+1

सुझाव कर सके क्या एक अच्छा अभ्यास कार्यान्वयन हो सकता है? –

+0

@ZivLevy मैं सिर्फ 'लेनदेन' में सभी लेनदेन लॉग करता हूं इसलिए मैंने खुद को बताया कि उन्हें हटा दिया गया था। – DDPWNAGE

3

कतार फ्लश करने के लिए इस कहीं रखो (संभवतः अपनी लोड विधि है, लेकिन अपने अंतिम अनुप्रयोग में इसे हटाने):

for (SKPaymentTransaction* transaction in [[SKPaymentQueue defaultQueue] transactions]) { 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 

जब finishTransaction कहा जाता है, पर्यवेक्षक की removeTransaction विधि प्रत्येक को स्थानांतरित होने पर विधि कहा जाएगा।

मेरे पास मेरी कतार में 30 थी और मुझे उस विधि में 30 कॉल प्राप्त हुए।

+1

SKTransaction के बजाय SKPaymentTransaction का उपयोग करना है + दूसरी पंक्ति में अर्धविराम गुम है। – Rilakkuma

+1

@Rilakkuma मैं इसे ठीक करने के लिए संपादित करूंगा – DDPWNAGE

1

आपको यह सुनिश्चित करना होगा कि जब भी आप खरीदारी करते हैं या आप उत्पाद को पुनर्स्थापित करते हैं तो आप लेनदेन खत्म करते हैं। यदि आप इस समस्या में भाग लेते हैं, तो आपको अपनी कतार साफ करनी चाहिए और फिर तर्क को उचित रूप से विकसित करना चाहिए। स्विफ्ट 3 में इस तरह कुछ चलाने से एक त्वरित साफ किया जा सकता है (जो पिछले उत्तर के समान है)। लेकिन यह आपके असली ऐप में नहीं होना चाहिए।

func cleanUp() { 

    for transaction in SKPaymentQueue.default().transactions { 

     SKPaymentQueue.default().finishTransaction(transaction) 
    } 
} 

इसके अलावा, आप जोड़ सकते हैं और AppDelegate में अपने पर्यवेक्षक को दूर करने के लिए है। समस्याएं से बचने के लिए यह सिफारिश और सर्वोत्तम है।

0

SKPaymentTransactionObserver:PaymentQueue.. कॉल से:

SKPaymentQueue.default().finishTransaction(transaction) 

ध्यान दें कि आप सभी प्रकार के लिए फोन नहीं कर सकते हैं। .purchasing के लिए finishTransaction पर कॉल करने से त्रुटि के साथ क्रैश हो जाएगा। इसलिए सभी लेनदेन के माध्यम से for एक पूर्ण समाधान नहीं है।

जब आप .purchasing के लिए finishTransaction कॉल करें:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot finish a purchasing transaction' 
0

मैं आपकी समस्या iTunes कनेक्ट में सैंडबॉक्स उपयोगकर्ता खाते के साथ क्या करना है लगता है।
https://support.magplus.com/hc/en-us/articles/203809008-iOS-How-to-Test-In-App-Purchases-in-Your-App

आप सैंडबॉक्स उपयोगकर्ता है:: आप किसी भी सैंडबॉक्स उपयोगकर्ताओं की जरूरत नहीं है, तो इस गाइड वास्तव में सहायक उन्हें हो रही सेटअप था

आप तथापि finishTransaction: कॉल करके देख सकते हैं, तो आप सुनिश्चित करने की आवश्यकता SKPaymentTransactionState लेनदेन का स्वीकार्य है।

प्रलेखन प्रति finishTransaction पर:

for transaction in SKPaymentQueue.default().transactions { 
    guard 
     transaction.transactionState != .purchasing, 
     transaction.transactionState != .deferred 
    else { 
     //Optionally provide user feedback for pending or processing transactions 
     return 
    } 

    //Transaction can now be safely finished 
    SKPaymentQueue.default().finishTransaction(transaction) 
} 

.purchasing और .deferred पर प्रलेखन काफी अस्पष्ट है:

case purchasing // Transaction is being added to the server queue. 

case deferred // The transaction is in the queue, but its final status is pending external action. 

क्या से

// Asynchronous. 
// Remove a finished (i.e. failed or completed) transaction from the queue. 
// Attempting to finish a purchasing transaction will throw an exception. 

तो सुरक्षित रूप से लेन-देन को दूर करने के मैं समझता हूं, हैंडलिंग लंबित और/या प्रसंस्करण लेनदेन काफी निष्क्रिय होना चाहिए। ऐप ने जो कुछ भी जरूरी है वह किया है और आईट्यून्स स्टोर सर्वर, या कुछ अन्य निर्भरता (यानी भुगतान प्राधिकरण) से प्रतिक्रिया पर इंतजार कर रहा है। लेनदेन अपडेट होने पर

paymentQueue: updatedTransactions: कतार के SKPaymentTransactionObserver पर कॉल किया जाएगा।

जहां तक ​​आपकी लेनदेन कतार लिम्बो में फंस गई है, मैं शर्त लगाता हूं कि आपकी कतार में सभी लेनदेन राज्य .purchasing में हैं। यह आईट्यून्स कनेक्ट/सैंडबॉक्स उपयोगकर्ताओं/उत्पादन आईट्यून्स खातों के भीतर सबसे अधिक संभावना है। दूसरों सहित, मेरे पास भी इस मुद्दे का सामना करना पड़ा है। इसके लिए दायर एक बग रिपोर्ट है। अपने सैंडबॉक्स उपयोगकर्ता के पासवर्ड को दोबारा बदलने/बदलने का प्रयास करें, या परीक्षण के लिए एक नया सैंडबॉक्स उपयोगकर्ता बनाएं।

अधिक यहाँ जानकारी: https://forums.developer.apple.com/thread/70418

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