iOS 9中的新警告:"所有位码将被删除"

395

我的应用程序出现了关于Google Framework的新警告:

(null): 紧急:所有位码将被删除,因为 '/Users/myname/Library/Mobile Documents/com~apple~CloudDocs/foldername/appname/GoogleMobileAds.framework/GoogleMobileAds(GADSlot+AdEvents.o)' 是没有启用比特码构建的。您必须使用启用了比特码的Xcode设置重新构建它,从供应商获取更新的库,或者为此目标禁用比特码。注意:这在将来将是一个错误。

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

-canOpenURL: failed for URL: "kindle://home" - error: "This app is not allowed to query for scheme kindle"

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


你在 Xcode 目标中启用了位码吗? - Droppy
抱歉,我是新手,请问你能告诉我怎么做吗? - C.Farrugia
我从未这样做过,但看起来这是你必须刻意设置的东西。你似乎已经做到了。 - Droppy
4
据我所知,该设置默认已开启,但您可以在项目设置中随时停用它。 - HAS
因为这是一个可选功能,那些警告与您的代码中的错误无关。苹果已确认默认开启。我已经提交了一个关于此问题的错误报告(21416003)。 - Droppy
显示剩余4条评论
7个回答

1033

您的库未启用位码编译,但是在您的项目设置中启用了位码选项。在目标构建设置和库构建设置中选择 NO启用位码 ,以删除警告。

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

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

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


@Centurion,之前的Google Analytics库已经过时,无法与Xcode 7 / iOS9编译。 - zonabi
1
@goelv 是的,你应该能够提交禁用 bitcode 的应用程序。目前它是可选的,但未来可能会变为必需品。 - zonabi
2
对我来说无法进行归档。在 XCODE 7 之前的项目可以正常工作,现在即使将 Enable Bitcode 设置为 NO,仍然无法进行归档。这是针对 AWS 库的。 - ort11
1
在所有目标上禁用 Bitcode 后仍然出现错误。 - datWooWoo

113

Xcode 7版本之后,默认启用位码选项。如果你的库没有使用位码编译,但是工程设置中启用了该选项,你可以:

  1. 使用位码更新库。
  2. 在目标“Build Settings”中选择不启用“Enable Bitcode”。

这是图片描述

并修改库的构建设置以消除警告。

欲了解更多信息,请参阅开发者文库中有关位码的文档和WWDC 2015会议第102节:“Platforms State of the Union”

这是图片描述


43

为了避免这个问题,我采取以下措施:

  1. 确保你正在使用的是Xcode 7,而不是更低版本。在较低版本中,该标志不存在。

  2. 设置:项目>构建设置>全部>构建选项>启用位代码 = NO

输入图像描述


2
因此,您将需要使用启用了Bitcode的XCode7重新编译项目中包含的库。如果您正在使用第三方.a库,则会变得相当复杂。 - Javier Calatrava Llavería

15

iOS 9中由于隐私问题,方法canOpenUrl已更改,不再免费使用。您的横幅广告提供程序检查已安装的应用程序,以便它们不会为已安装的应用程序显示横幅。

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

-canOpenURL: 失败的URL:"kindle://home" - 错误:"此应用程序不允许查询方案kindle"

提供者应更新其逻辑以解决此问题。

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

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

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

有关canOpenUrl:方法的文档

有关LSApplicationQueriesSchemes键的文档


假设一个静态库将检查父应用程序的深度链接,如何在静态库中使用异常“LSApplicationQueriesSchemes”?通常情况下,您没有相应的Info.plist文件。 - loretoparisi
我不太确定这一点,如果一个库需要检查其父级之外的应用程序,则父级应在其info.plist中定义URL(因此为框架记录文档)。如果canOpenUrl也返回否,则父应用程序可以处理它,那么您还应该(我假设)将其包含在info.plist中。 - Saren Inden

14
如果您正在使用 CocoaPods,并且希望为所有库禁用Bitcode,请在Podfile中使用以下命令。

如果你正在使用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

8
免责声明:本内容旨在为需要自动化过程的支持持续集成工作流程的人员提供帮助。如果您不需要,请按照Javier的答案中描述的方式使用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项目的一部分。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接