我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ReactNative中升级IOS 17版本Crash解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ReactNative中升级IOS 17版本Crash解决


ReactNative中升级IOS 17版本Crash解决


在这里插入图片描述

一、问题描述

业务上用了截图相关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

在这里插入图片描述

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

  • 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


来源地址:https://blog.csdn.net/suwu150/article/details/133103248

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ReactNative中升级IOS 17版本Crash解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

win10版本1903更新升级黑屏如何解决

这篇文章主要介绍“win10版本1903更新升级黑屏如何解决”,在日常操作中,相信很多人在win10版本1903更新升级黑屏如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win10版本1903更新升级
2023-07-01

node版本升级npm命令警告怎么解决

这篇文章主要介绍了node版本升级npm命令警告怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇node版本升级npm命令警告怎么解决文章都会有所收获,下面我们一起来看看吧。引言使用 nvm 升级 nod
2023-07-02

win101803版本无法更新升级1809如何解决

本篇内容主要讲解“win101803版本无法更新升级1809如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win101803版本无法更新升级1809如何解决”吧!1、按住Win键+R键打
2023-07-01

win10版本1903升级1909失败0x800f0982如何解决

这篇文章主要介绍“win10版本1903升级1909失败0x800f0982如何解决”,在日常操作中,相信很多人在win10版本1903升级1909失败0x800f0982如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-07-01

win10版本1803无法升级1903系统如何解决

这篇文章主要介绍“win10版本1803无法升级1903系统如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win10版本1803无法升级1903系统如何解决”文章能帮助大家解决问题。方法:一
2023-07-01

win10更新升级2004版本卡在92%如何解决

本文小编为大家详细介绍“win10更新升级2004版本卡在92%如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“win10更新升级2004版本卡在92%如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-07-01

win10安装升级1909版本卡在92%如何解决

这篇文章主要介绍了win10安装升级1909版本卡在92%如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win10安装升级1909版本卡在92%如何解决文章都会有所收获,下面我们一起来看看吧。方法一:
2023-07-01

win10版本1803升级更新错误0x80004005如何解决

这篇“win10版本1803升级更新错误0x80004005如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10
2023-07-01

win10版本1903更新升级错误代码0x800f081f如何解决

这篇文章主要介绍了win10版本1903更新升级错误代码0x800f081f如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win10版本1903更新升级错误代码0x800f081f如何解决文章都会有所收
2023-07-01

MySQL驱动mysql-connector-java升级到8.0.X版本问题怎么解决

这篇文章主要讲解了“MySQL驱动mysql-connector-java升级到8.0.X版本问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL驱动mysql-connec
2023-03-01

Win10升级10159版本失败是怎么回事有解决方法吗

Win10的预览版已经升级到10159版本,很多用户已经升级到这个版本。但是也有不少用户想升级10159却失败了。本文就来介绍一下,Win10升级到10159过程中失败了怎么解决。1、微软账户登录问题从Win10预览版10158之后,Ins
2023-06-17

vue项目element UI 版本升级过程遇到的问题及解决方案

这篇文章主要介绍了vue项目element UI 版本升级过程遇到的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

wi10升级到1703版本后开机总是提示选择系统的解决方法

小编给大家分享一下wi10升级到1703版本后开机总是提示选择系统的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!win10预览版1703开机以后总是需要
2023-06-13

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录