当我启动测试时,我需要大量的调试信息:使用的设备,操作系统和测试的应用程序版本。
我的问题是关于该应用的版本。
在Android上,我使用:
String line = "adb -s " + udid + " shell dumpsys package";
Runtime.getRuntime().exec(line);
之后,搜索包名称然后搜索versionName很容易。
但是如何在iOS上找到相同的信息?我没有找到任何有app信息的文档。 (显然,adb与iphone不兼容)
答案 0 :(得分:0)
你可以试试这个。如果你正在使用* .app你可以试试这个命令:
或ipa" IPA / payload / NAME.app / Info.plist"
String line = "/usr/libexec/PlistBuddy -c print Downloads/Payload/NAME.app/Info.plist | grep CFBundleVersion"
Runtime.getRuntime().exec(line);
答案 1 :(得分:0)
TL; DR 查看this article以获得摘要。
对于iOS,您可以使用以下选项:
defaults
或Linux上的plistutil
,然后使用ProcessBuilder
从Java代码中调用它。简而言之,如果您只需要iOS,我建议选项2,如果您想要Android和iOS的相同方法,我建议选项3。
广告1。
这取决于平台,因此并不理想(IMO)。如果您只针对一个平台来执行测试,或者不介意维护多个平台,也不介意安装其他工具,则效果很好。
这些是用于检索版本信息的命令。同样,您也可以从应用程序包中查询其他元数据。
Mac OS:
defaults read /path/test.app/Info CFBundleShortVersionString
defaults read /path/test.app/Info CFBundleVersion
Linux:
plistutil -i /path/test.app/Info | xmllint --xpath "//key[text()='CFBundleShortVersionString']/following-sibling::string[1]/text()" -
plistutil -i /path/test.app/Info | xmllint --xpath "//key[text()='CFBundleVersion']/following-sibling::string[1]/text()" -
这种方法对于在Shell脚本(例如在CI管道中)中使用可能最有用。
将其集成到Java程序中将如下所示(请注意,如果决定使用此功能,则可能需要添加一些其他错误处理):
String versionName = executeCommand("defaults read /path/test.app/Info CFBundleShortVersionString");
public String executeCommand(String command) {
LOG.info("Executing command {}", command);
String[] shellCommand = {"/bin/sh", "-c", command};
Process process;
try {
process = new ProcessBuilder(shellCommand).start();
return Stream.of(process.getErrorStream(), process.getInputStream())
.parallel()
.map(
(InputStream inputStream) -> {
try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
return br.readLine(); // we only care about the first line
} catch (IOException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.joining());
} catch (IOException exception) {
LOG.error(String.format("Error while executing command %s", command), exception);
}
return "";
}
我为此here做了一个PoC。虽然这可以正常工作,并且具有不需要任何其他Java库的优点,但我还是建议使用其他选项之一。
广告2。
将dd-list JAR文件添加到您的类路径中。例如,对于Maven:
<properties>
<dd.plist.version>1.21</dd.plist.version>
</properties>
<dependencies>
<dependency>
<groupId>com.googlecode.plist</groupId>
<artifactId>dd-plist</artifactId>
<version>${dd.plist.version}</version>
</dependency>
</depdencies>
然后,运行如下代码:
String appPath = "/path/test.app";
NSDictionary dictionary = (NSDictionary) PropertyListParser.parse(path);
String versionName = dictionary.objectForKey(“CFBundleShortVersionString”).toString();
String versionCode = dictionary.objectForKey(“CFBundleVersion”).toString();
广告3。
将justtestlah-mobile-tools
JAR文件添加到您的类路径中。对于Maven:
<properties>
<justtestlah.version>1.3.2</justtestlah.version>
</properties>
<dependencies>
<dependency>
<groupId>io.github.martinschneider</groupId>
<artifactId>justtestlah-mobile-tools</artifactId>
<version>${justtestlah.version}</version>
</dependency>
</depdencies>
然后运行如下代码:
ApplicationInfo appInfo = new ApplicationInfoService().getAppInfo(appPath);
String versionName = appInfo.getVersionName();
String versionCode = appInfo.getVersionCode();
String applicationName = appInfo.getApplicationName();
最后一个附加的好处是您可以对APK,APP甚至IPA文件使用相同的代码。
答案 2 :(得分:0)
我想您可以使用此命令获取应用程序版本:
ideviceinstaller -l | grep appBundleId
但是你需要首先使用这个命令安装 ideviceinstaller:
brew install --HEAD ideviceinstaller