当应用程序处于“待发布”阶段并由审阅者/测试人员(Google Play 商店)使用/审阅时,InstallerPackageName 是啥?
Posted
技术标签:
【中文标题】当应用程序处于“待发布”阶段并由审阅者/测试人员(Google Play 商店)使用/审阅时,InstallerPackageName 是啥?【英文标题】:What is the InstallerPackageName when app is in "pending publication" phase and used/reviewed by reviewers/testers (Google Play Store)?当应用程序处于“待发布”阶段并由审阅者/测试人员(Google Play 商店)使用/审阅时,InstallerPackageName 是什么? 【发布时间】:2016-04-06 01:14:51 【问题描述】:情况
我的应用中有一组功能,这些功能会根据安装应用的商店而变化。例如。我希望为家庭观众和儿童展示一组更受限制的广告,以符合Google Play for Education
类别的资格。在其他商店中,我仍然想限制但不想像过滤广告那样严格。
我的总体观察是,如果我选择加入“Google Play for Education”类别,则由于以下原因(如开发者控制台上所述),需要几个小时才能发布:
选中此框会提交此应用以包含在“教育者 推荐”部分的 Google Play for Education。最终决定 推荐的应用程序由第三方教师网络制作。 如果您的应用被选中,我们将通过电子邮件通知您。如果没有,您的 应用仍可在 Google Play for Education 中搜索。
现在,在此类别中发布应用程序之前,我假设,下载并测试/验证是否符合指导方针并且没有违规行为。
问题
为了区分安装的商店,我显然使用了这个:
PackageManager packageManager = context.getPackageManager();
String installer = packageManager.getInstallerPackageName(packageName);
if (installer == null) installer = ""; //to avoid NPE
if (installer.equals("com.android.vending"))
//It is installed from Google Play store
//PROBLEM: THIS DOES NOT SEEM TO BE THE PACKAGE NAME RETURNED
//WHEN GOOGLE PLAY REVIEWERS/TESTERS ARE USING THE APP
else ...
....
....
//similarly handling other stores here
....
....
....
//After that also checking by installed app stores
....
....
发生了什么:在发布之后,应用程序正确识别它是从 Play 商店下载的,即它得到 com.android.vending
作为 installerPackageName。但是,当教师网络对其进行审查或测试时,它似乎获得了不同的安装程序包名称。这导致该应用认为它是从 Google Play 商店以外的应用商店下载的。因此,我的应用被教育类别拒绝。我需要知道这个安装程序包名称才能正确处理场景。
我怎么知道的:当检测到的应用商店是 Google Play 并且成功发布后的所有请求(即来自普通 Play 商店用户)来到时,我有一个专用的广告单元 ID 可以使用此 Google 专用广告单元 ID。但是,在提交应用/更新后和应用或更新发布之前的短时间内,一些请求到达非 Google 广告单元 ID,导致应用无法遵守符合“Google Play for Education”类别的准则。因为,非谷歌广告单元 id 中的广告过滤级别略低。因此,评估/测试应用程序的教师会看到一些他们认为不符合指南的广告并拒绝它。
另外,here is an article 支持应用在实际发布到商店之前通过手动和自动脚本进行审核这一事实。
当前修复或限制:我已禁用所有其他广告网络,只能使用 admob。即使在其他广告网络中最严格的过滤器设置似乎也无法过滤掉所有谷歌评论者认为不适合儿童和家庭观众的广告。仅使用 admob 时,过程很顺利,我总是符合条件。
我正在寻找什么来解决这个问题:如果我知道安装应用程序时返回的 installerPackageName,它是从教师审查网络安装应用程序的地方安装的,我可以完全按照我收到com.android.vending
时的处理方式处理这种情况,一切都会好起来的。
我找不到任何文档或参考来获取此信息。
另外,如果有任何其他方式我可以识别它应用程序处于pending publication
阶段,我会强制所有请求转到谷歌广告单元 ID。
假设:有一个单独的安装程序应用程序供审阅者和测试人员使用(自动/手动,无论它在后台可能是什么),其 installerPackageName 不是 com.android.vending
。如果周围有一些 Google 人员可以帮助确认这一点(如果 Google 允许),请发表评论。 :-)
其他我不想考虑的可能性
在应用程序处于pending publication
阶段时手动禁用所有其他网络,并在发布后重新启用它们。但是,我不想这样做,因为这就像在欺骗谷歌,我不想那样做。我希望我的应用程序逻辑能够处理它,以便将审查过的相同内容投放市场。
我永远只坚持使用 admob。但这将是愚蠢的,因为在我发布应用程序的其他商店中没有这样的限制,而且我会在填充率上大打折扣。
在或知道评论下载位置的installerPackageName之前遇到过此问题的人或知道如何确定应用程序当前是否处于“待发布”状态Playstore 上的状态?
我也可以按以com.android
或com.google
开头的包名过滤所有内容,但我想将其保留为最后一个选项。另外,想知道在这些用户的情况下是否根本没有设置安装程序包名称。在这种情况下,我需要考虑完全不同的情况来处理这种情况。
【问题讨论】:
另一种可能的方法是使用不同的构建变体,而不是依赖运行时条件(这也有助于 apk 大小)。 在不知道包名的情况下按包名过滤很可能会失败。可能是com.android...
或com.googleplex...
甚至com.example...
已经在使用的构建变体。在我的情况下无法用于此目的
【参考方案1】:
在这种情况下,我找到了可以帮助您的一件事。是分析。只需创建您的自定义事件,例如。在一些分析系统中安装 INSTALLER_STRING 并在适当的时候记录该事件。这是 Fabric Answers 中的事件记录示例。
public static final String EVENT_OPEN_TOP_TRENDS = "EVENT_OPEN_TOP_TRENDS";
public static final String TOP_TRENDS_TYPE = "TOP_TRENDS_TYPE";
public static final String TYPE_TOP_TRENDS_IMAGES = "TYPE_TOP_TRENDS_IMAGES";
public static void logEvent(String eventId, String attributeName, String name)
Answers.getInstance().logCustom(new CustomEvent(eventId).putCustomAttribute(attributeName, name));
logEvent(EVENT_OPEN_TOP_TRENDS, TOP_TRENDS_TYPE, TYPE_TOP_TRENDS_IMAGES);
稍后,您可以在 Fabric 网站上查看您的应用安装程序的来源。
【讨论】:
当然这是一种方式,但我不想仅仅因为这个原因包含库和推送和更新(或者可能发布一个虚拟应用程序)。我仍然计划将这种方法作为最后的手段。但是,感谢您的投入。 是的,你是对的。尽管如果您使用的是 Crashlytics(许多开发人员都使用),那么您已经包含了 Answers。 其他选项操作系统构建风格,因此您可以为具有相同基本逻辑和不同广告逻辑的不同商店创建单独的 apk 但是谈到google play上的应用程序验证,我猜至少自动化测试是使用adb完成的,其中安装程序将为空(空),所以你应该检查你的if语句是否为空安装程序字符串大小写。 赏金即将结束,您的投入非常棒,尽管不是我想要的。我将奖励这个答案,因为这是我最后的回退答案。但是,在接受答案之前,我仍然会再等几天,以防有人碰巧找到给出确切包名称的来源。感谢您的所有投入。赞赏。【参考方案2】:检查您将使用此日志为您使用的所有应用显示哪些结果并检测安装程序包名称:
final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo packageInfo : packages)
String is = pm.getInstallerPackageName(packageInfo.packageName);//getPackageName());
Log.d(TAG, (packageInfo.packageName==null?"":packageInfo.packageName) + " : " + (is==null?"":is));
您将看到已安装应用程序和软件包源的完整列表,或以您想要的方式记录这些数据。 编辑 @Virus,我只想给你一个简单的想法。如果您想知道软件包安装程序名称,您可以在启动应用程序时获取此数据,并使用简单的 http GET 请求将其发送到您自己的服务器,以检测安装程序名称。用这个简单的 fabber 重新发布你的 apo。我认为这是唯一的解决方案。
【讨论】:
感谢您的意见,但我认为您没有得到所需的内容。 是的,这是一个选项,但我不想在应用程序中放入不是功能的东西。我会想以正确的方式解决它。就像我在另一个答案中的评论一样,这是我想用作最后手段的一种方法。以上是关于当应用程序处于“待发布”阶段并由审阅者/测试人员(Google Play 商店)使用/审阅时,InstallerPackageName 是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Facebook App Review - 如何让 FB 审阅者测试 manage_pages 权限?
待发布在 Google Play 上还有 2 天,有问题吗?