iOS 9 中的新警告:“所有位码都将被丢弃”

Posted

技术标签:

【中文标题】iOS 9 中的新警告:“所有位码都将被丢弃”【英文标题】:New warnings in iOS 9: "all bitcode will be dropped" 【发布时间】:2015-06-15 14:47:39 【问题描述】:

我的应用中有关于 Google 框架的新警告:

(null): URGENT: 所有位码都将被丢弃,因为 '/用户/我的名字/图书馆/手机 Documents/com~apple~CloudDocs/foldername/appname/GoogleMobileAds.framework/GoogleMobileAds(GADSlot+AdEvents.o)' 是在没有位码的情况下构建的。您必须在启用位码的情况下重建它 (Xcode设置ENABLE_BITCODE),从 供应商,或禁用此目标的位码。注意:这将是一个 将来会出错。

Xcode 7 给了我大约 204 个关于同一概念的警告,我无法解决这个问题。另外,我在从我的应用程序访问网络时遇到问题。这是来自调试区的错误:

-canOpenURL:URL 失败:“kindle://home” - 错误:“此应用是 不允许查询scheme kindle”

所有这些问题在 ios 8 中都不存在。

【问题讨论】:

那么您已经在 Xcode 目标中启用了位码? 对不起,我是新手,你能告诉我怎么做吗? 我从来没有做过,但它看起来是你必须刻意设置的东西。你似乎已经这样做了。 @Droppy AFAIK 该设置默认开启,但您可以随时在项目设置中停用它。 我关闭了它们,所有的警告都消失了。我进行了一些研究,谷歌需要更新他们的框架才能关闭这个错误,直到现在关闭它就可以了。有谁知道 -canOpenURL: failed for URL: "kindle://home" - error: "This app is not allowed to query for scheme kindle" ?这个我不知道Xcode在说什么 【参考方案1】:

您的库是在没有位码的情况下编译的,但您的项目设置中启用了位码选项。在您的目标构建设置和库构建设置中说 NOEnable Bitcode 以删除警告。

对于那些想知道是否需要启用位码的人:

对于 iOS 应用,位码是默认设置,但可选。对于 watchOS 和 tvOS 应用程序,需要位码。如果您提供 bitcode,则 app bundle 中的所有应用和框架(项目中的所有目标)都需要包含 bitcode。

https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f

【讨论】:

@Centurion 以前的谷歌分析库已被弃用,也不能用 xcode 7 / ios9 编译 @goelv 是的,您应该能够提交禁用位码的应用程序。现在是可选的。将来可能需要它。 存档对我不起作用。 XCODE 7 之前的项目工作正常,现在即使启用位码设置为 NO 也无法存档。这是针对 AWS 库的。 在所有目标上禁用 Bitcode 后仍然出现错误。【参考方案2】:

在 Xcode 7 之后,bitcode 选项将默认启用。如果您的库是在没有位码的情况下编译的,但在您的项目设置中启用了位码选项,您可以:

    使用位代码更新您的库, 对目标构建设置中的启用位码说不

以及库构建设置以删除警告。

欲了解更多信息,请转至documentation of bitcode in developer library。

还有 WWDC 2015 会议 102:"Platforms State of the Union"

【讨论】:

【参考方案3】:

就我而言,为了避免这个问题:

    确保您使用的是 Xcode 7,而不是较低版本。在较低版本中,此标志不存在。

    设置:Project>Build Settings>All>Build Options>Enable Bitcode = NO

【讨论】:

因此,您必须使用 XCode7 重新编译项目中包含的库,并将 EnableBitcode 设置为 YES。如果您使用的是第 3 方 .a 图书馆,那就相当复杂了。【参考方案4】:

方法canOpenUrl 在iOS 9 中(由于隐私原因)已更改,不再免费使用。您的横幅提供商会检查已安装的应用,以便它们不会显示已安装应用的横幅。

这给出了所有的日志语句,如

-canOpenURL:URL 失败:“kindle://home” - 错误:“此应用不允许查询方案 kindle”

供应商应该为此更新他们的逻辑。

如果您需要查询已安装的应用程序/可用方案,您需要将它们添加到您的 info.plist 文件中。

将键“LSApplicationQueriesSchemes”作为数组添加到您的 plist 中。然后在该数组中添加字符串,例如“kindle”。

当然,对于横幅广告来说,这并不是一个真正的选项(因为它们是动态的),但您仍然可以通过这种方式查询您自己的应用程序或特定的其他应用程序,例如 Twitter 和 Facebook。

canOpenUrl: 方法的文档 canOpenUrl:

Documentation about the LSApplicationQueriesSchemes key

【讨论】:

假设静态库会检查父应用深层链接,如何在静态库中使用异常“LSApplicationQueriesSchemes”?通常你没有 Info.plist 。 我不太确定,如果库需要检查其父级之外的应用程序,则父级应在其 info.plist 中定义 url(因此为框架记录它)。如果 canOpenUrl 也返回 no 将父应用程序可以处理它,那么您应该(我假设)还包括那些在 info.plist【参考方案5】:

如果您正在使用 CocoaPods 并且想要禁用所有库的 Bitcode,请在 Podfile 中使用以下命令

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ENABLE_BITCODE'] = 'NO'
        end
    end
end

【讨论】:

【参考方案6】:

免责声明:这适用于支持需要自动化流程的continuous integration 工作流程的人员。如果没有,请按照Javier's answer 中的说明使用 Xcode。

这对我来说可以通过命令行设置ENABLE_BITCODE = NO

find . -name *project.pbxproj | xargs sed -i -e 's/\(GCC_VERSION = "";\)/\1\ ENABLE_BITCODE = NO;/g'

请注意,这可能在 Xcode 版本中不稳定。它已使用 Xcode 7.0.1 进行了测试,并作为 Cordova 4.0 项目的一部分。

【讨论】:

【参考方案7】:

解决 canOpenURL 失败的问题。这是因为 iOS9 中新的 App Transport Security 功能

阅读这篇文章来解决这个问题http://discoverpioneer.com/blog/2015/09/18/updating-facebook-integration-for-ios-9/

【讨论】:

【参考方案8】:

此问题最近已由 Google 修复(2010 年 11 月),请参阅 https://code.google.com/p/analytics-issues/issues/detail?id=671。但请注意,作为一个好的修复它会带来更多的错误:)

您还必须遵循此处列出的初始化方法:https://developers.google.com/analytics/devguides/collection/ios/v2。

最新的说明会让您头疼,因为它引用了 pod 中未包含的实用程序。下面会因 cocoapod 而失败

// Configure tracker from GoogleService-Info.plist.
NSError *configureError;
[[GGLContext sharedInstance] configureWithError:&configureError];
NSAssert(!configureError, @"Error configuring Google services: %@", configureError);

【讨论】:

以上是关于iOS 9 中的新警告:“所有位码都将被丢弃”的主要内容,如果未能解决你的问题,请参考以下文章

总结iOS9中的新的方法

Swift 中的 iOS 8 和 9:首次启动期间 [警告:无法创建正在进行的恢复标记文件]

Xcode 中的 iOS 9 警告 - 此文件设置为为比项目部署更早的版本构建。功能可能受到限制

iOS 5 SDK 中关于使用不兼容的指针类型初始化的新编译器警告

NSURLSession/NSURLConnection HTTP 加载失败和 iOS 9 的其他 AdMob 警告

Xcode 9.2 中的“警告:无法为签名者构建自签名根的链”警告