问题描述
我有一个供我公司使用的 Android 应用(用 Kotlin 编写),我们目前正在向该应用添加应用内结算,以符合新规则。我们还有一个使用相同数据的 iOS 和 Web 应用程序,因此我们需要在后端验证所有购买,以检查所有三个平台。我在实施 Google Play 结算库时遇到了一些有趣的事情,但我似乎无法弄清楚到底发生了什么。
正如我刚刚提到的,我们必须将所有购买发送到我们的服务器以验证购买并更新同步数据库。我正在使用 Retrofit、两个用于表示请求和响应的自定义数据类以及 Gson 转换器来执行此操作。 recommended structure 如下:
fun handlePurchase(purchase: Purchase) {
if (purchase.purchaseState === PurchaseState.PURCHASED) {
if (!purchase.isAckNowledged) {
// Retrofit call in the viewmodel
}
}
}
当我查看 reference documentation 时,Purchase.PurchaseState 被列为注释。我以前从未见过在比较语句中使用的注释,而 purchase.purchaseState 实际上返回一个 int。在Android Studio中查看反编译的class文件时,收到如下Java代码:
@Retention(RetentionPolicy.soURCE)
public @interface PurchaseState {
int UNSPECIFIED_STATE = 0;
int PURCHASED = 1;
int PENDING = 2;
}
进行一些挖掘使我找到了 Typedef annotations。这对我来说是新的,所以我尝试玩弄我们的自定义响应类,看看我是否可以让注释以与 Purchase.PurchaseState 相同的方式工作,即我可以在比较语句中使用它来显示正确的消息一旦我收到服务器的响应:
viewmodel.response.observe(this,{
Log.i(TAG,"Acked: ${it.ackNowledged}. Code: ${it.responseCode}")
if(it.responseCode == AckNowledgementResponse.ResponseCode.OK) {
Log.i(TAG,"Success")
}
})
我能得到的最接近的是以下定义,它允许我访问内部注释但不提供对值的访问:
data class AckNowledgementResponse(val ackNowledged: Boolean,@ResponseCode val responseCode: Int) {
@Retention(AnnotationRetention.soURCE)
@IntDef(OK,ALREADY_EXISTS,INVALID_PURCHASE,INVALID_TOKEN,ACKNowLEDGEMENT_ERROR)
annotation class ResponseCode
companion object {
const val OK = 1;
const val ALREADY_EXISTS = 2;
const val INVALID_PURCHASE = 3;
const val INVALID_TOKEN = 4;
const val ACKNowLEDGEMENT_ERROR = 5;
}
}
我目前的假设是问题源于注释、常量或两者的错误放置。任何指导和/或建议都会有所帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)