ReactNative中升级IOS 17版本Crash解决

这篇具有很好参考价值的文章主要介绍了ReactNative中升级IOS 17版本Crash解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


ReactNative中升级IOS 17版本Crash解决


ReactNative中升级IOS 17版本Crash解决,React-Native,IOS技术学习与实践,ios,react native,objective-c

一、问题描述

业务上用了截图相关UIGraphicsBeginImageContextWithOptions && UIGraphicsEndImageContext 会报出 Assert。

错误信息会是下面这样:

  • UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size={382, 0}, scale=3.000000, bitmapInfo=0x2002. Use UIGraphicsImageRenderer to avoid this assert.

或者会是这样的

  • *** Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloat, BOOL)(), UIGraphics.m:410
二、原因分析

查了下 api,发现 UIGraphicsBeginImageContext 在iOS 17上已经 deprecated 了. 点击这里,看看官方文档 官方文档说明https://developer.apple.com/documentation/uikit/1623922-uigraphicsbeginimagecontext

ReactNative中升级IOS 17版本Crash解决,React-Native,IOS技术学习与实践,ios,react native,objective-c

能够清楚地看到针对以下版本废弃

  • iOS 2.0–17.0 Deprecated
  • iPadOS 2.0–17.0 Deprecated
  • Mac Catalyst 13.1–17.0 Deprecated
  • tvOS 9.0–17.0 Deprecated
  • watchOS 2.0–10.0 Deprecated
  • visionOS 1.0–1.0 Deprecated
三、解决方案决策
3.1 设置宽高为非零值

当我们保证api 宽高不为零,则可正常使用,需要改动的地方较多,可能需要将业务中每一个设置为零属性的地方都得检查

3.2 使用新的UIGraphicsImageRenderer替换就版本的UIGraphicsBeginImageContext

改动较小,只需要改动三方库中原生内容即可,无需针对业务中涉及到的每一个元素进行校验,只需要验证部分页面展示正常即可。

四、可能使用到该API的三方库
4.1 react-native-fast-image

解决方案:react-native-fast-image 官方解决
修改node_modules文件路径: ios/FastImage/FFFastImageView.m


- (UIImage*) makeImage: (UIImage*)image withTint: (UIColor*)color {
    UIImage* newImage = [image imageWithRenderingMode: UIImageRenderingModeAlwaysTemplate];

    UIGraphicsImageRendererFormat *format = [UIGraphicsImageRendererFormat defaultFormat];
    UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:image.size format:format];

    UIImage *resultImage = [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) {
        CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
        [color set];
        [newImage drawInRect:rect];
    }];

    return resultImage;
}


4.2 react-native-linear-gradient

官方解决方案: react-native-linear-gradient 官方解决

按照官方解决,已经提供了新的版本包在npm仓库,此时我们可以去更新源代码或者直接更新版本:

  • 下载是最新的版本
    下载最新版本地址:https://github.com/react-native-linear-gradient/react-native-linear-gradient/releases/tag/v2.8.3
    也可以直接去看看npm仓库。

  • 直接更新源码

如果要更新源代码,则进行更新路径/node_modules/react-native-linear-gradient/ios/BVLinearGradientLayer.m 文件中 display函数。


- (void)display {
    [super display];

    // short circuit when height or width are 0. Fixes CGContext errors throwing
    if (self.bounds.size.height == 0 || self.bounds.size.width == 0) {
      return;
    }

    BOOL hasAlpha = NO;

    for (NSInteger i = 0; i < self.colors.count; i++) {
        hasAlpha = hasAlpha || CGColorGetAlpha(self.colors[i].CGColor) < 1.0;
    }

    if (@available(iOS 10.0, *)) {
        UIGraphicsImageRendererFormat *format;
        if (@available(iOS 11.0, *)) {
            format = [UIGraphicsImageRendererFormat preferredFormat];
        } else {
            format = [UIGraphicsImageRendererFormat defaultFormat];
        }
        format.opaque = !hasAlpha;
        UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:self.bounds.size format:format];
        UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull ref) {
            [self drawInContext:ref.CGContext];
        }];

        self.contents = (__bridge id _Nullable)(image.CGImage);
        self.contentsScale = image.scale;
    } else {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, !hasAlpha, 0.0);
        CGContextRef ref = UIGraphicsGetCurrentContext();
        [self drawInContext:ref];

        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        self.contents = (__bridge id _Nullable)(image.CGImage);
        self.contentsScale = image.scale;

        UIGraphicsEndImageContext();
    }
}

我项目中闪退的就是这个库出的问题,当渐变的文本有内容时,则展示是正常的,但是当文本内容不存在时,就会出现闪退,这就很诡异。

4.3 使用到 UIGraphicsBeginImageContextWithOptions 的三方库还有以下一些:
  • react native本身绘画边框
  • react-native本身图片处理 /node_modules/react-native/Libraries/Image/RCTImageUtils.m
  • react-native-camera
  • react-native-view-shot
  • react-native-svg 文件包含地址: node_modules/react-native-svg/apple/RNSVGRenderable.mm
  • react-native-syan-image-picker 中 TZImagePickerController

其他三方库没有列出来,可以在Xcode中进行搜索 UIGraphicsBeginImageContextWithOptions ,检查是否是有使用到,同时验证显示正常与否。如果显示有问题,则可以去三方库对应的官方Github寻求解决方案或者自行替换。

五、参考地址

Apple官方提问:https://developer.apple.com/forums/thread/733326
Apple官方提问:https://developer.apple.com/forums/thread/731385
github issue:https://github.com/react-native-linear-gradient/react-native-linear-gradient/issues/637
github: https://github.com/ibireme/YYText/issues/984
github:https://github.com/muntius/react-native-fast-image/commit/fc2b8acd97f07989e312f5cbd61d2e541fda3611
github:https://github.com/DylanVann/react-native-fast-image/issues/1002文章来源地址https://www.toymoban.com/news/detail-718472.html


到了这里,关于ReactNative中升级IOS 17版本Crash解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS 17 beta 2有哪些BUG?iOS 17 beta 2推荐升级吗?

    虽然iOS 17 beta 2 带来了大量的功能更新,但毕竟是测试版,海量的适配BUG也一同随之而来。 想升级iOS 17 beta 2的用户不妨先查看下目前存在的问题汇总! 一:存储空间更小了 升级beta1后存储空间缩小了大概3G左右,beta2更新后又缩小了2G。 二:图片显示有问题 iOS 17 beta 2 会导致

    2024年02月11日
    浏览(34)
  • 升级至iOS17公测版系统后如何降级?iOS 17 Beta降级详细教程

    苹果最近发布iOS 17首个公测版,许多果粉都迫不及待地进行了更新。但是不少小伙伴升级iOS 17后iPhone遇到了一些问题,例如APP闪退、吃内存、耗电快等。Bug太多导致体验很差,想要降级到iOS 16系统。 升级iOS 17beta后悔了?其实只要苹果没有关闭iOS 16系统正式版的验证通道,已

    2024年02月13日
    浏览(48)
  • Xcode升级到15.0 iOS17.0会出现的问题

    解决办法: Build Settings 搜索 User Script Sandboxing ,把== User Script Sandboxing== 改为 NO 。 解决办法:全局搜索 DT_TOOLCHAIN_DIR ,一键替换成 TOOLCHAIN_DIR 。 解决方法:去pod里面搜索 iOS Deployment Target ,全部替换成最低支持iOS 12.0 解决方法:将Build Phases中的各项重新拖动排序,按以下顺序

    2024年02月08日
    浏览(30)
  • 升级iOS 17出现白苹果、不断重启等系统问题怎么办?

    iOS 17发布后了,很多果粉都迫不及待的将iphone/ipad升级到最新iOS17系统,体验新系统功能。 但部分果粉因硬件、软件的各种情况,导致升级系统后出现故障,比如白苹果、不断重启、卡在系统升级界面等等问题。 如果遇到了这些系统问题,首选我们可以选择强制重启设备来修

    2024年02月09日
    浏览(37)
  • 升级iOS17后iPhone无法连接App Store怎么办?

    最近很多用户反馈,升级最新iOS 17系统后打开App Store提示\\\"无法连接\\\",无法正常打开下载APP。 为什么升级后无法连接到App Store?可能是以下问题导致: 1.网络问题导致App Store无法正常打开 2.网络设置问题 3.App Store服务器问题导致无法正常使用 4.系统问题也有可能导致App Store无

    2024年02月10日
    浏览(38)
  • iPhone升级iOS17出现无法连接互联网的错误提示怎么办?

    最新的iOS 17系统已经发布了快一个月了,很多人都已升级体验更多全新功能,但有部分用户却在升级过程中遇到一些问题:如无法验证更新,iOS17验证失败,因为您不再连接到互联网、 iPhone无法检查更新等错误问题。明明网络稳定,手机也可以正常浏览其他网站与APP,但就是

    2024年02月08日
    浏览(50)
  • 免费升级到 iOS 17 Developer Beta:官方Apple Store升级方案与爱思助手方法比较

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月11日
    浏览(33)
  • React16、17、18版本新特性

    react-16版本新特性 一、hooks 二、memo、lazy、Suspense 三、Profiler Profiler 能添加在 React 树中的任何地方来测量树中这部分渲染所带来的开销 四、createContext、createRef、forwardRef、生命周期函数的更新、Strict Mode 五、Fragment 六、createPortal react-17版本新特性 一、全新的 JSX 转换 React 17以

    2024年02月05日
    浏览(31)
  • 【Flutter】flutter和react-native的性能对比

    Flutter和React Native是两个流行的跨平台移动应用开发框架。它们都提供了一种方式来使用一套代码编写应用程序,并运行在多个平台上,如iOS和Android。 就性能而言,Flutter和React Native在某些方面有一些差异。下面是一些比较常见的性能方面的对比: 渲染性能: Flutter使用自己的

    2024年02月10日
    浏览(33)
  • 【IOS】Xcode 15.2版本下载 iOS_17 Simulator失败

    Xcode更新15.2自身不带iOS_17 Simulator模拟器的,然而在使用自带的get下载安装会一直在40进度左右出现因为网络问题安装失败的情况,一般这种情况在断点处重试安装也还好,但是每次重试都是需要重新下载,因为本身下载又很慢,又总是在40左右出现此问题,所以只能尝试自行

    2024年02月20日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包