使用 flutter 构建 iOS 项目时出现的问题

回答 8 浏览 1.3万 2023-07-29

升级 Xcode 15 beta 5 后,无法构建项目。

显示错误

Firebase 1 issue DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS, use TOOLCHAIN_DIR instead

FirebaseAnalytics 1 issue DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS, use TOOLCHAIN_DIR instead

尝试分解、重新安装和更新 Pod,问题并未解决。

Flutter V. 3.10.6

有什么办法可以解决这个问题吗?

sam 提问于2023-07-29
尝试升级到最新版本的 Cocoapods stackoverflow .com/questions/39481636/…Abhishek Kumar 2023-09-23
8 个回答
#1楼
得票数 33

Xcode 2023 年 9 月 15 日解决方案

下面的解决方案应该处理以下所有问题

  1. 'Flutter/Flutter.h' file not found
  2. Cycle inside Runner; building could produce unreliable results.

第1步:更新Podfile(Flutter / Xcode 15)

post_install do |installer|
  installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
          xcconfig_path = config.base_configuration_reference.real_path
          xcconfig = File.read(xcconfig_path)
          xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR")
          File.open(xcconfig_path, "w") { |file| file << xcconfig_mod }
      end
  end
  installer.pods_project.targets.each do |target|
      flutter_additional_ios_build_settings(target)
      target.build_configurations.each do |config|
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
      end
  end
end

第 2 步:更新构建阶段(扩展)

  1. 打开Xcode
  2. 单击项目导航器中的“Runner”(左上角)
  3. 单击侧栏中的“Targets ”->“Runner”
  4. 单击“Build Phases”(顶部栏)
  5. 将“Embed App Extension”(或“Embed Foundation Extension”或类似内容)移至“运行脚本”步骤(其中包括有关框架的代码)上方

如果这不起作用,请检查https://developer.apple.com/forums/thread/730974 了解更多想法。

清除一切

flutter clean
flutter pub get
cd ios && rm podfile.lock && arch -x86_64 pod install --repo-update

注意:此问题已在最新的 cocaopod 版本中得到解决。

Kyle Venn 提问于2023-09-19
Kyle Venn 修改于2023-09-26
Causes Thread 1: signal SIGABRTbjmcallister 2023-09-21
#2楼 已采纳
得票数 32

看来 Cocoapods 问题已经解决了, 等待下一次公开发布 https://github.com/CocoaPods/CocoaPods/pull/12009

使用 Cocoapods 旧版本,您可以通过编辑 Podfile 来解决此问题,如下所示

post_install do |installer|
  installer.aggregate_targets.each do |target|
    target.xcconfigs.each do |variant, xcconfig|
      xcconfig_path = target.client_root + target.xcconfig_relative_path(variant)
      IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR"))
    end
  end
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if config.base_configuration_reference.is_a? Xcodeproj::Project::Object::PBXFileReference
        xcconfig_path = config.base_configuration_reference.real_path
        IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR"))
      end
    end
  end
end
larva 提问于2023-08-01
larva 修改于2023-08-01
感谢您的代码帮助!在 cocoapods 稍后更新其公开版本后,我们如何删除这段代码所做的特殊操作以保持默认的预期正常行为?fphelp 2023-09-10
@fphelp 更新时只需删除 Podfile.lock 文件和 Pods/ 文件夹。并再次运行 pod install。larva 2023-09-12
如果您收到:“Flutter/Flutter.h”,另请参阅问题文件未找到hexstorm 2023-09-19
令人尴尬的是,Apple 不断发布其主要开发 IDE 和相关软件的 bug 版本……每个新版本的 XCode 都存在问题! EM BA RAS SING!我很反感!Ale TheFe 2023-09-19
不要忘记,pod文件更新后需要在iOS目录下再次运行pod install!M Karimi 2023-09-20
#3楼
得票数 14

在发布修复程序之前,只需打开终端窗口并从项目文件夹运行以下命令:

find . -name "*.xcconfig" -type f -exec grep -l 'DT_TOOLCHAIN_DIR' {} \; \
| while IFS= read -r file; do sed -i '' 's/DT_TOOLCHAIN_DIR/TOOLCHAIN_DIR/g' "$file"; done

之后,错误消失并且不会返回,除非您再次运行pod updatepod install,在这种情况下,您必须再次运行该命令。

Mecki 提问于2023-09-18
Mecki 修改于2023-09-20
我认为这是一个更合适的解决方案或解决方法,因为这个问题特定于 Xcode 15 和 Cocoapods,因为它影响所有 iOS 项目,无论使用什么技术(Flutter、native等)。这已经在这里报告了 github.com/CocoaPods/CocoaPods/issues/12012等到官方修复即可,所以不需要更新 pods 文件David_E 2023-09-20
这解决了我们所有 Realm 和 Firebase 项目的问题。非常感谢,因为我们已经死在水里了。Jay 2023-09-20
这对我也有用。我在将 Firebase 添加到我的 iOS Xcode 项目时遇到问题。谢谢Supertecnoboff 2023-09-21
尝试不同的解决方案后,这个有效。Shender Ramos 2023-09-21
#4楼
得票数 6

我通过以下方式解决了这些问题:

post_install do |installer|
  installer.pods_project.targets.each do |target| 
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
      xcconfig_path = config.base_configuration_reference.real_path
      xcconfig = File.read(xcconfig_path)
      xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR")
      File.open(xcconfig_path, "w") { |file| file << xcconfig_mod }
      end
  end
end

如果您使用 inAppWebview 进行 flutter,则会出现如下错误:

Parse Issue (Xcode): Could not build module 'WebKit'

因此,您可以在 pubspec.yaml 文件中添加如下内容:

flutter_inappwebview:
    git:
      url: https://github.com/Estrelio/flutter_inappwebview.git
      ref: fix-xcode-17 
Harsh Patel 提问于2023-09-19
#5楼
得票数 2

我通过以下方式解决了修改 pod_install 的问题:

post_install do |installer|
  installer.pods_project.targets.each do |target|
  flutter_additional_ios_build_settings(target)
      target.build_configurations.each do |config|
      xcconfig_path = config.base_configuration_reference.real_path
      xcconfig = File.read(xcconfig_path)
      xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR")
      File.open(xcconfig_path, "w") { |file| file << xcconfig_mod }
      end
  end

结尾

我保留了这行代码:

flutter_additional_ios_build_settings(target)

因为没有它我发现了其他问题,例如:

    Swift Compiler Error (Xcode): No such module 'Flutter'
/Users/xxxxxxxxxx/.pub-cache/hosted/pub.dev/modal_progress_hud_nsn-0.4.0/ios/Classes/ModalProgressHudNsnPlugin.swift:0:7


Encountered error while building for device.
Bbbgl 提问于2023-09-14
#6楼
得票数 2

对我来说,我必须结合几个解决方案 - 其中之一是将最低部署目标提高到 13。最终运行的 pod_install 看起来像这样

post_install do |installer|
  installer.aggregate_targets.each do |target|
    target.xcconfigs.each do |variant, xcconfig|
      xcconfig_path = target.client_root + target.xcconfig_relative_path(variant)
      IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR"))
    end
  end
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
      if config.base_configuration_reference.is_a? Xcodeproj::Project::Object::PBXFileReference
        xcconfig_path = config.base_configuration_reference.real_path
        IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR"))
      end
    end
  end
end
PostMaloyYT 提问于2023-09-19
在尝试了更多解决方案之后,这对我有用。但使用后我遇到了新问题。所以我也需要解决这个问题。Md. Al-Amin 2023-09-20
#7楼
得票数 1

1.13.0 附带修复程序。

将 Cocoapods 更新到 v1.13:

sudo arch -x86_64 gem update cocoapods

然后在您的 flutter 项目中运行:

flutter clean
flutter pub get
cd ios && arch -x86_64 pod install --repo-update && cd ..
cd macos && arch -x86_64 pod install --repo-update && cd ..
Adam Smaka 提问于2023-09-25
Adam Smaka 修改于2023-09-25
#8楼
得票数 0

经过寻找更多解决方案,我终于解决了这个问题。

post_install do |installer|
  installer.aggregate_targets.each do |target|
    target.xcconfigs.each do |variant, xcconfig|
      xcconfig_path = target.client_root + target.xcconfig_relative_path(variant)
      IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR"))
    end
  end
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
      if config.base_configuration_reference.is_a? Xcodeproj::Project::Object::PBXFileReference
        xcconfig_path = config.base_configuration_reference.real_path
        IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR"))
      end
    end
  end
end

是的,不仅改变,而且这解决了我的问题。

将我的podfile更改为这个后,我遇到了一个新问题,那就是:

Error (Xcode): type argument 'nw_proxy_config_t' (aka 'struct nw_proxy_config *') is neither an Objective-C object nor a block type
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator17.0.sdk/System/Library/Frameworks/WebKit.framework/Headers/WKWebsi
teDataStore.h:119:46


Parse Issue (Xcode): Could not build module 'WebKit'
/Users/rokomari/rokomari-ios-flutter/rokomari_ios/build/ios/Debug-iphonesimulator/flutter_inappwebview/flutter_inappwebview.framework/Headers/flutter_inappwebview-Swift.h:893:
8

所以我也需要解决这个问题。

要解决这个问题,你必须更改 iOS 目录中的一些文件:

第 1 步:转到此目录/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS17.0.sdk/System/Library/Frameworks/WebKit.framework/Headers/WKWebsiteDataStore.h

第 2 步:打开名为 WKWebsiteDataStore.h 的文件,并在第 113 行将代码更改为:

更改自:

|| ((TARGET_OS_IOS || TARGET_OS_MACCATALYST) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 170000) \

到:

|| ((TARGET_OS_IOS || TARGET_OS_MACCATALYST) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 180000) \

这就是我解决问题的方法!!

注意:WKWebsiteDataStore.h 文件在XCode 上不可编辑。因此,您必须在默认TextEditor上打开此文件,然后更改我上面的代码并用新文件替换该文件。我希望这能解决您的问题。

如果您在编辑时遇到困难:

  1. 打开终端
  2. 运行:

open /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS17.0.sdk/System/Library/Frameworks/WebKit.framework/Headers/

如果您使用 XCode beta,请将行 Xcode.app 替换为 Xcode-beta.app

  1. 然后在finder中找到WKWebsiteDataStore.h,右键用TextEdit打开。编辑文件并再次保存。
Md. Al-Amin 提问于2023-09-20
标签