2015-03-25 70 views
7

我的應用程序提供應用程序內購買非消費類型。該應用程序已登錄設施。是否有可能根據登錄用戶購買我的應用程序?有什麼方法可以知道通過哪個iTunes帳戶進行的購買? - iOS

我知道這聽起來很尷尬。讓我指定問題。

設備在iTunes商店中已有登錄用戶。那時,當我的應用首次安裝到設備上時,任何用戶都可以使用憑證登錄到我的應用。考慮一下,他做了一些購買並從應用程序註銷。現在,另一個用戶登錄到應用程序,並且無法在應用程序購買後使用之前用戶可用的設施。但是,正如您知道基於iTunes商店帳戶購買非消費品產品(每個帳戶只能購買一種非消費品)。我試圖通過以下方式..

  1. 將用戶ID存儲到iCloud,但我不知道購買的是哪個iTunes帳戶。因此,我無法顯示正確的消息「您應該使用不同的iTunes帳戶登錄才能購買」。

  2. 在Android中,通過應用內結算v3,可以將developer payload字符串與購買請求一起發送。當對該購買進行查詢時,該字符串也會返回。所以,這可以用來識別進行購買的用戶。 iOS中有類似的東西嗎?

回答

6

作爲iOS的7,SKMutablePayment具有applicationUsername屬性,可以當一個付款時來設定。並且,SKPaymentQueue具有restoreCompletedTransactionsWithApplicationUsername:方法(link)

Apple的指導是對您的服務器端用戶ID進行哈希處理,並在購買和恢復時傳遞該信息。因此,就您的情況而言,如果iTunes用戶A購買了該產品,它將被綁定到該購買者的服務器端用戶ID。然後,如果iTunes用戶B嘗試恢復,恢復將失敗,因爲它們仍然會傳遞相同的服務器端用戶ID。

您還必須跟蹤(在服務器上)您的服務器端用戶標識已購買產品。否則,如果iTunes用戶B嘗試恢復,則需要知道他們使用不同的iTunes帳戶登錄設備並且他們從未購買過的區別。當然,您還需要阻止相同的服務器端用戶在不同的iTunes帳戶下購買產品兩次。

注意事項:

  • 如果你已經在生產中進行購買,這很可能將無法正常工作。
  • iOS 7+
  • 上面提到的「已購買」場景。
+0

太棒了!爲什麼我以前不知道這個?後續評論和問題。註釋:您必須使用SKMutablePayment訪問applicationUsername(否則,該屬性爲只讀)。問題:考慮以下情況。假設Apple ID X和Apple ID Y都用於在您的應用中進行購買。並且您爲Apple ID X和Y(稱爲applicationUsername,U)使用相同的applicationUsername創建SKMutablePayments,然後使用U調用restoreCompletedTransactionsWithApplicationUsername。這將檢索使用Apple ID X和Y進行的購買嗎? – 2015-03-26 15:28:31

+0

@ChrisPrince這是關於SKMutablePayment的一個好點。我已經更新了我的答案。至於你的問題,我會想象調用'restoreCompletedTransactionsWithApplicationUsername:'只會返回當前iTunes用戶的購買。但是,您應該防止第二個iTunes用戶在第一種情況下以相同的應用程序用戶名購買。因此,這就是爲什麼你需要跟蹤你自己的服務器上的購買。 – DeepFriedTwinkie 2015-03-26 15:34:45

+0

這將如何工作?你怎麼能阻止第二個iTunes用戶在相同的應用程序用戶名下購買? – 2015-03-26 15:41:32

0

如果恢復購買成功,則該購買成功。

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions]; 


// Then this is called 
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { 
    NSLog(@"%@",queue); 
    NSLog(@"Restored Transactions are once again in Queue for purchasing %@",[queue transactions]); 

    NSMutableArray *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 (@"product id is %@" , productID); 
     // here put an if/then statement to write files based on previously purchased items 
     // example if ([productID isEqualToString: @"youruniqueproductidentifier]){write files} else { nslog sorry} 
    } 
} 
+0

恢復不是這裏的解決方案,因爲如果對於特定的iTunes帳戶恢復成功。說,一個應用程序用戶,進行購買並註銷。現在,B來了並恢復。由於iTunes帳戶尚未更改,恢復將會成功。但B還沒有購買該產品,但他喜歡這個設施。 – 2015-03-25 13:37:24

+0

應用內購買正在處理iTunes帳戶,所以我們無法阻止B享受設施。這是不可能的。 – 2015-03-25 14:00:16

+0

是的,你是對的。但是,這是要求。讓我們看看別人怎麼說。 – 2015-03-25 14:21:11

相關問題