uni-app iOS 闪退 SIGPIPE 超时之后就崩溃了

发布于 1周前 作者 htzhanglong 来自 Uni-App

uni-app iOS 闪退 SIGPIPE 超时之后就崩溃了

开发环境 版本号 项目创建方式
Mac 14.6.1 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Mac

HBuilderX类型:正式

HBuilderX版本号:4.36

手机系统:iOS

手机系统版本号:iOS 18

手机厂商:苹果

手机机型:iPhone 14 Pro

页面类型:vue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

示例代码:

Incident Identifier: E0DF5163-72D4-4571-AC93-0DA57FEBFA7F  
CrashReporter Key:   09d88dd73d5c103b9ef4bbb5f57c600d917e3d4a  
Hardware Model:      iPhone14,3  
Process:             HBuilder [27029]  
Path:                /private/var/containers/Bundle/Application/90F73C7F-C140-459A-814C-C0B409E4F510/HBuilder.app/HBuilder  
Identifier:          com.gbiac.hfgs  
Version:             118 (1.0.17)  
Code Type:           ARM-64 (Native)  
Role:                Foreground  
Parent Process:      launchd [1]  

Date/Time:           2024-12-19 08:38:19.022 +0800  
OS Version:          iOS 15.6.1 (19G82)  
Report Version:      104  

Exception Type:  0 (SIGPIPE)  
Exception Codes: 0x00000000 at 0x00000001f96fbf24  
Triggered by Thread:  0  
`

4 回复

请问怎么解决呢?


请问怎么解决呢?

在处理uni-app在iOS平台上因SIGPIPE信号导致的闪退问题时,通常是由于TCP连接在写入数据时,对方已经关闭连接,而本地端还在尝试写入数据,导致操作系统发送SIGPIPE信号,默认情况下该信号会导致应用崩溃。

解决这个问题的一种常见方法是在iOS项目中禁用SIGPIPE信号。以下是如何在uni-app的iOS原生项目中实现这一点的步骤和代码示例:

步骤 1: 打开Xcode项目

首先,你需要使用Xcode打开uni-app生成的iOS项目。通常,这个项目位于uni-app项目的dist/build/native/ios目录下。

步骤 2: 编辑AppDelegate.m文件

在Xcode项目中,找到AppDelegate.m文件,并在这个文件中添加禁用SIGPIPE的代码。

#import "AppDelegate.h"

@implementation AppDelegate (SigpipeHandling)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 禁用SIGPIPE信号
    signal(SIGPIPE, SIG_IGN);
    
    // 其他初始化代码...
    return YES;
}

@end

步骤 3: 重新编译和运行应用

保存AppDelegate.m文件的更改,然后在Xcode中重新编译并运行你的应用。现在,当TCP连接因为对方关闭而尝试写入数据时,你的应用将不再因为SIGPIPE信号而崩溃。

注意事项

  1. 错误处理:虽然禁用SIGPIPE可以防止应用崩溃,但你应该确保你的网络代码能够正确处理连接关闭的情况,比如通过检查写入操作的返回值来发现错误。

  2. 测试:在实际部署之前,确保在多种网络条件下测试你的应用,以验证SIGPIPE处理是否正确,并且应用的行为符合预期。

  3. 日志记录:考虑在网络操作中添加日志记录,以便在出现问题时能够更容易地诊断问题所在。

通过上述步骤,你应该能够解决uni-app在iOS平台上因SIGPIPE信号导致的闪退问题。这种方法不需要修改uni-app的前端代码,只需在iOS原生项目中进行简单的配置即可。

回到顶部