前言
最近在看 iOS 下WebRTC的代码。想在真机上跑一下它的 Demo 程序 AppRTCMobile 看看是什么效果。但在编译并布署到真机上遇到了各种问题。历经万苦,花了我整整三天的时间才搞定。
因此,特别写下这篇文章做个总结。另外也希望它能帮助到一些人。
获取源码
这在 WebRTC 的官方文档中已经写的非常清楚了。步骤如下:
-
安装 depot_tools
-
下载源码
1. mkdir webrtc-checkout 2. cd webrtc-checkout 3. fetch --nohooks webrtc 4. gclient sync
开发者帐号,你付费了吗?
想要成功编译出AppRTCMobile这个Demo程序并在真机上运行,必须要有开发者帐号。帐号分为个人,公司,企业三种类型,这三种都是可以的,但需要注意两点:
1. 如果是公司或企业帐号一定要有开发者帐号的管理权限。
2. 帐号一定是付费帐号。
为什么要注意这两点呢?因为这里有一个具大的坑,我花了整整三天时间才弄清楚问题的原因。
事情是这样的,我之前申请了开发者帐号,但没有付费。这样,做一般的测试开发是没有问题的,但这种账号却无法编译 AppRTCMobile 程序。原因在于,只有付费的帐号才可以手动创建并下载 Provisioning Profiles 文件。
虽然WebRTC能够创建iOS工程文件,但Xcode无法按自己的规则编译WebRTC及其 Demo 程序的,它必须通过脚本调用ninja进行编译。因此,也就无法像正常的 iOS 应用程序一样,由 Xcode 为开发者自动生成Provisioning文件。没有 Provisioning 文件,就无法正常签名,没有签名也就无法将 Demo 程序安装到真机上。
知道上面的原因后,大家也就明白为什么上面提到的公司或企业帐号要有管理权限的因原了。因为我们要手工创建并下载 Provisioning 文件,没有管理权限就创建不了。
Apple真是坑啊,把安全机制做的这么复杂。
创建 Provisioning 文件
有了开发者帐号,我们就可以手工创建 Provisioning 文件了。
- 登录到developer.apple.com/cn,打开 Certificates, IDs & Profiles。
- 创建一个新的 App ID。注意这个 AppID 要支持 通配符 的那种才行。
- 创建 Provisioning 文件。
-
将 Provisioning 文件下载到 ~/Library/MobileDevice/Provisioning Profiles 目录下。
-
这时,我们可以通过 mobileprovision-read -f ~/Library/MobileDevice/Provisioning\ Profiles/xxx.mobileprovision 看一下创建的内容。
mobileprovision-read 工具可以在 https://github.com/0xc010d/mobileprovision-read 下找到。
生成 xcode 工程
有了 Provisioning 文件,下面的工作就相对简单了。用下面的命令行成 iOS 工程文件。
gn gen out/ios_64 --args='target_os="ios" target_cpu="arm64"
ios_code_signing_identity="xxxxxx"' --ide=xcode
- out/ios_64: 指明工程文件输出地址。
- target_os="ios": 目标操作系统是 iOS。
- target_cpu="arm64": CPU架构是 64 位的。
- ios_code_signing_identity: 指明 identity
- --ide=xcode: 生成 Xcode 工程。
每一个开发者帐号都会有一个 identify,可以通过
xcrun security find-identity -v -p codesigning 命令查看本机所有的 identity.
此时,在 out/ios_64 目录下就已经有了 all.xcworkspace 工程文件,现在用Xcode打开它吧。
对于 iOS 开发人员来说,是不是现在看代码舒服多了?
修改 Info.plist
光做以上修改还是不能编译出可以在真机上运行的 AppRTCMobile 程序的。还有一件关键的事我们还没做,那就是要修改两个 Info.plist 文件。它们分别是:
1. webrtc-checkout/src/webrtc/examples/objc/AppRTCMobile/ios/Info.plist
2. webrtc-checkout/src/webrtc/sdk/objc/Framework/Info.plist
将第一个Info.plist中的CFBundleIdentifier的内容修改为你前面创建AppID为前辍的名子(如 org.youname.apprtcmobile)。第二也这样修改。区别是两者内容不能一样(如 给第二个起的名子是 org.youname.framework)。原因在于,每个 Info.plist 都代表一个应用,两个BundleIdentifier相同的话,iOS就无法区分他们了。
这两个要修改的 Info.plist 文件是我历尽万苦,追踪 WebRTC 编译脚本才发现的哟!
编译与布署
现在我们开始编译AppRTCMobile吧。编译有两种方式,一种是通过Xcode,另一种是执行 ninja 命令。其实 Xcode 也是调用的 ninja 命令进行编译的。命令行如下:
ninja -C out/ios_64 AppRTCMobile
让子弹飞一会儿......
编译完后,我们用 ios-deploy命令进行布署。命令如下:
ios-deploy --justlaunch --debug --bundle my.app
ios-deploy 可以到里看详细信息 https://github.com/davidquesada/ios-deploy
测试
AppRTCMobile 布署好之后,我们可以测试一下了。 AppRTCMobile 使用的 Google 官方的服务器,地址如下:
https://appr.tc/
我们在浏览器里输入这个地址,这样 iOS 端与 Web端就可以进入同一个会议室了。现在就开始的你畅聊吧。
什么?网不通,连上不去?...... 给我留言吧。
结束语
之前在网看看到很多人写相关的文章,但基本上没有一个说的特别详细。所以才有必要写这个篇文章。
希望它能帮助你,并请多多观注, 谢谢!
网友评论
2. webrtc-checkout/src/webrtc/sdk/objc/Framework/Info.plist
这个地方给个赞
直接使用 Pod 也是可以的 pod 'GoogleWebRTC'