From e586db4a45a3aa555360c0e58c67f01b25fa87d0 Mon Sep 17 00:00:00 2001 From: James Montemagno Date: Tue, 1 Aug 2017 11:12:40 -0700 Subject: [PATCH] Add some additional null checks --- .../InAppBillingImplementation.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Plugin.InAppBilling.iOS/InAppBillingImplementation.cs b/src/Plugin.InAppBilling.iOS/InAppBillingImplementation.cs index 02be980..b51e27d 100644 --- a/src/Plugin.InAppBilling.iOS/InAppBillingImplementation.cs +++ b/src/Plugin.InAppBilling.iOS/InAppBillingImplementation.cs @@ -89,6 +89,8 @@ public async override Task> GetPurchasesAsync( { var purchases = await RestoreAsync(); + if (purchases == null) + return; var converted = purchases .Where(p => p != null) @@ -181,6 +183,9 @@ Task PurchaseAsync(string productId) Action handler = null; handler = new Action((tran, success) => { + if (tran?.Payment == null) + return; + // Only handle results from this request if (productId != tran.Payment.ProductIdentifier) return; @@ -349,6 +354,9 @@ public override void UpdatedTransactions(SKPaymentQueue queue, SKPaymentTransact foreach (var transaction in transactions) { + if (transaction?.TransactionState == null) + break; + Debug.WriteLine($"Updated Transaction | {transaction.ToStatusString()}"); switch (transaction.TransactionState) @@ -370,6 +378,9 @@ public override void UpdatedTransactions(SKPaymentQueue queue, SKPaymentTransact public override void RestoreCompletedTransactionsFinished(SKPaymentQueue queue) { + if (restoredTransactions == null) + return; + // This is called after all restored transactions have hit UpdatedTransactions // at this point we are done with the restore request so let's fire up the event var allTransactions = restoredTransactions.ToArray(); @@ -395,7 +406,7 @@ public override void RestoreCompletedTransactionsFinished(SKPaymentQueue queue) static class SKTransactionExtensions { public static string ToStatusString(this SKPaymentTransaction transaction) => - transaction.ToIABPurchase()?.ToString() ?? string.Empty; + transaction?.ToIABPurchase()?.ToString() ?? string.Empty; public static InAppBillingPurchase ToIABPurchase(this SKPaymentTransaction transaction) @@ -405,6 +416,7 @@ public static InAppBillingPurchase ToIABPurchase(this SKPaymentTransaction trans if (p == null) return null; + return new InAppBillingPurchase { TransactionDateUtc = NSDateToDateTimeUtc(p.TransactionDate), @@ -424,6 +436,9 @@ static DateTime NSDateToDateTimeUtc(NSDate date) public static PurchaseState GetPurchaseState(this SKPaymentTransaction transaction) { + if (transaction?.TransactionState == null) + return PurchaseState.Unknown; + switch (transaction.TransactionState) { case SKPaymentTransactionState.Restored: