React Native 在 Swift 下遇见的问题

之前 RN 在别的工程搞得好好的,因为另一个项目用了 Swift,Podfile 里加了一行use_frameworks!,项目突然就不能正常编译了,为此是深深地蛋疼了两天才搞定。。。

这两天主要遇见两个问题,不知道算不算低级问题,也不知道有没有典型性,但是自己被卡了挺久,所以记下来以供日后查阅,若是能够帮到大家那不胜荣幸。

  1. 第一个是静态库用得好好的项目在使用了 use_frameworks!之后就报错不能用了。
    经过多方查探之后最终成功定位问题出在项目的"Other Link Flag"里。修正后的样子如下:
    React Native 在 Swift 下遇见的问题_第1张图片
    image.png

在使用静态库时这里是有一些-l"React"样式的依赖,这些静态库依赖在使用了关键字use_frameworks!之后并没有被正确的删除,导致了依赖库找不到的问题。
删除那几个 React 相关依赖之后工程能够正常运行。此时可以看到默认的$(inherited)关键字自动导入了-framework "DoubleConversion"字样,这与能够正常编译的其他 React Native Swift 程序如官方教程里的 Swift-2048 是一致的。

  1. 第二个问题算是我的项目里特有的奇葩问题。因为大多数人进行 RN 开发的时候目标都是写出纯 RN 或者混编的 app,而我的项目要求的是要开发混编的库。
    APP 开发容易,带 RN 的库的开发就有点坑了。

因为混合开发项目大多是 Cocoapods + React Native 的组合,而React Native 的依赖是由 React Native 本地注入的,并非从 GitHub 拉取,所以开发出来的库的RN 依赖并没有写入到 podspec 中。
在使用这个库的时候,很有可能报
React/RCTBridgeModule.h file not found 的错误
毕竟这里是横向依赖,和其他人遇到的 'react/rctbridgemodule.h' file not found 错误原因虽然都是找不到文件,但是状况和解决方法都是不同的。

一般遇到这个问题是因为 build 工程的时候使用了并行模式,项目在 React build完成之前尝试访问,因此出错,按照常规的取消并行,将 React 作为前置即可。

而横向依赖并不是常见情况,所以 React 再怎么build,它也是不可能找到 React 的。
如果认识到了这个问题的所在,就不难去找到其解决方法。毕竟 React 本身就不只是一个库,它还包括了 DoubleConversion、folly、yoga 等库,所以直接去看 React 是怎么进行横向依赖的,就能够知道这个要怎么写。
以我自己的项目为例,需要在对应的 Pods 中添加 React 的 framework 路径:

image.png

当然,因为通常 Pods 文件夹都是会被排除追踪的,所以这么改了也只是本地能用,如果要在其他设备上编辑或者多人合作,那么需要修改 Podfile:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        if target.name == 'XXX'
            target.build_configurations.each do |config|
                if config.build_settings['FRAMEWORK_SEARCH_PATHS'] == nil
                    config.build_settings['FRAMEWORK_SEARCH_PATHS'] = ""
                end
                config.build_settings['FRAMEWORK_SEARCH_PATHS'] = config.build_settings['FRAMEWORK_SEARCH_PATHS'] + "\"$PODS_CONFIGURATION_BUILD_DIR/React\"" + " " + "\"$PODS_CONFIGURATION_BUILD_DIR/yoga\""
            end
        end
    end
end

安全起见这里我加了判空,因为没怎么写过 ruby,不知道有没有更简洁的写法。

至于有没有办法能把自己开发的三方库对 RN 的依赖写进podspec 里让它自己去操作,我就不知道了,以目前 RN 自己都是没有使用 podspec 的操作手法来说,估计还是不太方便吧。

你可能感兴趣的:(React Native 在 Swift 下遇见的问题)