为什么我们的用户可以在 Play 商店上重新订阅,尽管在 Google Play 控制台上选择退出?
我们正在 Android 应用程序上实现订阅。我们已将“重新订阅”选项选择为“未启用”。
然而,当我们通过取消订阅并等到上一个订阅过期后进行测试时,用户可以选择在一段时间内直接从 Play 商店而不是应用程序重新订阅(“应用程序外”)购买”),然后他们以前的订阅完全消失。
当发生这种情况时,我们的 BE 会收到通知,但没有任何有关用户身份的信息,因为这是一次全新的购买,因此我们的 BE 不知道哪个用户有权重新订阅计划。
我要指出的是,我们不想依靠我们的移动应用程序来拦截此购买并更新我们的后端 - 因为订阅也会影响我们网站上的权利,并且我们不确定我们的应用程序下次何时启动。
这个“重新订阅”选项已在我们的 Google Play 开发控制台上被禁用,并且它似乎在约 1-3 小时后消失(在测试环境中),但在这段时间内,我们无法阻止用户“重新订阅”在 Play 商店中订阅”
android android-billing android-developer-api google-developers-console
尝试将我的应用程序更新为androidX依赖项。按照此处的说明进行操作,编译失败。错误来自JetifyTransform任务无法处理某个 .JAR 依赖项(仅供参考 -三星 Spass SDK):
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:kaptGenerateStubsStandardNo_vendorDebugKotlin'.
> Could not resolve all artifacts for configuration ':app:standardNo_vendorDebugCompileClasspath'.
> Failed to transform file 'pass-v1.2.2.jar' to match attributes {artifactType=processed-jar} using transform JetifyTransform
> Failed to transform '/Users/hanandann/StudioProjects/ArnakPaymentsAndroid/Payments/app/libs/pass-v1.2.2.jar' using Jetifier. Reason: null. (Run with --stacktrace for more details.)
> Failed to transform file 'pass-v1.2.2.jar' to match attributes {artifactType=processed-jar} using transform JetifyTransform
> …Run Code Online (Sandbox Code Playgroud) Our crash reporting system is logging crashes of this type:
Caused by java.lang.RuntimeException: Parcel android.os.Parcel@8bf0d1f: Unmarshalling unknown type code 6881391 at offset 356
at android.os.Parcel.readValue(Parcel.java:2779)
at android.os.Parcel.readSparseArrayInternal(Parcel.java:3148)
at android.os.Parcel.readSparseArray(Parcel.java:2362)
at android.os.Parcel.readValue(Parcel.java:2757)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3067)
at android.os.BaseBundle.unparcel(BaseBundle.java:257)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:958)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1329)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3244)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:3194)
at android.support.v4.app.Fragment.restoreChildFragmentState(Fragment.java:1444)
at android.support.v4.app.Fragment.onCreate(Fragment.java:1415)
at com.payments.base.BaseFragment.onCreate(BaseFragment.java:68)
at com.payments.app.fragments.TopLevelFragment.onCreate(TopLevelFragment.java:422)
at android.support.v4.app.Fragment.performCreate(Fragment.java:2331)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1386)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3244)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:3194)
at android.support.v4.app.Fragment.restoreChildFragmentState(Fragment.java:1444)
at android.support.v4.app.Fragment.onCreate(Fragment.java:1415)
Run Code Online (Sandbox Code Playgroud)
What I know: This occurs when app is restored …
我使用Kotlin data classes和GSON来反序列化 JSON 模式,并实现默认值以防止 JSON 中出现空对象。另外,JSON int 枚举使用@SerializedName注释映射到 Kotlin 枚举值:
data class Person(@SerializedName("name")
val name: String = ",
@SerializedName("age")
val age: Int = 0,
@SerializedName("hairColor")
val hairColor: Color = Color.NONE)
enum class Color{
@SerializedName("1")
BROWN,
@SerializedName("2")
BLONDE,
NONE
}
Run Code Online (Sandbox Code Playgroud)
专注于枚举反序列化 - 这对于字段与已知枚举匹配或 JSON 中完全不存在该字段的情况非常有效,在这种情况下将实现默认枚举。
但是 - 如果 JSON 中接收到的枚举未映射到我的 kotlin 枚举中的已知枚举值 - 生成的反序列化枚举将为 null!
{"name":"Joe","age":10,"hairColor":1} ->
Person(name=Joe, age=10, hairColor=BROWN)
{"name":"Jim"} ->
Person(name=Jim, age=0, hairColor=NONE)
{"name":"Jeff", "age":8,"hairColor":3) ->
Person(name=Jane, age=8, hairColor=null)
Run Code Online (Sandbox Code Playgroud)
Gson …
我们正在构建一个使用HighCharts Android包装库*的应用程序。在开发过程中,应用程序通过运行命令安装在设备/模拟器上,一切正常。
但是,在创建构建视图Make Project、Generate Signed APK或由CI/DC Pipelines生成的构建时- 应用程序总是崩溃。
Highcharts调用时在某处发生崩溃Gson(需要在Gradle构建文件中作为依赖项在外部提供)。Gson然后抛出java.lang.ArrayIndexOutOfBoundsException异常。(下面的堆栈跟踪)
Proguard相关(我认为) - 也发生在debug构建中,并且keep为了安全起见,还添加了激进的声明。Highcharts Android尚不兼容Hilt DI,它深深嵌入我们的代码中。显然,Highcharst期望Context提供给它的View构造函数的Activity类型是类型,Hilt因为 in 将 aFragmentContextWrapper注入到Fragments带有@AndroidEntryPoint.
此处的说明和解决方法
.APK在 …android highcharts android-build android-highcharts dagger-hilt
android ×5
androidx ×1
dagger-hilt ×1
enums ×1
gson ×1
highcharts ×1
json ×1
kotlin ×1
parcelable ×1