Flutter Android:无法从 Google Play 获取应用内商品
Flutter Android: Unable to fetch in-app products from Google Play
我目前遇到的问题是我的 Flutter 应用程序无法从 Google Play 商店获取可消费的应用内商品。但是,我的应用程序能够从 Apple 应用程序商店获取所有产品。
我无法确定我遗漏了哪一步,或者是什么导致找不到我的所有产品 ID。我正在使用 flutter 的 in_app_purchase 模块来促进应用内购买。
对于 Android,这是我执行的设置步骤。
- 我已经设置了我的 Google Play 控制台和开发者帐户
- 已完成“设置您的应用”部分中的所有任务
- 生成了一个密钥库文件来签署我的应用程序
keytool -genkey -v -keystore c:\Users\USER_NAME\key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
- 创建了一个名为 /android/key.properties 的文件,其中包含对我的密钥库文件的引用。该文件的内容如下所示:
storePassword=<password from previous step>
keyPassword=<password from previous step>
keyAlias=key
storeFile=<location of the key store file, such as /Users/<user name>/key.jks>
- 配置我的 build.gradle 文件以包含以下内容
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
创建了一个 app bundle 并在封闭轨道下发布了它 flutter build appbundle --flavor prod --release
。当我上传工件时,我还让 google 签署我的应用程序“Google 签署应用程序”。
我添加了一个与开发者帐户无关的测试人员,并在“许可测试”下添加了相同的电子邮件,许可响应为“RESPOND_NORMALLY”。
我还创建了三个消耗品并将它们设置为活动状态。
下面是我获取产品的代码
List<String> _kProductIds = <String>[
'my_app_premium_year_c',
'my_app_premium_month_c',
'my_app_premium_week_c'
];
final ProductDetailsResponse productResponse =
await InAppPurchase.instance.queryProductDetails(_kProductIds.toSet());
以下显示了我得到的意外结果。那就是我所有的产品都在 notFoundIDs 列表中。 [my_app_premium_year_c, my_app_premium_month_c, my_app_premium_week_c]
我希望在包含以下代码时 notFoundIDs 列表为空
print("ProductIDs not found: ${productResponse.notFoundIDs}");
如有任何提示或建议,我们将不胜感激。
编辑:以下屏幕截图显示了 google 控制台上我的应用内商品页面。我已经掩盖了某些标识符以保护我的隐私,但是屏幕截图中的产品 ID 与我的代码中的产品 ID 相匹配。
以下屏幕截图显示了我在 alpha 封闭轨道下发布的应用程序。
问题终于解决了。在 Android 平台上,您需要在 queryProductDetails() 之前调用 InAppPurchase 方法 isAvailable()。我不确定为什么您在 IOS 平台上不需要做同样的事情。
文档没有明确说明是否需要这样做,但假设在检查商店是否可用后查询产品解决了我在 Android 上的问题。
我目前遇到的问题是我的 Flutter 应用程序无法从 Google Play 商店获取可消费的应用内商品。但是,我的应用程序能够从 Apple 应用程序商店获取所有产品。
我无法确定我遗漏了哪一步,或者是什么导致找不到我的所有产品 ID。我正在使用 flutter 的 in_app_purchase 模块来促进应用内购买。
对于 Android,这是我执行的设置步骤。
- 我已经设置了我的 Google Play 控制台和开发者帐户
- 已完成“设置您的应用”部分中的所有任务
- 生成了一个密钥库文件来签署我的应用程序
keytool -genkey -v -keystore c:\Users\USER_NAME\key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
- 创建了一个名为 /android/key.properties 的文件,其中包含对我的密钥库文件的引用。该文件的内容如下所示:
storePassword=<password from previous step>
keyPassword=<password from previous step>
keyAlias=key
storeFile=<location of the key store file, such as /Users/<user name>/key.jks>
- 配置我的 build.gradle 文件以包含以下内容
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
创建了一个 app bundle 并在封闭轨道下发布了它
flutter build appbundle --flavor prod --release
。当我上传工件时,我还让 google 签署我的应用程序“Google 签署应用程序”。我添加了一个与开发者帐户无关的测试人员,并在“许可测试”下添加了相同的电子邮件,许可响应为“RESPOND_NORMALLY”。
我还创建了三个消耗品并将它们设置为活动状态。
下面是我获取产品的代码
List<String> _kProductIds = <String>[
'my_app_premium_year_c',
'my_app_premium_month_c',
'my_app_premium_week_c'
];
final ProductDetailsResponse productResponse =
await InAppPurchase.instance.queryProductDetails(_kProductIds.toSet());
以下显示了我得到的意外结果。那就是我所有的产品都在 notFoundIDs 列表中。 [my_app_premium_year_c, my_app_premium_month_c, my_app_premium_week_c]
我希望在包含以下代码时 notFoundIDs 列表为空
print("ProductIDs not found: ${productResponse.notFoundIDs}");
如有任何提示或建议,我们将不胜感激。
编辑:以下屏幕截图显示了 google 控制台上我的应用内商品页面。我已经掩盖了某些标识符以保护我的隐私,但是屏幕截图中的产品 ID 与我的代码中的产品 ID 相匹配。
以下屏幕截图显示了我在 alpha 封闭轨道下发布的应用程序。
问题终于解决了。在 Android 平台上,您需要在 queryProductDetails() 之前调用 InAppPurchase 方法 isAvailable()。我不确定为什么您在 IOS 平台上不需要做同样的事情。
文档没有明确说明是否需要这样做,但假设在检查商店是否可用后查询产品解决了我在 Android 上的问题。