在iOS上使用Xamarin.InAppPurchases恢复购买

在iOS上使用Xamarin.InAppPurchases恢复购买,ios,xamarin.ios,in-app-purchase,Ios,Xamarin.ios,In App Purchase,我正在使用iOS的Xamarin.InAppPurchases插件。基本上,如果用户未登录iTunes,则对InAppPurchaseManager.RestorePreviousPurchases的调用不会触发登录提示。我查看了反汇编,发现它基本上运行了一些检查,然后调用了内部恢复购买。我把代码修改成这个。有人知道使用或不使用字符串名称标识符调用RestoreCompletedTransactions的含义吗?这样调用时,会出现提示 //Forced to call this in order

我正在使用iOS的Xamarin.InAppPurchases插件。基本上,如果用户未登录iTunes,则对InAppPurchaseManager.RestorePreviousPurchases的调用不会触发登录提示。我查看了反汇编,发现它基本上运行了一些检查,然后调用了内部恢复购买。我把代码修改成这个。有人知道使用或不使用字符串名称标识符调用RestoreCompletedTransactions的含义吗?这样调用时,会出现提示

//Forced to call this in order to trigger login
SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions();

//Redundant, but I don't know the implications of removing it 
inAppPurchaseManager.RestorePreviousPurchases();            
汤姆·格兰维尔(Tom Glanville)在这里的最高评论似乎表明他也有同样的问题


编辑--我相信这是Xamarin中的一个bug。我在这里发布了这个bug:我加入了一个解决方案,其中包括调用收据API。它似乎在所有情况下都有效。

以下是我为解决该错误而采取的解决方法

//Forced to call this in order to trigger login
//Get a receipt
var receiptRequest = new SKReceiptRefreshRequest();
receiptRequest.Init();
receiptRequest.Delegate = new ReceiptRequestDelegate(inAppManager);
receiptRequest.Start();

//Use this to trigger login
public class ReceiptRequestDelegate : SKRequestDelegate
{
    private InAppPurchaseManager inAppManager;

    public ReceiptRequestDelegate(InAppPurchaseManager iapm)
    {
        inAppManager = iapm;
    }

    public override void RequestFinished(SKRequest request)
    {
        //Now call restore purchases
        inAppManager.RestorePreviousPurchases();
    }

    public override void RequestFailed(SKRequest request, NSError error)
    {
        //Handle request failed
    }
}
至于我关于调用RestoreCompletedTransactions(带或不带applicationUsername)的含义的问题,这似乎会影响您可以存储在服务器上的事务中的一些信息。它允许您使用用户的本地用户名识别用户,因为在iTunes中,它只会将其与用户的iTunes帐户关联。你可以在这里学到更多