我有一个 Electron 应用程序,发布在 Mac AppStore 上,并且是沙盒的。
我正在尝试添加一个新功能,可以动态编码/解码视频,这样我就可以在 Electron 上下文中流式传输更多视频格式。
我在用着流利的 ffmpeg https://github.com/fluent-ffmpeg/node-fluent-ffmpeg and a ffmpeg 的静态执行 https://evermeet.cx/ffmpeg/.
一切都工作得很好,我已经将沙盒应用程序上传到 Apple,但被拒绝了,因为 ffmpeg 默认使用使用非公共 API 的安全传输协议,这就是他们向我发送的拒绝内容:
您的应用程序使用或引用以下非公共 API:
'/System/Library/Frameworks/Security.framework/Versions/A/Security'
: SecIdentity创建
好吧,经过大量调查,看来我必须自己编译 ffmpeg--disable-securetransport
旗帜。很简单,我使用与我下载的静态构建相同的配置,只需添加新标志即可。
我设法安装所需的所有依赖项,除了libxavs
,我想没什么大不了的,只需从配置命令中删除它的标志:
./configure \
--cc=/usr/bin/clang \
--prefix=/opt/ffmpeg \
--extra-version=tessus \
--enable-avisynth \
--enable-fontconfig \
--enable-gpl \
--enable-libass \
--enable-libbluray \
--enable-libfreetype \
--enable-libgsm \
--enable-libmodplug \
--enable-libmp3lame \
--enable-libopencore-amrnb \
--enable-libopencore-amrwb \
--enable-libopus \
--enable-libsnappy \
--enable-libsoxr \
--enable-libspeex \
--enable-libtheora \
--enable-libvidstab \
--enable-libvo-amrwbenc \
--enable-libvorbis \
--enable-libvpx \
--enable-libwavpack \
--enable-libx264 \
--enable-libx265 \
--enable-libxvid \
--enable-libzmq \
--enable-libzvbi \
--enable-version3 \
--pkg-config-flags=--static \
--disable-securetransport \
--disable-ffplay
使用新的 ffmpeg exec,一切仍然按预期工作。但是,一旦我对应用程序进行打包、签名和沙箱处理,当我尝试启动它时,ffmpeg 就会停止工作并抛出此错误:
An error occurred ffmpeg was killed with signal SIGABRT Error: ffmpeg was killed with signal SIGABRT
at ChildProcess.eval (webpack:///../node_modules/fluent-ffmpeg/lib/processor.js?:180:22)
at emitTwo (events.js:125:13)
at ChildProcess.emit (events.js:213:7)
at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)
我尝试删除--disable-securetransport
标记,看看它是否会弄乱某些东西,结果相同。
我尝试在 Linux 机器上进行编译,只是为了看看它是否有帮助,同样的事情。
一旦我使用自定义编译的执行程序,它就无法在沙箱中工作,但是当使用静态执行程序时,一切正常(在我xattr
它,因为它被隔离并阻止在沙箱中 https://derflounder.wordpress.com/2012/11/20/clearing-the-quarantine-extended-attribute-from-downloaded-applications/).
我注意到的唯一奇怪的事情是,我的自定义编译只有 20mo 左右,而我下载的静态安装是 43mo。
我真的被这个问题困扰了。