- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序包含 1000 个不同的项目。所有这些都是已安装包的一部分(安装完成后无需加载它们)。项目被一项一项地显示。前 50 件元素免费。仅当用户购买了非消耗性应用内产品时,其余部分才可用。
当我的应用程序启动时,如果购买了产品,它会在钥匙串(keychain)中查找(这是我存储此信息的位置)。如果YES
,则应用程序内支付屏幕永远不会显示,并且所有功能均完全可用。 (我将此称为“案例 0”以供进一步引用)。
如果钥匙串(keychain)不包含此信息,这可能意味着以下两种情况之一:
案例1
用户没有为产品付费(无论是在此设备上还是在任何其他设备上)。在这种情况下,我必须在第 50 个项目之后显示 InApp-Payment 屏幕,用户可以决定是否要为额外的 950 个项目付费,或者是否有足够的 50 个免费项目。
案例2
用户确实已经购买了该产品(在其他设备上或在重置之前在此设备上购买,或者......)。在这种情况下,我将通过调用 [[SKPaymentQueue defaultQueue] RestoreCompletedTransactions]
接收之前购买的产品的产品 ID。当我收到它时,productID 将存储在钥匙串(keychain)中,从现在开始,应用程序的行为应该与情况 0 完全相同。这意味着:当用户到达第 50 项时,他不应该注意到有什么特别的。他可以继续使用该应用程序并观看第 51 项以及此后的所有其他项目。决不应该显示应用内支付屏幕,并且必须向用户授予对所有项目的完全访问权限。
据我所知,只有一种方法可以区分情况 1 和情况 2。找出这两种情况中哪种情况属实的唯一方法是在 before< 之前调用 restoreCompletedTransactions
/em> 到达第 50 项。如果调用返回我的产品 ID,则为情况 2,否则为情况 1。我必须在用户到达第 50 项之前进行此调用,因为如果情况 2 为 true,则不得显示付款对话框。
但是 - 我的问题来了 - 当应用程序调用 restoreCompletedTransactions
时,系统将提示用户输入其 Apple-ID 的密码。但用户看不到任何提示的原因,因为 – 取决于我绑定(bind)此调用的项目 – 他要么刚刚启动了应用程序,要么他只是在观看项目 #49(与 48 相比,这没什么特别的)之前的项目)或者他正在观看 #49 之前的项目之一。
现在想象一下一个不愿意付费的用户。也许他甚至已经停用了他设备的应用内支付。但每次他使用该应用程序并进入特定项目(假设这是非常不起眼的项目#37)时,系统都会提示他输入密码。如果我是这个用户,我会认为该应用程序有错误,或者它甚至想窃取我的密码!
那么,您有什么想法如何在不疏远用户的情况下处理这个用例吗?
顺便说一句
仅当 [SKPaymentQueue canMakePayments]
为 YES
时才调用 restoreCompletedTransactions
是一个坏主意。如果我这样做,以前(可能在其他设备上)购买过该产品并且现在在此设备上设置了 InApp-Payment = OFF
的用户将没有机会使用其已付款的产品。如果用户设置了 InApp-Payment = ON
最佳答案
从用户的角度来看,我认为您假设在没有用户首先初始化请求的情况下永远不会创建密码提示是正确的。在这种情况下,我认为最好在应用内支付屏幕中添加一个按钮,或者在它旁边的按钮旁边添加一个按钮,该按钮会转到要求用户恢复交易的屏幕。
我认为,在发生情况 2 的任何情况下,用户都会理解为什么他们之前购买的应用内购买内容没有显示。
但我认为如果您将购买的值存储在钥匙串(keychain)中并且同步到 iCloud,则他们的所有设备都会看到它,并且当您删除应用程序时钥匙串(keychain)值不会被删除,您可能也永远不会遇到情况 2 (据我所知)。
关于ios - 应用内支付 : unclear use-case (restoreCompletedTransactions),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19726887/
这个问题已经有答案了: Difference between object and instance (15 个回答) What exactly is an instance in Java? (12
每次使用我的 HTTP Firebase 云函数运行时,我都会收到此错误: 函数执行花了 ****ms,完成状态:“连接错误” 它的发生不一致,但我无法完全缩小问题的范围。我不相信错误出现在我的应用程
我尝试理解文档部分 Providing Attached Objects for Data Annotations ,或者特别是它的例子。 如果我的步骤正确,它会像这样工作: 创建一个类型 (Mess
任何人都可以用实现细节解释数据压缩的算术编码吗?我浏览了互联网并找到了 mark nelson 的帖子,但在尝试了很多小时后,我确实不清楚实现的技术。 Mark nelson对算术编码的解释可以在 h
在两个 vnet 之间创建对等互连时,您可以在 bicep 或 arm 中指定名为“remoteAddressSpace”的属性,但不能通过门户指定。该属性保存网络前缀数组。我假设这些前缀是远程 vn
我试图理解org.jdesktop.swingx.BackgroundWorker的机制。他们的javadoc提供以下示例: final JLabel label; class MeaningOfLi
我的应用程序的描述 我的应用程序包含 1000 个不同的项目。所有这些都是已安装包的一部分(安装完成后无需加载它们)。项目被一项一项地显示。前 50 件元素免费。仅当用户购买了非消耗性应用内产品时,其
我的views.py: class user_password(generics.UpdateAPIView): authentication_classes = ([JSONWebToken
“canonize”函数(下面给出,来自 Ukkonen 的论文)是如何工作的,特别是 while 循环何时结束?我认为 p' - k' 的值将始终小于 p - k 的值。我是对还是错? proced
有没有超过ast documentation的关于 ast 模块? 特别是,我想知道 expr_context(及其所有可能的值)到底是什么意思。 还有,Assign 和 AugAssign 有什么区
我正在尝试从 mp4 视频中拍摄快照。 这是我通过 PHP 使用的代码: exec("ffmpeg -ss 00:00:03 -i 1419856237575730484.mp4 -y -an -f
documentation for asyncio.gather说 If return_exceptions is False (default), the first raised exceptio
这个问题已经有答案了: How to find which promises are unhandled in Node.js UnhandledPromiseRejectionWarning? (5
ukkonen's on line construction algorithm 我在尝试理解“测试和拆分”过程时遇到了问题,具体如下:程序 test–and–split(s, (k, p), t):
在使用 pickle.load(...) 时,可能会出现 AttributeError: can't set attribute。但是,对于更大的 pickle 文件,此错误根本没有帮助(因为我不知道
我无法找到一个非常具体的问题的明确答案,即使在阅读了几个手册页和指南之后也是如此。我为标题中提到的工具链编写链接描述文件。在开发过程中,我试图将静态库(已存档,.a)链接到我的 RAM 中的某个位置。
我的代码正在运行,但我收到了来自 Intelij 的警告(代码突出显示):不清楚是否需要可变参数或非可变参数调用。但代码确实完善了我想要的或我期望的,用值填充组合。当我单击组合中的项目时,它会返回正确
我尝试使用我的应用程序,其中包含 Android Backup Service 的用法在 Android Emulator 上使用我自己的 BackupAgent。但是备份不起作用,尽管在 And
Netty 库(用Java 编写)在 channel 接口(interface)中定义了如下write 方法: ChannelFuture write(Object message) 但是,Javad
恕我直言,Rhino Mocks 在使用 AssertWasCalled 时会产生一条不清楚的诊断消息,以验证是否已使用特定参数调用方法。 例子: interface ISomeInterface {
我是一名优秀的程序员,十分优秀!