react native iOS 升级 sdk 实践

最近做 iOS app submit 的时候报了一个警告,提示当前项目使用的 sdk 版本过低,4 月底后就不能再提交了,除非对它进行升级。目前项目构筑使用的 xcode 版本是 14.2,查询 developer.apple.com/cn/support/... 可以得知 14.2 对应的是 iOS 16.2 ,而 5 月开始最低的版本都已经要 17.0 以上了,因此着手准备升级工作。

改 xcode 版本

我司使用的是 microsoft app center,上面可以配置 xcode 的版本以及证书等信息。首先当然是改 xcode 的版本,如果能一次 build 成功的话,我们也就不必辛苦的搭建本地环境去构建了,我把 xcode 的版本升到了 15.2,然后发现失败了,于是开始本地调试

找到并改正问题

调试过程中我发现问题只要出现在 GoogleDataTransport 和 yoga 这两个 lib 上

GoogleDataTransport 报错的地方不少,但问题都一样,都是 A function declaration without a prototype is deprecated in all versions of C

以下展示下报错的一处地方

m 复制代码
GDTCORNetworkType GDTCORNetworkTypeMessage() {

#if !TARGET_OS_WATCH

  SCNetworkReachabilityFlags reachabilityFlags = [GDTCORReachability currentFlags];

  **if** ((reachabilityFlags & kSCNetworkReachabilityFlagsReachable) ==

      kSCNetworkReachabilityFlagsReachable) {

    **if** (GDTCORReachabilityFlagsContainWWAN(reachabilityFlags)) {

      **return** GDTCORNetworkTypeMobile;

    } **else** {

      **return** GDTCORNetworkTypeWIFI;

    }

  }

#endif

  **return** GDTCORNetworkTypeUNKNOWN;

}

改动也很简单,在入参处加个 void 即可,即 GDTCORNetworkType GDTCORNetworkTypeMessage(void)


yoga 报的问题是 Use of bitwise '|' with boolean operands

C++ 复制代码
node->setLayoutHadOverflow(

        node->getLayout().hadOverflow() |

        currentRelativeChild->getLayout().hadOverflow());

改动同样简单,| 改成 || 即可,即 node->getLayout().hadOverflow() ||

以上问题全部改完后,项目确实能跑起来了

应用在 micorsoft app center 等类似的分发工具上

上面的改动都是对 Pods 文件夹下源码的改动,很显然,在大多数公司的工作流程中,直接改动生成的源码然后去构建是不现实的,比如我司使用的 app center 上,开发人员提交代码到特定分支上,然后 app center 会自动执行 pod install 命令,这样的话,问题仍没有解决。因此,针对 GoogleDataTransport 和 yoga,我使用了不同的解决策略

关于 GoogleDataTransport 的报错,其实是 CLANG_WARN_STRICT_PROTOTYPES 为 YES 的原因,可以在 Podfile 中把该配置改成 NO

Podfile 复制代码
     installer.pods_project.targets.each do |target|
       if target.name.start_with? "GoogleDataTransport"
         target.build_configurations.each do |config|
           config.build_settings['CLANG_WARN_STRICT_PROTOTYPES'] = 'NO'
         end
       end
     end

Yoga 我目前使用的 1.14.0 版本,github 有 issue 提到 1.19.0 版本解决了这个问题,但由于 yoga 是绑定在 RN 下的,如果升级 yoga ,就需要升级 RN,代价太大 退而求其次,我将 yoga 的内容从 node_modules 搬到了 ios 文件夹下,然后把 | 改成 ||

Podfile 复制代码
  # pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true
  pod 'Yoga', :path => './yoga', :modular_headers => true

以上的都提交到了 git 上后,app center 终于能成功出 build 了,下载下来后也不出现闪退等问题,改动成功

总结

作为一个 iOS 小白,能靠自己成功的解决升级 sdk 的问题,还是成就感满满的。虽然解决的方式有点像破屋子打补丁,如果有更好的解决方式,请不吝指教。

相关推荐
叹一曲当时只道是寻常10 小时前
Xcode 接入智谱 GLM Coding Plan 报错解决方案
ai·xcode
麦客奥德彪11 小时前
客户端 Trace Benchmark 体系设计
ios·数据分析
Embrace92415 小时前
React Native + Realm 离线方案处理
javascript·react native·react.js·realm
Cxiaomu19 小时前
React Native 双端一体工程,如何实现分端运行与分端打包?
javascript·react native·react.js
Digitally20 小时前
6 种简易方法轻松连接 iPad 与电脑
ios·电脑·ipad
早點睡39021 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-shadow-2
javascript·react native·react.js
早點睡3901 天前
ReactNative项目OpenHarmony三方库集成实战:react-native-vector-icons
javascript·react native·react.js
2501_915921431 天前
uni-app一键生成iOS安装包并上传TestFlight全流程
android·ios·小程序·https·uni-app·iphone·webview
sp42a1 天前
如何在 NativeScript 中使用 iOS 的 Metal 着色器
ios·着色器·nativescript
早點睡3901 天前
ReactNative项目OpenHarmony三方库集成实战:react-native-fs
javascript·react native·react.js