2012-06-20 9 views
12

ऐप्पल ने दुर्भाग्य से पुनर्स्थापित बटन नहीं होने के कारण मेरे ऐप को खारिज कर दिया है। मैं उपयोगकर्ता के लिए एक सहज अनुभव करना चाहता था लेकिन कुछ समस्याएं हैं।आईओएस गैर-उपभोग्य इन-ऐप खरीद के लिए पुनर्स्थापित बटन

- (void)purchaseProUpgrade 
{ 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

    // User is prompted for iTunes username and password here (1) 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

// Then this delegate Function Will be fired 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    if(queue.transactions.count == 0) { 

     [self setUpgradeProductId]; 

     // User is prompted for iTunes username and password here (2) 
     SKPayment *payment = [SKPayment paymentWithProductIdentifier:kInAppPurchaseProUpgradeProductId]; 
     [[SKPaymentQueue defaultQueue] addPayment:payment];                 

    }else { 

     [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:NULL]; 
    } 
    } 

क्या ऊपर एक अच्छा समाधान है? तर्क होगा:

  1. उपयोगकर्ता ऐप-ऐप खरीद को हटाने के लिए बटन दबाता है।
  2. चेक ही उपयोगकर्ता पहले से एक खरीद (उपयोगकर्ता उपयोगकर्ता नाम और पासवर्ड दर्ज करने के लिए है) बना दिया है
  3. उपयोगकर्ता पहले से ही कोई खरीदारी नहीं की गई है, तो
  4. बहाल उपयोगकर्ता पहले से ही एक खरीद नहीं किया हो, तो भुगतान के लिए संकेत (उपयोगकर्ता फिर से पासवर्ड दर्ज करना है)।

इस दृष्टिकोण के साथ समस्याओं कर रहे हैं: 1. एक अतिरिक्त सर्वर कॉल 2. प्रयोक्ता विवरण दो बार प्रवेश किया है।

क्या किसी ने वास्तव में एक पुनर्स्थापित बटन लागू किया है जिसे वे प्रदर्शित कर सकते हैं?

+0

उपयोगकर्ता के लिए इन-ऐप खरीदारी को हटाने के लिए आपके पास बटन क्यों होगा? एक ऐप अनइंस्टॉल ऐसा करेगा। उपयोगकर्ता नाम और पासवर्ड को मजबूर करने के साथ आप अपना चरण # 2 कैसे करेंगे? – whatchamacallit

+0

मुझे कैसे पता चलेगा कि पुनर्स्थापित बटन प्रदर्शित करना है या नहीं? यही है, मेरा कोड यह नहीं जानता कि वे पहले ही खरीदारी कर चुके हैं या नहीं। या यह करता है? –

उत्तर

11

अपने खुद के तर्क को लागू करने की कोई ज़रूरत नहीं बस को लागू इस

- (IBAction)restorePreviousTransaction:(id)sender { 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

यह इस पद्धति

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    case SKPaymentTransactionStateRestored: 
       if ([self respondsToSelector:@selector(restoreTransaction:)]) { 
        [self restoreTransaction:transaction]; 
        return;     
} 

यह लेन-देन की सफलता या विफलता

- (void)restoreTransaction:(SKPaymentTransaction *)transaction 
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
के लिए इन प्रतिनिधि तरीकों कॉल करेंगे कॉल करेंगे
+0

मुझे किसी समस्या के साथ सामना करना पड़ा। जब मैं पुनर्स्थापना बटन दबाता हूं और ऐपस्टोर आईडी का उपयोग करता हूं जिसके द्वारा कोई भी ऐप-ऐप खरीद नहीं की जाती है तो इस मामले में - (शून्य) भुगतान क्यूयू: (एसकेपेमेंट क्यूयू *) कतार पुनर्स्थापित अपूर्ण ट्रांस्पेक्शनफेलविथ त्रुटि: (एनएसईआरआर * * त्रुटि नहीं कहा जाता है। क्या यह सामान्य है या कुछ गलत है? – Tornado

+1

हां इसका सामान्य है। इसके बजाए यह ** - (शून्य) भुगतान क्यूईयूरेस्टोर कॉम्प्लेटेड ट्रांस्सेक्शन कॉल किया जाएगा: (SKPaymentQueue *) कतार ** 'SKPaymentQueue' यानी क्यू में 0 के साथ। – Sumanth

+0

आपको क्यूई मान 0 की जांच करने की आवश्यकता है या – Sumanth

7

इस कोड को उस पेज पर जोड़ें जहां आपने पुनर्स्थापित किया था बटन:

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error { 
    NSLog(@"%@",error); 
} 

// Call This Function 
- (void) checkPurchasedItems 
{ 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

//Then this delegate Function Will be fired 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    purchasedItemIDs = [[NSMutableArray alloc] init]; 
    NSLog(@"received restored transactions: %i", queue.transactions.count); 

    for (SKPaymentTransaction *transaction in queue.transactions) 
    { 
     NSString *productID = transaction.payment.productIdentifier; 

     [purchasedItemIDs addObject:productID]; 

     NSLog(@"%@",purchasedItemIDs); 
    } 
} 
0

ऐप्पल ऐप खरीद के साथ एप्लिकेशन को अस्वीकार करता है, जिसमें पुनर्स्थापना खरीद बटन नहीं है। ऐप व्यू में, एक पुनर्स्थापित बटन जोड़ें।

- (void)restoreCompletedTransactions { 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

अब बटन पर क्लिक कार्रवाई से इस विधि कॉल और यह पिछले खरीद बहाल होगा: तो अनुप्रयोग में खरीद सहायक कक्षा में, निम्न विधि जोड़ें।

0
*- (IBAction)restorePreviousTransaction:(id)sender { 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 
delegate method call: 
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    case SKPaymentTransactionStateRestored: 
       if ([self respondsToSelector:@selector(restoreTransaction:)]) { 
        [self restoreTransaction:transaction]; 
        return;     
} 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    purchasedItemIDs = [[NSMutableArray alloc] init]; 
    NSLog(@"received restored transactions: %i", queue.transactions.count); 
    for (SKPaymentTransaction *transaction in queue.transactions) 
    { 
     NSString *productID = transaction.payment.productIdentifier; 
     [purchasedItemIDs addObject:productID]; 
     NSLog(@"%@",purchasedItemIDs); 
    } 
}* 
संबंधित मुद्दे