Flutter - 为iOS构建,但链接和嵌入的框架“App.framework”是为iOS模拟器构建的。

35

在升级到Catalina 10.15.4 beta和Xcode 13.4 beta后,Simulator也被更新到了13.4 (921.4)。

该应用程序能够在物理设备上编译和运行,但任何设备的模拟器都无法通过此阶段。

我得到了以下错误:

为iOS构建,但链接和嵌入式框架“App.framework”是为iOS Simulator构建的。

或者

为iOS Simulator构建,但链接和嵌入式框架“App.framework”是为iOS构建的。

输入图像描述

如何解决这个问题?


所有的答案都不起作用,请查看这个答案:https://dev59.com/SlIG5IYBdhLWcg3wtjy2#65306886。 - Shady Mohamed Sherif
10个回答

63

Xcode 11.4改变了框架的链接和嵌入方式,可能会在iOS设备和模拟器之间切换时出现问题。Flutter v1.15.3及更高版本将自动迁移您的Xcode项目。

要解决问题,请按照以下说明操作:

  • 快速修复(使模拟器正常工作)

rm -rf ios/Flutter/App.framework

  • 官方推荐手动迁移步骤

    1. 从Flutter应用程序目录中,在Xcode中打开ios/Runner.xcworkspace。
    2. 在导航窗格中,找到Flutter组并删除App.framework和Flutter.framework。 enter image description here
    3. 在Runner目标构建设置Build Phases > Link Binary With Libraries中确认App.framework和Flutter.framework不再存在。同时在Build Phases > Embed Frameworks中进行确认。

enter image description here

更改Runner目标构建设置的“Build Phases > Thin Binary”脚本如下:

/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed

/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" thin

enter image description here

在Runner目标的“Build Settings > Other Linker Flags”(其他链接器标志)中,添加$(inherited) -framework Flutter。

enter image description here

希望能有所帮助!


1
运行得非常好! - Giedrius Šlikas
在第一步中需要注意的一件事是 - 移除引用。 - Paras Gupta

13
  1. 从“TARGETS”中选择您的目标
  2. 选择“构建设置”
  3. 在“构建选项”下,将“验证工作区”设置为“是”
  4. 成功构建后,将其设回“否”

原因: 在Xcode 12+中,“验证工作区”的默认选项内部未设置。我们需要手动设置它以避免这种错误。将它设回默认的“否”选项不会有任何问题。


当我迁移到Xcode 12.4时,我也曾在Mapbox工作过。 - malaki1974
请注意,如果您需要在应用程序中使用多个线程并发地读取和写入共享变量,那么只是将变量声明为volatile是不够的。在这种情况下,您应该优先考虑使用一些锁(例如synchronized关键字或ReentrantLock),以确保对变量的所有访问都是互斥的。 尽管volatile可以确保读取/写入操作对其他线程可见,但它不能保证原子性。如果一个线程正在执行一个非原子操作,另一个线程可能会在其执行过程中进行干扰。因此,在某些情况下,您可能需要使用synchronized或ReentrantLock来实现更强的同步保证。总之,您应该根据您的具体需求选择合适的同步机制来确保多线程环境中的数据安全性和正确性。 - Shady Mohamed Sherif

4

Xcode 11.4 更改了框架链接和嵌入的方式,这导致在iOS设备和模拟器之间切换时出现问题。

请按照官方指南迁移您的项目。


在遵循官方指南后,我的应用程序仍然无法在我的物理设备上加载。只有在遵循指南、多次运行 flutter clean、删除 Pods/ 文件夹和 Podfile.lock,然后在 ios 文件夹中使用 pod install 重新安装后,它才终于起作用。 - Matt

3

经过几天的尝试,我终于找到了在iOS设备上测试Flutter应用程序的解决方案:

flutter clean
flutter build ios

-打开xCode并在您的设备上运行应用程序。


仍然对我无效。当我尝试运行 flutter build ios 时,它做了同样的事情。 - Raymond Ativie
5
请点击此链接:https://flutter.cn/docs/development/ios-project-migration。 - gordonturibamwe

3

已升级至Xcode 11.4,iOS 13.4和iPhone X。应用程序仅使用API获取数据。

应用程序在模拟器和设备上开始运行时呈现白屏,然后最终崩溃。

我遵循了官方指南(我还执行了rm -rf ios/Flutter/App.framework),flutter.dev/docs/development/ios-project-migration。我多次运行了flutter clean

由于我正在使用异步数据,所以我还在main()的第一行添加了:

WidgetsFlutterBinding.ensureInitialized();

没有帮助,应用程序也没有启动模拟器。

然后我删除了ios/android/文件夹。在项目文件夹中运行命令flutter create .重新生成上述文件夹。

之后,我的应用程序在模拟器和设备上都可以正常启动。 我希望这能对其他人有所帮助。注意!!如果您手动对这些文件夹进行了任何修改,请先备份或提交。


0

我尝试了Flutter官方网站上的解决方案,但对我没有用,所以我找到了一个临时解决方案,它对我有用,但是需要付出一些努力: 这是我的示例,使用的是名为stuck_framework的全新项目(在模拟器上首次运行)

  1. 我在Flutter项目中创建了两个文件夹,分别为“ios_simulator”和“ios_real_device”。 点击此处查看图片描述

  2. 现在我的第一个构建是针对模拟器的,然后我想切换到真实设备,我将Flutter项目中的ios文件夹移动到“ios_simulator”文件夹中。

  3. 我使用Visual Studio Code打开项目并运行“flutter create .”,现在我将选择一个真实设备来重新构建项目(如果您的模拟器在线,请退出)。 点击此处查看图片描述
  4. 现在我等待构建完成,并在真实设备上运行,没有任何错误。现在我有两个iOS项目,一个用于模拟器,另一个用于真实设备。
  5. 下次当我想再次在模拟器上运行时,我只需删除当前的ios文件夹,并将我放置在“ios_simulator”文件夹中的ios文件夹复制回Flutter项目文件夹即可。希望这可以帮助到您。

0

手动升级Flutter到版本1.15也可以解决这个问题。运行flutter version v1.15.17有所帮助。

同时,你可以通过运行flutter channel命令切换到beta或dev渠道,但一定要确保检查你的代码对所有BC更改都兼容...


0

这里的其他解决方案都对我没用。在我的情况下,问题是通过搜索我的项目中的ONLY_ACTIVE_ARCH并将它们全部更改为YES来解决的。我在这里找到了解决方案:

https://developer.apple.com/forums/thread/656509


0
这个错误是由于 Xcode 11.4 引起的,可以通过 删除/重新嵌入框架并添加一个新的运行脚本阶段来解决。
  • 常规 -> "框架、库和嵌入式内容"下:

    • 删除导致错误的框架。
    • 删除后,在相同位置重新嵌入框架。
  • 构建阶段下添加一个新的运行脚本阶段。

    • 在 "构建阶段" 窗格中选择 "+" 按钮以创建 "新的运行脚本阶段"。

    • 确认该脚本是最底部的构建阶段,并配置其字段。

      • Shell 文本字段应读取 /bin/sh(这是默认值)。
      • 在文本输入区域中,输入 shell 命令 rm -r "FRAMEWORK_DIRECTORY/YOUR_FRAMEWORK.framework/"

Run Script Phase


0
在我的情况下,它只在模拟器(调试)上运行。如果你想要将你的应用程序部署到应用商店(发布),我强烈建议你使用升级Flutter版本。
flutter version v1.15.17

否则你会遇到应用程序崩溃并出现白屏的情况。

只需升级Flutter版本,所有问题都将得到解决。


"1.15.17" 还未在稳定通道上发布。 - Loolooii

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