iOS应用内购买 + 今日扩展小部件

16
我有一个应用程序需要订阅(通过IAP),并提供今日小部件。 在小部件内(以及应用程序内部),我使用RMStore检查包中的应用购买收据以获取有效的订阅信息。 在沙盒中(包括通过TestFlight安装后),它能正常工作。但是今天,该应用程序被Apple批准发布,当我测试存储版本时,主应用程序能够看到用户在应用程序收据中的购买记录,但Today Extension无法读取应用程序收据,因此找不到有效的订阅!
今天扩展和主应用程序都使用相同的代码来读取应用程序收据并查找订阅信息。 为什么主应用程序可以工作,但扩展程序却不能? 这是已知的问题吗?这是否与RMStore本身有关,而与StoreKit无关? 我是否需要进行某些巧妙/不同的处理?
我认为问题可能与收据验证有关--例如,在沙盒与App Store中的小部件捆绑标识符是否不同?
这真的很令人沮丧,因为没有办法测试任何潜在的解决方案,除非重新提交到App Store,然后在发布后进行测试,并从商店中删除它,否则我将让用户支付他们实际上没有得到的东西。

2
发布你用于读取应用程序收据的代码可能是个好主意。并不是每个人都熟悉RMStore。 - user1459524
1
如果这里有一些授权问题,我不会感到惊讶。如果我没记错的话,应用程序扩展是使用与父级不同的标识符进行代码签名,并具有单独的应用程序 ID 等等。您是否确认扩展实际上可以读取 SK 收据?除此之外,我不确定解决方法是什么,但如果您可以在应用程序中验证它,那么问题就解决了。我只看到过由苹果描述为进行应用程序扩展通信的应用组所使用的用户默认设置,因此,如果扩展确实无法使用 SK,则情况将非常糟糕。 - mszaro
1
我找不到任何关于扩展程序读取应用收据的文档,但由于在二进制文件的TestFlight部署版本中运行良好,我(错误地?)认为它是可以的。 - DanM
1个回答

11
所有收据(应用程序购买和应用内购买)都存储在应用程序包中的一个文件中。应用程序扩展位于嵌套在应用程序包中的捆绑包中 - 因此,如果它可以访问外部捆绑包中的收据文件,我会感到惊讶(但通过调用 appStoreReceiptURL 进行检查很值得)。
因此,关于收据的信息(即收据本身或处理收据的某些结果)需要通过常规方式从包含应用程序传递到扩展程序,即使用共享容器可能需要的文件协调

有什么想法为什么它可以在沙盒模式/通过TestFlight工作,但不能在应用商店中工作吗? - DanM
在TestFlight中,所有应用内购买都应该是免费的。你所说的“沙盒模式”是什么意思?你是指通过在开发者设备上运行应用程序进行正常测试吗?你尝试使用测试App Store帐户进行了测试吗?(此objc.io文章提供了很好的概述。) - roop
我指的是在这里提到的“沙盒模式”:https://developer.apple.com/library/ios/technotes/tn2259/_index.html ...也就是说,使用测试用户进行购买。无论是通过直接在XCode上构建并部署到设备上,还是通过TestFlight进行部署,都可以正常工作。 - DanM
所以你正在使用测试App Store账户(谢谢,我刚学到苹果把这称为“沙盒环境”)。我不知道为什么它在那里可以工作。您能否检查是否可以在沙盒环境中调用appStoreReceiptURL(> 仅限iOS 7)并查看是否可以读取返回的URL中的文件? - roop
是的,在沙盒环境中,我绝对可以从今天的扩展程序中读取appStoreReceiptURL和它所指向的文件。 - DanM
我不确定,但似乎这是问题的根源,并且由于某种原因,它只在实际应用商店版本中存在问题。非常奇怪。无论如何,将答案标记为正确。 - DanM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接