NativeScript / NativeScript/nativescript-cli
Build for iOS fails when Podfile specifies platform 11 or later
還沒有人認領這個 Issue。
- 主要語言
- JavaScript
- 星號
- 1.1k
- 分支
- 204
- 平均合併
- 1 天 9 小時
- 30 天內合併 PR
- 8
描述
Environment
Provide version numbers for the following components (information can be retrieved by running tns info in your project folder or by inspecting the package.json of the project):
- CLI: 5.1.1
- Cross-platform modules: Not applicable
- Android Runtime: Not applicable
- iOS Runtime: Not applicable
- Plugin(s): Any plugin with Podfile will do the job. For this report I've used
nativescript-imagepicker.
Describe the bug
When the platform in Podfile is 11 or later, build for iOS fails with error:
ld: warning: directory not found for option '-F<path to project>/platforms/ios/build/Debug-iphonesimulator/QBImagePickerController'
ld: framework not found QBImagePickerController
clang: error: linker command failed with exit code 1 (use -v to see invocation)
note: Using new build systemnote: Planning buildnote: Constructing build description
To Reproduce
- Create new project:
$ tns create myApp --js - Navigate to project:
$ cd myApp - Add
nativescript-imagepickerplugin:npm i --save --save-exact nativescript-imagepicker - Open the Podfile in
nativescript-imagepicker:code node_modules/nativescript-imagepicker/platforms/ios/Podfileand add the following line at the top:
platform :ios, '11.0'
- Now build for iOS:
tns build iosortns build ios --forDevice
The build will fail.
Expected behavior
The build should succeed.
Additional context
It looks like the problem is in the Pods - the specified platform is used only for building the framework, but not for the actual Pod target and the application. When building for iOS 11 or later, Xcode automatically builds for 64bits only, i.e. for arm64 (for device) or x86_64 (for simulator).
When CLI tries to build the project, it spawns xcodebuild with ONLY_ACTIVE_ARCH=NO, i.e. Xcode will build the project for all architectures based on the deployment target. As the default deployment target is 9, Xcode will build for both armv7 and arm64 (for device) or i386 and x86_64 (for simulator). As the Pods project has platform "11.0", the static framework will be build only for the 64bits arch, so the actual build of the project will not be able to find the framework for armv7/i386 and it fails.
Workarounds
- Delete the platform: ios, '11.0' line from all plugins that add it.
or - Specify
IPHONEOS_DEPLOYMENT_TARGET = 11.0in your<path to project's App_Resources>/iOS/build.xcconfig- this way when Xcode builds your project, it will build only for 64bits architecture and the build will succeed. NOTE: This way your app will not work on lower iOS targets.
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
使用文件中記載的 tns create、nativescript-imagepicker、Podfile platform 11.0 和 tns build ios 指令重現此失敗。檢查 CLI 對 xcodebuild 的呼叫,以及產生的專案、外掛程式 Podfile 和 App_Resources/iOS/build.xcconfig。完成的條件是:在 Podfile platform 為 11 或更高時,iOS 建置能夠成功,且不需要 workaround。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- javascript
- 領域
- build-system, cli, mobile-dev
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 停滯
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100