如何 运行 CocoaPods on Apple Silicon (M1)

How to run CocoaPods on Apple Silicon (M1)

我有一个 Flutter 项目,我正尝试 运行 iOS。它 运行 通常在我的基于 Intel 的 Mac 上,但在我新的基于 Apple Silicon 的 M1 Mac 上它无法安装 pods。

LoadError - dlsym(0x7f8926035eb0, Init_ffi_c): symbol not found - /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi_c.bundle
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi.rb:6:in `rescue in <top (required)>'
/Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi.rb:3:in `<top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Library/Ruby/Gems/2.6.0/gems/ethon-0.12.0/lib/ethon.rb:2:in `<top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Library/Ruby/Gems/2.6.0/gems/typhoeus-1.4.0/lib/typhoeus.rb:2:in `<top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/sources_manager.rb:74:in `cdn_url?'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/sources_manager.rb:36:in `create_source_with_url'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/sources_manager.rb:21:in `find_or_create_source_with_url'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:178:in `block in sources'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:177:in `map'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:177:in `sources'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:1073:in `block in resolve_dependencies'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/user_interface.rb:64:in `section'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:1072:in `resolve_dependencies'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:124:in `analyze'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer.rb:414:in `analyze'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer.rb:239:in `block in resolve_dependencies'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/user_interface.rb:64:in `section'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer.rb:238:in `resolve_dependencies'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer.rb:160:in `install!'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/command/install.rb:52:in `run'
/Library/Ruby/Gems/2.6.0/gems/claide-1.0.3/lib/claide/command.rb:334:in `run'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/command.rb:52:in `run'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/bin/pod:55:in `<top (required)>'
/usr/local/bin/pod:23:in `load'
/usr/local/bin/pod:23:in `<main>'

基于 Github 解决方法,我尝试使用 rosetta 运行 终端,但问题仍然存在:https://github.com/CocoaPods/CocoaPods/issues/9907#issuecomment-655870749

意识到 Mac 使用 Apple Silicon 还为时过早。有没有什么办法可以暂时解决这个问题?

编辑:我最近禁用了 Rosetta,Cocoapods 在添加 ffi gem.

后运行良好

对于遇到此问题的其他人,我只是找到了解决方法。除了 Rosetta 中的 运行 终端:

  1. 在 Finder 中右键单击“终端”
  2. 获取信息
  3. 用 Rosetta 打开

我安装了一个gem,貌似与错误中未找到的符号有关:

sudo gem install ffi

执行此操作后,cocoapods 将按预期运行。

我也遇到了同样的问题。我确实发现 cocoa pods UI 应用程序似乎按预期工作。

要使用 M1 芯片 (Apple Silicon) 在 Mac 上完全安装 cocoapods,请按照以下步骤操作:

  1. 在 Utilities 文件夹中复制终端应用程序。
  2. 右键单击应用程序并选择“获取信息”。
  3. 根据需要重命名应用程序的其他版本。
  4. 选中“使用 Rosetta 打开”选项。
  5. 使用命令“sudo gem install cocoapods”安装 Cocoapods
  6. 键入命令行“gem install ffi”以修复 ffi 包问题。 现在您可以毫无问题地执行“pod install”。

来源:iPhoneSoft

尝试 $ sudo gem 安装 ffi。它对我来说很好用。

这是我在本机终端中尝试安装 ffi 时得到的结果:

Fetching ffi-1.13.1.gem
Building native extensions. This could take a while...
ERROR:  Error installing ffi:
    ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/ext/ffi_c

切换到启用 Rosetta 的终端,安装“gem install cocoapods”失败

You don't have write permissions for the /usr/bin directory.

但随后 ffi 安装成功...

终于用

解决了
sudo gem install cocoapods -n /usr/local/bin

Rosetta 2 中 运行 终端的替代方法是使用 arch -x86_64 设置体系结构,如下所示:

arch -x86_64 sudo gem install cocoapods -n /usr/local/bin

为了给予应有的信任,我在这里找到了这个解决方案

MacPorts bug tracker, issue #61545, 评论 7

2022 年 5 月更新

如果你可以使用 Homebrew 来管理 cocoapods。

# Uninstall the local cocoapods gem
sudo gem uninstall cocoapods

# Reinstall cocoapods via Homebrew
brew install cocoapods

2021年解决方案

# STEP 1: Install ffi
sudo arch -x86_64 gem install ffi

# STEP 2: Re-install dependencies
arch -x86_64 pod install

附加信息

#1 对于看到 arch: posix_spawnp: gem: Bad CPU type in executable 错误的任何人,您必须先安装 Rosetta。谢谢,@Jack Dewhurst

#2 如果您经常使用 运行 pod 命令,在 .zshrc.bash_profile 中设置别名可能会很方便。谢谢@theMoonlitKnight 的建议。

alias pod='arch -x86_64 pod'

如果您在一个需要移植的旧项目上,请不要忘记更新 Runner.xcodeproj 和 Pods.xcodeproj.

中的 project.pbxproj 文件

IPHONEOS_DEPLOYMENT_TARGET 可能仍然指向 8.0

更新所有匹配项如下:

IPHONEOS_DEPLOYMENT_TARGET = 9.0;

在将新的依赖项 (Firebase) 添加到存储库后,我确实遇到了这个问题。然后能够执行 sudo arch -x86_64 gem install ffi,但其他问题仍然存在。

我的解决方法是: 重新克隆存储库并再次运行。

设置:Xcode12.4MacM1 react-native 63.4

TL;DR:

  • 使用 Homebrew / rbenv / RVM 安装你自己的 Ruby 版本(例如 brew install ruby
  • 将它和 gems 二进制文件添加到您的 PATH 并确保新版本与 which ruby 一起使用(如果安装有 /opt/homebrew/opt/ruby/bin/ruby 而不是 /usr/bin/ruby自制软件)
  • 使用 sudo gem install cocoapods 安装 CocoaPods(确保 ethon 至少是版本 0.13.0)
  • 运行pod install

详细答案:

所有建议使用 Rosetta / arch -x86_64 的答案都是解决方法,并不能完全解决 RbConfig 和通用二进制文件工作方式带来的真正问题。

require 'rbconfig'

OSVERSION = RbConfig::CONFIG['host_os']
ARCH = RbConfig::CONFIG['arch']
HOSTCPU = RbConfig::CONFIG['host_cpu']
BUILDCPU = RbConfig::CONFIG['build_cpu']
TARGETCPU = RbConfig::CONFIG['target_cpu']

puts "OS: #{OSVERSION}"
puts "Arch: #{ARCH}"
puts "Host CPU: #{HOSTCPU}"
puts "Build CPU: #{BUILDCPU}"
puts "Target CPU: #{TARGETCPU}"

如果您使用 macOS 附带的通用二进制文件对包含此代码的文件调用 ruby,您将在 M1 Mac 上获得以下结果:

OS: darwin20
Arch: universal-darwin20
Host CPU: x86_64
Build CPU: x86_64
Target CPU: universal

如您所见,RbConfig 是为“通用”CPU 编译的,但使用 x86 CPU 和生成的 rbconfig.rb 文件构建(参见 /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin20/rbconfig.rb) 因此使用主机 CPU.

的无效信息

由于 ffi 使用来自 RbConfig 的信息(参见 https://github.com/ffi/ffi/blob/dfae59e293974efaa7b4d414e5116d7a2187a06e/lib/ffi/platform.rb#L61 and https://github.com/ffi/ffi/blob/e3f2cf9b82055709ddbeecbf77810f43438c4b64/spec/ffi/fixtures/compile.rb#L11),我们最终得到 OP 的错误消息。

因此,解决方案是使用 Homebrew、rbenv 或 RVM 获取专为 arm64 构建的 Ruby 版本。

对于自制软件:

  • 执行brew install ruby
  • export PATH=/opt/homebrew/opt/ruby/bin:/opt/homebrew/lib/ruby/gems/3.0.0/bin:$PATH 添加到您的 .zshrc(如果需要,您可以使用 $(brew --prefix) 找到您的 Homebrew 安装目录)
  • 执行source ~/.zshrc或重启你的shell
  • 通过执行 which ruby(应该是 $(brew --prefix)/opt/ruby/bin/ruby
  • 确保您使用的是正确的 ruby 二进制文件
  • 使用 sudo gem install cocoapods
  • 安装 CocoaPods
  • 通过执行 which pod(应该是 $(brew --prefix)/lib/ruby/gems/3.0.0/bin/pod
  • 确保您使用的是正确的 pod 二进制文件
  • 确保ethon是0.13.0或更高版本gem info ethon,否则运行sudo gem install ethon
  • 运行pod install

Ruby 默认情况下不会随未来的 macOS 版本一起提供

此外,需要注意的是,ruby 仍然包含在 macOS 中只是为了“与旧版软件兼容”,正如 运行ning irb -v 所证明的那样,所以这可能是无论如何,这是安装您自己的版本的好机会:

WARNING: This version of ruby is included in macOS for compatibility with legacy software. In future versions of macOS the ruby runtime will not be available by default and may require you to install an additional package.

irb 1.0.0 (2018-12-18)

来源:

我遇到了同样的问题,这对我有帮助。打开终端并输入以下命令:

arch -x86_64 sudo gem install ffi

3 月 28 日更新

1- arch -x86_64 sudo gem install cocoapods -n /usr/local/bin

2- arch -x86_64 sudo gem install ffi

3- pod install

无需复制或使用 Rosetta 打开

关于更新pods,也许有人会帮忙:

安装 ffi 后:

sudo arch -x86_64 gem install ffi

更新依赖项

arch -x86_64 pod update

我对这个答案有疑问:

  1. 运行
sudo gem install ffi
  1. 转折我重新启动了我的机器,然后就可以了。

安装 cocoapods

sudo arch -x86_64 gem install ffi

安装 pod 文件

arch -x86_64 pod install

更新广告连播

arch -x86_64 pod update

自 2021 年 1 月 7 日版本 1.10.1 起,CocoaPods 现已支持新的 M1 芯片。

IN MAC M1,适用于任何使用 KMM(Kotlin Multiplatform Mobile)的人,但它可能适用于其他人,发现它不会在 .xcworkspace 对于 iOS APP,当使用 CocoaPods 作为依赖管理器时,首先通过输入

安装 CocoaPods
sudo gem install cocoapods

然后导航到您的项目文件夹,现在在 iOS 文件夹中并键入

sudo arch -x86_64 gem install ffi
arch -x86_64 pod install

现在您应该在 iOS 工作区中找到所有文件。 如果你有问题

/Users/$name/$directory/$projectName/$iosFolderName/$iosAppName.xcodeproj 
The linked and embedded framework 'Pods_iosApp.framework' is missing one or more architectures required by this target: x86_64.

需要在xCode中添加arm64,点击项目文件夹->Build Settings->搜索对于 Excluded Architectures 并添加 arm64

  1. 执行下面到安装 所需的 ffi :

    sudo arch -x86_64 gem install ffi

  2. 代替pod install使用:

    arch -x86_64 pod install

不使用rosetta终端在项目中安装pod 只需按照以下步骤

  • sudo arch -x86_64 gem 安装 ffi
  • arch -x86_64 pod 安装

我的新 MacBook Air M1 遇到了同样的问题,只是因为 m1 的架构不同,我们应该使用 Rosetta Translation Environment.

安装软件包

使用rosetta可以解决大部分兼容性问题。

解决步骤:

  1. 打开finder/applications
  2. 复制您的终端
  3. 右键单击新终端并选中复选框 [x] 使用
  4. 打开

然后用这个终端安装包

2021年9月工作,MacM1

我只想添加到 ,以便在 iOS 文件夹内的同一终端内执行“pod repo 更新”,因为这对我来说非常重要地修复了错误。

这是完整的待办事项列表:

  1. 复制实用程序文件夹中的终端应用程序。

  2. 右键单击应用程序并选择“获取信息”。

  3. 根据需要重命名应用程序的其他版本。

  4. 选中“使用 Rosetta 打开”选项。

  5. 使用命令sudo gem install cocoapods

    安装Cocoapods
  6. 键入命令行 sudo gem install ffi 修复 ffi 包问题。

  7. 在同一终端中转到您的应用程序的 iOS 文件夹

  8. pod repo update

  9. 现在您可以毫无问题地完成 pod install

如果你的情况是你已经更新了你的项目并且已经安装了 ffi,你将需要运行这个:

arch -x86_64 pod install --repo-update

Final 运行 Mac 1 Silicon 0.65(任何版本)

Npx react-native init Nitin2

然后更改pod文件

转到

镉iOS

打开 pod 文件

添加

平台:ios,'12.1'

use_flipper!() post_install 执行 |installer| react_native_post_install(安装程序)installer.pods_project.build_configurations.each 执行 |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" 结束结束

通过添加新的 swift 文件和桥头,添加桥头后请删除 swift 文件,否则 swift 文件可能会产生错误。

Pod 文件

用于创建 Swift 文件。

转到项目 nitin2 -> Nitin2(子项目)并右键单击它单击新建文件 Select swift 文件 -> 下一步 然后 select nitin2 目录在 iOS文件夹保持文件名相同点击目标中的复选框nitin2点击创建现在它会要求创建桥接header.h是创建文件现在转到

转到项目 nitin2 -> Nitin2(子项目)查看 file.swift 并将其删除。

xcode添加桥头arm64

现在转到 Xcode -> target Nitin2 -> build setting 在 ARCHITECTURES 中点击 EXCLUDED ARCHITECTURES 并添加 arm64

现在从 Xcode 产品菜单中删除构建文件夹

现在通过终端做这些事情

cd 到iOS 目录

pod 缓存清理 --all

纱线缓存清理

rm -rf ~/Library/Developer/Xcode/DerivedData/*

打开nitin2.xcworkspace

rm -rf Pods Podfile.lock

pod 分解 && pod 设置 && pod 安装

代码/Users/nitin/D1/www/projects//ios/Pods/../../node_modules/react-native/React/FBReactNativeSpec/../../scripts/generate-specs.sh

添加导出路径=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

然后运行 iOS npx react-native 运行-ios

我的解决方案是在创建命令的开头添加 arch -x86_64

Pod 未安装在 M1 芯片上 MAC ???不用担心

运行 下面三个命令:-

pod deintegrate

sudo arch -x86_64 gem install ffi

arch -x86_64 pod install

有效!!

如果你使用的是M1芯片系统那么使用-

转到应用程序文件夹-

select 终端打开 rosseta- 然后 运行 cmd-

sudo arch -x86_64 gem install ffi

然后

arch -x86_64 pod install

✅ 以下解决方案适用于我的 Apple M1 机器。

我花了一个多星期的时间寻找在 M1 机器上成功安装 CocoaPods 的解决方案。你可以看看我的方法是否适合你。

解决方案要求Terminal.app在“Rosetta”模式下运行ning。

但它不需要终端在 x86 中 运行ning。

[环境]

Mac mini(M1,2020)/macOS Big Sur(版本 11.5.2)/Xcode 版本 13.0 (13A233)


终端 + Rosetta

(安装 CocoaPods 需要 Rosetta)

到运行“Rosetta”模式下的terminal.app,

右键单击 Terminal.app > Select“获取信息”>确保“使用 Rosetta 打开 " 已选中。


步骤

(1) 运行 以下行用于更新 gem.

确保您 gem 版本在执行以下任何命令之前是最新的。此更新由 this article 在 Medium 上介绍。

sudo gem update -n /usr/local/bin --system

sudo gem install  -n /usr/local/bin cocoapods --pre

(2) 使用“sudo”命令执行命令。

sudo gem install

(3) 安装旧版本的 CocoaPods

因为我的情况无法安装最新版本(1.10.0)。我试过安装旧版本。该行执行成功,没有任何错误消息。

你可以在Apple的论坛上查看the thread

sudo gem install -n /usr/local/bin cocoapods -v 1.8.4

错误解决方案

然后,编译器可能会给您带来一些错误,例如“不存在活动开发人员路径”。如果您在计算机上安装了 Xcode 的测试版,则会显示此错误。

您需要 运行 以下行,编译器才能切换到新的活动路径,指向新的 Xcode 应用程序。

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

如果您的 Xcode 拒绝切换,您可以查看 this thread Apple 论坛以查看是否有帮助。


最后一步⬇️

(1) 取消选中“使用 Rosetta 打开

然后,可以返回“信息”面板并取消选中“使用 Rosetta 打开”,但取消选中 Rosetta 是可选的。如果需要,您可以选中此框。

(2) 运行 CocoaPods 照常命令

之后,您可以回到项目目录并运行命令pod init像往常一样为您的项目启动CocoaPods

正常 CocoaPods 构建的步骤:

  1. pod init
  2. open Podfile
  3. edit Podfile(用于指定pods)
  4. pod install
  5. .xcworkspace 已准备好在 Xcode.
  6. 中打开

如果遇到错误(关于 Xcode 注册),请使用 sudo xcodebuild -license

这就是我在 M1 中解决问题的方法。有人可能会得到帮助。

来自系统偏好设置。用户和组。将登录 shell 设置为

   /bin/bash 

然后关闭终端并重新打开it.run这个命令

sudo gem install -n /usr/local/bin cocoapods -v 1.8.4

希望这会奏效。

这对我有用,试图在 Mac M1

上构建应用程序

首先转到您的 applications 文件夹,然后

select terminal 应用 -> 获取信息 -> select run with rosseta

// if you are trying to build the app through xcodexcode 应用程序

重复上述步骤

注意:确保您的终端和代码在执行此操作时已关闭。

现在运行你的终端切换到你的project_folder/ios

运行 下面显示的命令

sudo gem install cocoapods

sudo gem install ffi

sudo arch -x86_64 gem install ffi

以上所有解决方案都是有效的,只是想 post 使用 home brew 和 cocoapods 支持原生 Apple Silicon 芯片,您可以 运行 命令不带前缀 arch -x86_64

所以,sudo gem install ffi 会完成这项工作。

有很多“better/easier?”现在水已经解决了,通过使用自制软件的方式,如果你有自制软件安装 运行

brew install cocoapods

这将安装 ruby 和 libyaml 作为先决条件,这是迄今为止最直接的方式(也是最有可能被推荐的方式)。

基本上尝试了这里列出的所有解决方案。

$ arch -arm64 brew install cocoapods

终于为我做到了。

在此之前,请确保已正确安装自制软件,并以 /opt/homebrew 为前缀。 This 文章对此提供了很好的说明。

编辑:另一种选择是删除所有 flutter 和 dart 文件,只使用 homebrew 完成完整的安装过程,如 here 所示。这也适用于我的 M1 Pro。

我找到的最简单的方法:

sudo gem uninstall cocoapods

brew install cocoapods

MacM1MacOSBigSur解法:

brew cleanup -d -v    
brew install cocoapods
brew link --overwrite cocoapods

没有 Rosetta 你可以这样做

  1. 确保 OS 更新到 macOS Big Sur 11.3.1
  2. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  3. brew install cocoapods

点击右键打开获取信息菜单 选中“使用 rosetta 打开”

sudo gem 安装 cocoapods

sudo gem 安装 ffi

sudo gem update --system // 更新 ruby

如果不起作用:

安装一个 ruby 管理器,我更喜欢 rvm

rvm 安装:

  • $brew install gnupg
  • gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
  • \curl -sSL https://get.rvm.io | bash

别忘了添加 bash 个人资料:

export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to path for scripting (to manage Ruby versions) export PATH="$GEM_HOME/bin:$PATH" [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session as a function

  • 检查

$rvm -list

rvm安装成功后的命令

  • 安装新的 ruby 版本:

$rvm install 3.1.2

  • Select默认版本:

$rvm --default use 3.1.2

然后重启终端并运行 $sudo gem install cocoapods