Xamarin iOS使用Plugin.InAppBiling插件获取base64格式购买收据方法
iOS Plugin.InAppBilling 获取receipt-data问题解答
关于verify是否等同于receipt-data的判断
该理解不正确。
你代码中通过DependencyService.Get<IInAppBillingVerifyPurchase>()获取的verify是Plugin.InAppBilling预留的、供开发者自行实现购买验证逻辑的回调接口实例,不属于插件返回的购买凭证数据。如果你没有在对应平台项目中注册该接口的实现,DependencyService.Get返回结果默认就是null,和你需要的receipt-data没有关联。
iOS平台获取base64编码receipt-data的方案
iOS的应用内购买receipt是系统级存储的凭证,不需要通过PurchaseAsync的返回值获取,购买成功后直接从应用的NSBundle中读取即可,可通过以下两种方式实现:
方式1:通过条件编译直接读取(适合MAUI项目)
在共享代码的购买成功分支添加iOS专属逻辑:
else if (purchase.State == PurchaseState.Purchased) { if (Device.RuntimePlatform == Device.iOS) { #if IOS var receiptUrl = Foundation.NSBundle.MainBundle.AppStoreReceiptUrl; if (receiptUrl != null && File.Exists(receiptUrl.Path)) { var receiptData = Foundation.NSData.FromFile(receiptUrl.Path); string receiptBase64 = receiptData.GetBase64EncodedString(Foundation.NSDataBase64EncodingOptions.None); // 此处receiptBase64即为所需的base64编码凭证 } #endif } return true; }
方式2:通过依赖服务读取(适合Xamarin.Forms项目)
- 共享项目中定义凭证读取接口
public interface IIosReceiptService { string GetBase64Receipt(); }
- iOS项目中实现接口并注册依赖
using Foundation; using System.IO; using Xamarin.Forms; // 替换为你的iOS项目实际命名空间 [assembly: Dependency(typeof(YourAppName.iOS.IosReceiptService))] namespace YourAppName.iOS { public class IosReceiptService : IIosReceiptService { public string GetBase64Receipt() { var receiptUrl = NSBundle.MainBundle.AppStoreReceiptUrl; if (receiptUrl == null || !File.Exists(receiptUrl.Path)) { // 沙箱环境首次购买无凭证时可在这里调用SKReceiptRefreshRequest刷新凭证 return string.Empty; } var receiptData = NSData.FromFile(receiptUrl.Path); return receiptData.GetBase64EncodedString(NSDataBase64EncodingOptions.None); } } }
- 购买成功后在共享代码中调用
else if (purchase.State == PurchaseState.Purchased) { if (Device.RuntimePlatform == Device.iOS) { var receiptService = DependencyService.Get<IIosReceiptService>(); string base64Receipt = receiptService?.GetBase64Receipt() ?? string.Empty; // 后续对base64Receipt进行验证等处理 } return true; }
注意事项
沙箱测试环境下如果读取到空的receipt,可调用SKReceiptRefreshRequest主动刷新系统存储的购买凭证后再读取即可。
内容的提问来源于stack exchange,提问作者장주명
相关产品推荐
相关产品推荐

