带有扩展名的应用程序的 Ionic/Cordova iOS 应用程序构建错误 - ** 存档失败 **

Posted

技术标签:

【中文标题】带有扩展名的应用程序的 Ionic/Cordova iOS 应用程序构建错误 - ** 存档失败 **【英文标题】:Ionic/Cordova iOS app build error for app with extension - ** ARCHIVE FAILED ** 【发布时间】:2017-04-30 18:21:23 【问题描述】:

我在使用 Cordova/Ionic CLI 的 App Extensions 运行和构建 ios 应用程序时遇到问题。为了使我的应用程序正常工作,我必须添加一些应用程序扩展(CallKit 目录和意图),并且我使用 XCode 完成了它 - 添加了一个新目标并用 Swift 编写了一些东西。当我从 Xcode 进行构建时,一切似乎都在工作,但是 Cordova CLI 似乎无法区分主应用程序和应用程序扩展。

/<Path_To_The_App>/Bridging-Header.h:28:9: note: in file included from /<Path_To_The_App>/Bridging-Header.h:28:
#import "CallKit-Bridging-Header.h"
        ^
/<Path_To_The_App>/Plugins/my.custom.callkit_plugin_written_in_swift/CallKit-Bridging-Header.h:1:9: error: 'Cordova/CDV.h' file not found
#import <Cordova/CDV.h>
        ^
<unknown>:0: error: failed to import bridging header '/<Path_To_The_App>/Bridging-Header.h'


** ARCHIVE FAILED **

The following build commands failed:
        CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler
        CompileSwift normal arm64 /My Call Directory Extension/CallDirectoryHandler.swift
        CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler
        CompileSwift normal arm64 /My Intent Extension/IntentHandler.swift
(4 failures)

似乎该脚本在构建扩展时尝试使用主应用程序中的桥接头文件,这显然是用 Swift 编写的。在 Xcode 中,我将这两个目标的“安装 Objective-C 兼容性标头”设置为“否”,但 Cordova CLI 并不关心。可能,在 Objective-C 中重写扩展可以解决这个问题,但是我没有更多的时间来尝试一种我不擅长的语言。

我曾经遇到过另一个与扩展相关的构建问题,通过在 Cordova lib 文件中添加一些“ifs”来解决这些问题,但黑客攻击从来都不是一个好的解决方案。谷歌搜索该主题一无所获,好像没有人尝试将应用扩展添加到 Cordova 应用。

现在可以分两步进行构建: 1) 将文件从 /www 移动到 /platforms/ios/www 2)从Xcode手动运行。 这很烦人。

有谁知道避免这种情况的好方法,而不必破解 Cordova 脚本?

谢谢。

【问题讨论】:

【参考方案1】:

我花了一些时间学习运行命令输出,发现构建过程是使用 Xcode 命令行工具启动的:

xcodebuild -xcconfig <Path To My app>/platforms/ios/cordova/build-debug.xcconfig -workspace "<My App Name>.xcworkspace" -scheme "<My App Name>" -configuration "Debug" -destination generic/platform=iOS -archivePath "<My App Name>.xcarchive" archive CONFIGURATION_BUILD_DIR=<Path To My app>/platforms/ios/build/device SHARED_PRECOMPS_DIR=<Path To My app>/platforms/ios/build/sharedpch

此命令的文档说:

-xcconfig 文件名

在构建所有目标时加载文件名中定义的构建设置。这些设置将覆盖所有其他设置,包括在命令行上单独传递的设置。

build-debug.xcconfig 导入 build.xcconfig,由于某种原因具有“SWIFT_OBJC_BRIDGING_HEADER = $(PROJECT_DIR)/$(PROJECT_NAME)/Bridging-Header.h”。显然,尽管有 .xcodeproj 设置,但它覆盖了所有目标的桥接头。

在platforms/ios/cordova/build.xcconfig 中注释掉这一行后,构建过程将按预期运行。

【讨论】:

【参考方案2】:

在我的情况下,Cordova 构建命令使用了错误的 Xcode 版本。

我正在使用 Swift 3 并在我的计算机上安装了两个 Xcode:Xcode 7.3.1 和 Xcode 8.3.3。我可以毫无问题地使用 Xcode 8.3.3 应用程序构建我的科尔多瓦应用程序,但是在执行命令 cordova build ios 时,我遇到了和你一样的错误。以下是我执行的步骤:

    $ xcodebuild -version。这一步给你 Xcode 的版本 科尔多瓦在建造时使用。就我而言,它返回了Xcode 7.3.1

    $ sudo xcode-select -switch [PathToYourXcodeFolder]。切换到您想要使用的 Xcode 版本。

您可能需要检查当前 Xcode 路径:$ xcode-select -print-path

在我切换到 Xcode 8.3.3 之后,我可以运行 cordova build ios 而没有错误。希望这可以帮助那些和我有同样问题的人。

【讨论】:

以上是关于带有扩展名的应用程序的 Ionic/Cordova iOS 应用程序构建错误 - ** 存档失败 **的主要内容,如果未能解决你的问题,请参考以下文章

ionic/cordova 应用程序中 IOS 10.3.3 中的屏幕闪烁问题

Ionic/Cordova - 是不是有具有工作轨迹栏功能的媒体/媒体播放器插件?

在没有 Photoshop 知识的情况下创建简单的启动画面(Ionic/Cordova)

在 ios 上使用 ionic/cordova 添加平台期间未安装的插件

ionic 和cordova的区别是啥

在后台获取 Ionic/Cordova 应用程序的位置