2012-07-13 12 views
15

जैसा कि बताया जा in this question और बाकी हर जगह बहाल करने के लिए कुछ भी नहीं है, एप्पल अब क्षुधा उपयोगकर्ता के लिए लेन-देन को पुर्नस्थापित करने देता खरीदारियां में के लिए एक साधन शामिल करने के लिए की आवश्यकता है।"पुनर्स्थापित लेन-देन" बटन व्यवहार जब वहाँ

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

तो चलो कहते हैं कि मैं अपने UI में कहीं न कहीं एक 'बहाल' बटन शामिल कर सकते हैं कि उपयोग किया जब कॉल:

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 

अब तक तो अच्छा। उपयोगकर्ता को अपना ऐप्पल आईडी और/या पासवर्ड संकेत दिया जाता है, और बहाली की प्रक्रिया शुरू होती है।

समस्या मैं है: यदि वहाँ बहाल करने के लिए कोई लेनदेन, AppleID के बाद संकेत अनिवार्य रूप से कुछ भी नहीं मेरे एप्लिकेशन में होता है, और है कि उपयोगकर्ता के लिए भ्रमित हो सकता है या एप्लिकेशन अनुत्तरदायी या टूट दिखने लगता है।

मैं का या कुछ और "सभी खरीद अद्यतित हैं" पंक्तियों के साथ एक चेतावनी दृश्य प्रदर्शित करने में सक्षम होना चाहते हैं।

क्या इस मामले का पता लगाने के लिए मैं अपने लेनदेन पर्यवेक्षक कोड में कुछ भी कर सकता हूं?

क्या कोई सोचता है कि यह एक खराब डिजाइन होगा, यूएक्स-वार?

+0

बेंजामिन का उत्तर आपके द्वारा पूछे जाने वाले अधिक सुरुचिपूर्ण समाधान प्रदान करता है। क्या आप अपना उत्तर स्वीकार किए गए उत्तर के रूप में चिह्नित कर सकते हैं ताकि सभी को ढूंढने के लिए यह शीर्ष पर आ जाए? – Timo

+0

हाय @ निकोलस मिआरी, आपने अपनी समस्या को – Ranjit

उत्तर

9

आप निम्न प्रतिनिधि कार्यों को लागू कर सकते हैं:

-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 

तो फिर तुम या पता है जब बहाल की प्रक्रिया समाप्त हो गया था कि इसे विफल होने पर। आप भुगतान में queue.transactions.count के उपयोग में मिश्रण कर सकते हैं QueueRestoreCompletedTransactions यह देखने के लिए कि कोई लेनदेन बहाल किया गया है या नहीं।

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

में SKPaymentTransactionStateRestored को संभालने के लिए याद रखें तुम भी बहाल कर लेन-देन (रों) जिस तरह से एक ही आप SKPaymentTransactionStatePurchased साथ लेन-देन (रों) किया था के रूप में संभाल कर सकते हैं।

+0

कतार नहीं होगा .transactions.count केवल लंबित लेनदेन ([लिंक] (http://developer.apple.com/library/ios/documentation/StoreKit/Reference /SKPaymentQueue_Class/Reference/Reference.html#//apple_ref/occ/instp/SKPaymentQueue/transactions))? इस मामले में, हमेशा 0 लौट रहे हैं (कोई लेनदेन समाप्त कर दिया है)? –

+1

मैं झंडा _didRestore रखता हूं कि जब मैं भुगतान प्राप्त करता हूं तो मैं सत्य पर सेट करता हूं Queue: अपडेट किया गया लेनदेन: लेनदेन के साथ कॉल करें स्टेट == SKPaymentTransactionStateRestored। फिर भुगतान में QueueRestoreCompletedTransactionsFinished: मैं उस ध्वज की जांच –

0

मैं उस ऐप में एक ही समस्या में भाग गया जो मैं अभी काम कर रहा हूं। मेरा कामकाज एक्स सेकंड टाइमर का उपयोग करना है। यह तब शुरू होता है जब आप 'पुनर्स्थापना खरीद' बटन टैप करते हैं और पुन: प्रारंभ किए गए लेनदेन ईवेंट में आने पर पुनरारंभ होता है। एक बार यह एक्स दूसरे चिह्न तक पहुंचने के बाद मेरे पास "खरीदारी पुनर्स्थापित" कहने वाला पॉपअप होता है। तो यदि आपके पास कोई लेनदेन नहीं है तो आपको केवल एक्स सेकंड का इंतजार करना होगा। उम्मीद है की वो मदद करदे।

+0

पर कैसे हल किया, हालांकि मैं इसके बारे में भी। उम्मीद कर रहा था कि एक और अधिक सुरुचिपूर्ण समाधान होगा ... –

8

मुझे खरीद बहाल करने के लिए सही/सर्वोत्तम शब्द में रुचि थी।

मैं काफी "अज्ञात त्रुटि" अलर्ट देखा है, बस -(void)paymentQueue:restoreCompletedTransactionsFailedWithError: अंदर [error localizedDescription] का उपयोग कर। (TODO: रडार भरने)

तो मैं कैसे एप्पल यह करता है पर एक नज़र ले लिया। ऐप्पल से गैर-उपभोग योग्य इन-ऐप खरीद के साथ ऐप्पल का एकमात्र ऐप अभी गैरेजबैंड (दिसंबर, 2014) है।

इसके बजाय "पुनर्स्थापित खरीद", "खरीदारी पहले पुनर्स्थापित" या ... वे "Already Purchased?" के साथ जाने की

Purchase Screen 1

लेकिन यहाँ स्क्रीन मैं में अधिक रुचि हूँ, "Already Purchased?" दबाने जब वहाँ बहाल करने के लिए कुछ भी नहीं है का परिणाम है:

Purchase Screen 2

"There are no items available to restore at this time." क्रांतिकारी नहीं है, लेकिन नरक धड़कता है "अज्ञात त्रुटि" से बाहर

तो -(void)paymentQueue:restoreCompletedTransactionsFailedWithError: पर देखें।

आईओएस:

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
{ 
    if ([error.domain isEqual:SKErrorDomain] && error.code == SKErrorPaymentCancelled) 
    { 
     return; 
    } 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"There are no items available to restore at this time.", @"") 
                message:nil 
                delegate:nil 
              cancelButtonTitle:NSLocalizedString(@"OK", @"") 
              otherButtonTitles:nil]; 
    [alert show]; 
} 

ओएस एक्स:

मैं सिर्फ messageText साथ पर ओएस एक्स एक NSAlert सिर्फ एक ही पाठ और कोई informativeText साथ खुश नहीं हूँ सिर्फ खाली लग रहा है और गलत

मेरे लिए एक विकल्प उपयोगकर्ता को यह बताना है कि उसे "To use it, you need to buy “%@”." जैसे कुछ खरीदने की ज़रूरत है।

एक और विकल्प जिसके साथ मैं आया था उन्हें ब्राउज़र को Purchase History दे रहा है। मैंने पाया कि आप सीधे itms://phobos.apple.com/purchaseHistory के साथ इसे लिंक कर सकते हैं। आईट्यून्स स्टोर में सभी ईमानदारी खरीद इतिहास में बकवास का एक टुकड़ा है, यह आपको हमेशा कुछ खोजने के लिए ले जाएगा।

लेकिन शायद यह लोगों को पुन: बीमा करने में मदद करता है कि हम उन्हें कुछ खरीदना नहीं चाहते हैं। हमेशा मान लें कि आपके ग्राहक गैर-उपभोग योग्य और उपभोग्य के बीच अंतर नहीं जानते हैं या नहीं बता सकते हैं। और यह नहीं पता कि उन्हें गैर-उपभोग्य के लिए दो बार शुल्क नहीं लिया जा सकता है। ओएस पर

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
    { 
    if ([error.domain isEqual:SKErrorDomain] && error.code == SKErrorPaymentCancelled) 
    { 
     return; 
    } 

    NSAlert *alert = nil; 
    alert = [NSAlert alertWithMessageText:NSLocalizedString(@"There are no items available to restore at this time.", @"") 
          defaultButton:NSLocalizedString(@"OK", @"") 
          alternateButton:NSLocalizedString(@"Purchase History", @"") 
           otherButton:nil 
       informativeTextWithFormat:@"You can see your purchase history in the iTunes Store."]; 
    NSModalResponse returnCode = [alert runModal]; 
    if (returnCode == NSAlertAlternateReturn) 
    { 
     NSURL *purchaseHistory = [NSURL URLWithString:@"itms://phobos.apple.com/purchaseHistory"]; 
     [[NSWorkspace sharedWorkspace] openURL:purchaseHistory]; 
    } 
} 

उदाहरण एक्स

Example on OS X

परीक्षण नोट्स (ओएस एक्स, itunesconnect सैंडबॉक्स उपयोगकर्ता):

जब उपयोगकर्ता क्लिक रद्द:

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
Error Domain=SKErrorDomain Code=2 "The payment was canceled by the user" UserInfo=0x600000470a40 {NSLocalizedDescription=The payment was canceled by the user} 

जब वहाँ है बहाल करने के लिए कुछ नहीं:

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
Error Domain=SKErrorDomain Code=0 "Unknown Error." UserInfo=0x60800007fb80 {NSLocalizedDescription=Unknown Error.} 
+0

विस्तृत उत्तर के लिए धन्यवाद। यह वास्तव में जोड़ता है। –

+1

@catlan, क्या आप वास्तव में पुनर्स्थापित देख रहे हैं पूर्णतया ट्रांस्डैक्शनफेलविथ त्रुटि जब उपयोगकर्ता पुनर्स्थापित करता है लेकिन पहले कभी खरीदारी नहीं करता है? क्योंकि सिम्युलेटर में मैं भुगतान देख रहा हूं QueueRestoreCompletedTransactions कतार में कोई लेनदेन के साथ बुलाया जाता है (यानी पुनर्स्थापित करने के लिए कुछ भी नहीं)। – jeffjv

9

यह अभी भी नवीनतम एसडीके/एक्सकोड 8 में एक मुद्दा है।0, स्विफ्ट 3 - यदि कोई उपयोगकर्ता किसी भी खरीद नहीं किया है 'बहाल' के लिए, निम्न विधि का प्रयास करता है, तो:

paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {...} 
:

SKPaymentQueue.default().restoreCompletedTransactions() 

सामान्य प्रतिनिधि विधि है कि खरीद/संभालती बहाल ट्रिगर नहीं करता

दिलचस्प बात यह है कि विधि शायद त्रुटि को पकड़ चाहिए भी नहीं कहा जाता है:

func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error){...} 

और बजाय, वैकल्पिक विधि शुरू हो रहा है, जैसे कि ठीक काम किया पुनर्स्थापना:

func paymentQueueRestoreCompletedTransactionsFinished() 

इससे ऐप को ऐसा लग रहा है कि यह कुछ भी लटक रहा/नहीं कर रहा है।

जैसा कि अन्य उत्तरों में चर्चा की गई है, इसका कारण यह है कि SKPaymentQueue में कोई लेनदेन नहीं है।

स्विफ्ट में, इस समस्या को निम्न का उपयोग करके दूर किया जा सकता:

//Optional Method. 
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) 
{ 

    let transactionCount = queue.transactions.count 

    if transactionCount == 0 
    { 
     print("No previous transactions found") 

     //You can add some method to update your UI, indicating this is the problem e.g. use notification centre: 
     NotificationCenter.default.post(name: "restoreFailedNoPrevIAP", object: nil) 

    } 

} 

महत्वपूर्ण रूप से, यदि कोई उपयोगकर्ता की खरीदारी पहले बना दिया है, लेन-देन कतार नहीं खाली हो जाएगा, इसलिए updateTransaction प्रतिनिधि विधि, बुलाया जाएगा और सामान्य रूप से बहाली अनुरोध को संसाधित करेगा।

+0

प्रतिनिधि व्यवहार एक्सकोड 8/नवीनतम एसडीके का उपयोग करके ओबीजेसी पर भी लागू होता है। लेनदेन गिनती वर्कअराउंड की एक ही जांच। – drshock

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