webrtc 在 mac 编译 Mac 与 IOS

本文将会讲解在 mac 中从拉取代码到打包成 xcframework 的所有步骤,包中包括了ios 与 mac 的所有包。

设置代理

编译 WebRTC 全程需要代理软件,所以建议设置好代理软件。

1
2
export http_porxy="http://127.0.0.1:21087"
export https_porxy="https://127.0.0.1:21087"

注意:即使在 MAC 中开启全局代理,仍然需要设置代理。本人编译时,没配置这个有时候出现无法下载外网资源,即使开了全局代理也没用。

安装 depot_tools

depot_tools 是一套 Google 用来编译 WebRTC 的构建工具,获取 depot_tools 前,请先开启 VPN。

下载 depot_tools 解压到某个目录,然后配置系统环境

1
export PATH=$PWD/depot_tools:$PATH

获取源代码

获取源代码不能使用官网的源代码,必须到 webrtc-sdk 中获取专门为 flutter-webrtc修改过的源码。
获取源码步骤如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkdir webrtc
cd webrtc
touch .gclient
echo "solutions = [
{
"name": "src",
"url": "https://github.com/webrtc-sdk/webrtc.git",
"deps_file": "DEPS",
"managed": False,
"custom_deps": {},
},
]
target_os = ['ios']" > .gclient
sudo gclient sync

生成示例代码

1
gn gen out/ios --args='target_os="ios" target_cpu="arm64" is_component_build=false' --ide=xcode 

替换本地编译 Frameworks

在 flutter-webrtc 的 IOS 目录下面创建 Frameworks 目录,然后修改 podfile 如下所示:

1
2
3
# s.dependency 'WebRTC-SDK', '104.5112.02'
s.ios.vendored_frameworks = 'Frameworks/WebRTC.xcframework'
s.vendored_frameworks = 'WebRTC.xcframework'

异常问题

在拉取源代码的时候、获取依赖或者编译时可能出现各种奇奇怪怪的问题,下面会对一些奇怪问题进行解释与给出解决方法。

  • :fatal: early EOF fatal: index-pack failed

    • 原因:此问题说拉取代码时,容量不够
    • 解决方法:未知原因导致其存储在缓存空间,只要使用 sudo 权限去执行 gclient sync 即可解决问题
  • 下载某个资源时出现 ssl 验证错误。好像是更新 gclient 的时候。

    • 原因:由于我们挂了代理,不知什么原因导致了 ssl 验证失败
    • 解决方法:需要 python 安装一个如下所示的内容,建议直接全局搜索 Certificates.command 这个文件所在位置
      1
      2
      where python3
      sudo python3 install Certificates.command
  • Failed to fetch file gs://chromiumxxxx

    • 原因:不知道啥原因,反正没法下载,只能自己手动下载了
    • 解决方法:将其中的 gs:// 替换为 https://storage.googleapis.com/ 直接下载,然后将其改名为具体文件,放到指定位置下面就行。
    • 补充:MAC 这边一共有 clangclang-formattest-fonts.tar.gz 这几个文件没法下载,手动下载即可。其中 test-fonts.tar.gz 下载下来会是个**.tar 文件,只需要改成 test-fonts.tar 放入指定文件夹即可。
  • error at xtest_module_target="//test:google_test_runner_objc"

    • 原因:目前不知道原因
    • 解决方法:直接去对应位置注释掉这行依赖,仍然可以使用
  • cpid更新失败代理新的配置方案

    • 原因:配置了 https 代理的情况下,会对 ssl 进行验证,而由于我们开了代理,这个验证基本会失败
    • 解决方法:将 https 代理设置成 http 代理就不会出现问题了。export https_porxy="http://127.0.0.1:21087"
  • 可能碰到编译错误——fatal error: ‘libavutil/avconfig.h’ file not found:

    • 原因:目前不知道原因
    • 解决方法:在 src/third_party/ffmpeg/libavutil/avconfig.h 中创建此文件,并填入如下内容:
      1
      2
      3
      4
      5
      6
      /* Generated by ffconf */
      #ifndef AVUTIL_AVCONFIG_H
      #define AVUTIL_AVCONFIG_H
      #define AV_HAVE_BIGENDIAN 0
      #define AV_HAVE_FAST_UNALIGNED 0
      #endif /* AVUTIL_AVCONFIG_H */

引用

IOS技术分享| WebRTC iOS源码下载&编译
记录一次WebRTC iOS的源码编译过程
在windows上编译chrome浏览器Building Chromium for Windows
MacOS Python3.7 出现SSL: CERTIFICATE_VERIFY_FAILED报错解决方案
Build WebRTC library for iOS
【webrtc、gclient】cpid更新失败代理新的配置方案
Flutter插件开发,ios添加本地第三方framework