Swift4 iOS UI测试中如何获取App名称?已尝试代码返回nil
解决UI测试中获取App名称返回nil的问题
嘿,这个问题我之前也踩过坑!你用Bundle.main拿不到App名称的核心原因是:在UI测试target里,Bundle.main指向的是测试本身的bundle,而不是你主App的bundle,所以自然读不到主App的CFBundleDisplayName啦。
下面给你几个靠谱的解决方案:
方案1:直接通过App的Bundle ID获取主App的Bundle
这是最直接的方法,只要你知道主App的Bundle ID,就能精准获取到它的bundle信息:
// 替换成你主App实际的Bundle ID,比如"com.yourteam.yourapp" guard let appBundle = Bundle(identifier: "你的AppBundleID") else { fatalError("找不到主App的Bundle,请检查Bundle ID是否正确") } // 安全获取App名称,避免强制解包崩溃 let appName = appBundle.object(forInfoDictionaryKey: kCFBundleDisplayNameKey as String) as? String ?? appBundle.object(forInfoDictionaryKey: kCFBundleNameKey as String) as? String ?? "未知App名称"
这里额外做了兜底:如果CFBundleDisplayName没设置(有些项目可能只填了CFBundleName),会自动 fallback 到CFBundleName,避免拿到nil。
方案2:通过XCUIApplication传递名称到测试环境
如果不想硬编码Bundle ID,可以在测试启动前,先从主App bundle读取名称,再通过launchEnvironment传递给测试用例:
override func setUp() { super.setUp() let app = XCUIApplication() // 先获取主App的名称 if let appBundle = Bundle(identifier: "你的AppBundleID"), let appDisplayName = appBundle.object(forInfoDictionaryKey: kCFBundleDisplayNameKey as String) as? String { // 把名称存到启动环境变量里 app.launchEnvironment["APP_DISPLAY_NAME"] = appDisplayName } app.launch() } // 在测试用例里获取名称 func testExample() { if let appName = ProcessInfo.processInfo.environment["APP_DISPLAY_NAME"] { print("App名称:\(appName)") // 这里可以用appName做UI验证,比如检查导航栏标题等 } }
方案3:读取主App的Info.plist文件(适合复杂场景)
如果你的测试需要动态定位主App的bundle路径,可以这么做:
// 获取主App的.app包路径(假设测试target和主App在同一项目下) guard let appPath = Bundle.main.path(forResource: "你的App名称", ofType: "app") else { fatalError("找不到主App的安装路径") } let appBundle = Bundle(path: appPath)! let appName = appBundle.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? "默认名称"
小提醒
- 尽量避免用
as!强制解包,一旦Info.plist里没对应字段,会直接导致测试崩溃,用as?配合默认值更安全。 - 确认主App的Info.plist里确实设置了
CFBundleDisplayName,有些项目可能只配置了CFBundleName,这时候可以优先读CFBundleName。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

