Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在什么条件下,客户端设备上可以使用应用内计费版本3服务器更改?_Android_In App Purchase_In App Billing - Fatal编程技术网

Android 在什么条件下,客户端设备上可以使用应用内计费版本3服务器更改?

Android 在什么条件下,客户端设备上可以使用应用内计费版本3服务器更改?,android,in-app-purchase,in-app-billing,Android,In App Purchase,In App Billing,由于GooglePlay应用程序缓冲来自GooglePlay服务器的数据,并且缓冲过程没有很好的文档记录,因此应用内计费版本3的测试变得不可预测。特别是,如果在用户的一个设备上进行了购买,则在该用户拥有的另一个设备上可能无法立即看到该购买 建议应用程序在启动时检查所有购买产品的库存。但有时此检查使用的缓冲数据已经过时,原因是通过不同设备上的同一应用程序或通过Google Checkout(例如退款或取消订单)进行的更新 在什么情况下,在没有启动更新的设备上运行的Google Play应用程序上可

由于GooglePlay应用程序缓冲来自GooglePlay服务器的数据,并且缓冲过程没有很好的文档记录,因此应用内计费版本3的测试变得不可预测。特别是,如果在用户的一个设备上进行了购买,则在该用户拥有的另一个设备上可能无法立即看到该购买

建议应用程序在启动时检查所有购买产品的库存。但有时此检查使用的缓冲数据已经过时,原因是通过不同设备上的同一应用程序或通过Google Checkout(例如退款或取消订单)进行的更新

在什么情况下,在没有启动更新的设备上运行的Google Play应用程序上可以使用在Google Play服务器上购买数据的更改


具体来说,在测试过程中,如何确保使用queryInventoryAsync()检查返回的数据(TritiliteDrive示例应用程序提供的IabHelper类的一种方法)反映Google Play服务器上当前的数据,与其说是陈旧的缓冲数据?

以下是我自己的经验:使用运行在Nexus 7平板电脑上的应用程序购买商品,然后使用运行在Nexus One手机上的相同应用程序检测购买。下面描述的测试是使用以草稿模式(尚未发布)上载的应用程序的测试帐户执行的。测试帐户是在开发者控制台上为draft应用程序声明的,并且是这两个测试设备的主帐户

购买的是非消耗品。该购买是使用TritiliteDrive示例应用程序提供的IabHelper类的变体进行的。为进行购买而调用的IabHelper方法是launchPurchaseFlow()

购买完成后,当随后使用IabHelper的queryInventoryAsync()方法时,该项目被添加到返回到同一设备的已购买项目列表中

但是,同一帐户拥有的一个单独的Nexus One设备在启动时执行了对queryInventoryAsync()的调用,但没有收到使用该方法返回的采购项目清单中的采购项目

但是,如果使用Nexus One设备使用launchPurchaseFlow()启动同一项目的购买,则会返回一条消息(在用于购买的显示器前弹出的对话框中),指示该项目无法购买,因为它已经拥有。这发生在从Nexus 7开始购买后不到15分钟,表明数据在Google Play服务器上可以很快获得,但在Nexus One上无法自动获得,直到尝试从Nexus One设备重新购买该项目开始

在尝试购买已拥有的项目失败后,该项目确实出现在NexusOne上queryInventoryAsync()的后续调用中。这表明购买该物品的尝试触发了Nexus One Google Play应用程序缓冲数据与Google Play服务器上可用数据的同步。这不是由queryInventoryAsync()本身触发的

我测试了第二个场景,在这个场景中,我没有尝试从NexusOne购买已经拥有的物品,而是删除了GooglePlay应用程序中的缓存。这没有启动queryInventoryAsync()返回的数据的更新;这一数据保持不变

我测试了第三个场景,在这个场景中,我没有尝试从NexusOne购买已经拥有的物品,而是简单地关闭NexusOne,然后再次启动它。在此之后,当我运行同一个应用程序并执行queryInventoryAsync()请求时,从Nexus 7购买的物品实际上在已购买物品的返回列表中可见

我从上面得出的结论是,Google Play应用程序正试图通过缓冲本地购买并仅在特定触发发生时更新自身来减少往返Google Play服务器的次数。我已经确定了两个触发因素:1)试图购买已经拥有的物品;2)重新启动运行Google Play应用程序的设备。特别是,queryInventoryAsync()不会启动这样的更新,因此可能会返回过时的数据,如上所述


了解以上内容可以提高测试效率,减少混乱,因为它允许用户从Google Play服务器上可用的数据中故意触发缓冲数据的更新。

感谢分享您的经验。使用沙箱和测试帐户,我见证了IABv3行为的转变(来自一个有效且有意义的工具)。最初的开发看到getBuyIntent产生了一个
purchaseToken
预付款(预期交易),我集成并连接了该功能,进行了成功的测试付款,在付款后在getPurchases中看到了适当的数据。一周后,getBuyIntent产生了空的purchaseData(因此没有purchaseToken),getPurchases每次都返回相同的(过时的)数据,即使在成功购买之后(在弹出窗口中,相同的设备)。令人困惑!