Хорошо, я думаю, что научился достаточно, чтобы предоставлять полезную информацию всем, кто имеет дело с этой проблемой.
Во-первых, я понял, что Apple имеет в виду под "стилем iOS 6" и "iOS 7".стиль "квитанции.Они не относятся к версии iOS, которая создает квитанции.(Мое современное устройство iOS 12 все еще может и генерирует квитанции «стиля iOS 6».) Вместо этого они относятся к двум различным форматам квитанций, которые были введены в соответствующих версиях iOS.
Квитанции в стиле iOS 6 поступают от SKPaymentTransaction.transactionReceipt
и содержат информацию об одной конкретной транзакции.Это поле теперь устарело от Apple.
Квитанции в стиле iOS 7 поступают из пакета приложения через расположение, указанное в NSBundle.mainBundle.appStoreReceiptUrl
.Эти квитанции содержат полный манифест всех покупок, когда-либо сделанных пользователем.Срок действия чеков также не истекает - вы всегда можете отправить их в Apple для проверки (хотя, очевидно, отдельные транзакции, содержащиеся в них, могут отображаться как истекшие в ответе).Это квитанции, которые вы должны предпочесть.
Причина, по которой это важно, заключается в том, что если вы используете библиотеку Plugin.InAppBilling
, то объект InAppBillingPurchase
вы получаете от вызова чего-то вроде PurchaseAsync
содержит устаревшую квитанцию в стиле iOS 6 в своем поле PurchaseToken
.
Я до сих пор не уверен, почему он иногда присутствует, а иногда и равен нулю, но, поскольку исходный источник данных устарел, онвероятно, можно с уверенностью предположить, что это может и произойдет.Поэтому, вероятно, имеет смысл как можно скорее обрезать квитанции в стиле iOS 7.
Обратите внимание, что при вызове PurchaseAsync
, если вы указываете реализацию IInAppBillingVerifyPurchase
, ваш метод IInAppBillingVerifyPurchase.VerifyPurchase
получит более новую квитанцию iOS7 вместо этого.Однако объект InAppBillingPurchase
, возвращаемый PurchaseAsync
, по-прежнему получает квитанцию в стиле iOS 6 (если вообще что-то получает).
Лично мне нравится сам объект InAppBillingPurchase
.Имеет полезную информацию, упакованную в удобную упаковку.Поскольку я хочу сохранить сериализованные объекты InAppBillingPurchase
в очереди, чтобы можно было повторить проверку в случае проблем с нашими серверами, связью и т. Д., Я просто немедленно заменю PurchaseToken
свойство с квитанцией в стиле iOS 7, которую я вручную извлекаю из пакета.
Если вы сделаете это, убедитесь, что ваш код правильно обрабатывает слегка отличающиеся форматы квитанций iOS 6 и iOS 7.(В наших предыдущих попытках были некоторые ошибки, связанные с неправильным пониманием значения этих терминов.)
Надеюсь, это кому-то пригодится.Удачи!