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 的问题,还是成就感满满的。虽然解决的方式有点像破屋子打补丁,如果有更好的解决方式,请不吝指教。

相关推荐
mike102328 分钟前
swiftUI状态管理
ios·swiftui
2501_915106322 小时前
H5 混合应用加密实践,从明文资源到安全 IPA 的多层防护体系
android·安全·ios·小程序·uni-app·iphone·webview
kdniao13 小时前
iOS应用集成物流API接口:架构设计、性能优化与用户体验实践指南
ios·性能优化·ux
2501_916007473 小时前
在 CICD 中实践 Fastlane + Appuploader 命令行,构建可复制的 iOS 自动化发布流程
android·运维·ios·小程序·uni-app·自动化·iphone
2401_860319523 小时前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:Badge 徽标(在右上角展示徽标数字或小红点)
react native·react.js·harmonyos
2501_915921433 小时前
从 HBuilder 到 App Store,uni-app 与 HBuilder 项目的 iOS 上架流程实战解析
android·ios·小程序·https·uni-app·iphone·webview
北辰alk4 小时前
React Native 工作原理深度解析:Bridge 机制与核心架构
react native
Sheffi665 小时前
Swift 与 OC 混编底层交互原理
ios·objective-c·swift
游戏开发爱好者85 小时前
以 uni-app 为核心的 iOS 上架流程实践, 从构建到最终提交的完整路径
android·ios·小程序·https·uni-app·iphone·webview
2401_860494705 小时前
在React Native鸿蒙跨平台开发中实现一个桶排序算法,如何使用任何排序算法对每个桶中的元素进行排序,再将所有桶中的元素合并成一个有序数组
javascript·react native·react.js·ecmascript·排序算法·harmonyos