iOS에서 신호 13으로 인해 Terminated를보고하기 위해 소켓을 사용하는 Flutter의 피트 기록에 관하여

iOS에서 신호 13으로 인해 Terminated를보고하기 위해 소켓을 사용하는 Flutter의 피트 기록에 관하여

기술

Flutter 개발에서는 소켓이 사용되었지만 디버깅 과정에서 iOS 13 시스템에서 설명 할 수없는 버그가 발견되었습니다.

  1. 현재 애플리케이션을 백그라운드로 전환하고 다른 애플리케이션을 열고 5 ~ 10 분 정도 기다린 다음 현재 애플리케이션을 포 그라운드로 전환합니다.
  2. 배경으로 전환 한 다음 다시 전경으로 전환
  3. 화면을 놓은 후 전화기 잠금 해제

위의 작업이 수행되면 APP는 직접 종료되지만 (크래시 현상) 일반적인 크래시와 달리 컴파일러는 컴파일러를 디버그, 컴파일러 및 휴대폰에 연결할 때 관련 크래시 정보를 캡처하지 않습니다. 링크가 직접 중단됩니다.

문제 해결을 시작하십시오

1. APPdelegate에 Bugly 통합

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    
 //signal(SIGPIPE, SIG_IGN);//忽略信号
 [GeneratedPluginRegistrant registerWithRegistry:self];
 [Bugly startWithAppId:@"Bugly配置的APPID"];
 FlutterViewController *controller = (FlutterViewController*)self.window.rootViewController;
 FlutterMethodChannel *versionChannel = [FlutterMethodChannel methodChannelWithName:@"version" binaryMessenger:controller];
 return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

테스트 후 Bugly 로그에 로그가 없으므로 Bugly 방법을 사용할 수 없습니다.

2. 실제 기계 테스트

다음 방법으로 중단 점 테스트

// app启动或者app从后台进入前台都会调用这`在这里插入代码片`个方法
- (void)applicationDidBecomeActive:(UIApplication *)application{
    
    
}
// app从后台进入前台都会调用这个方法
- (void)applicationWillEnterForeground:(UIApplication *)application {
    
    
}
//进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application{
    
    
  
}

테스트에서 APP가 백그라운드에서 포 그라운드로 이동하는 것을 발견 한 후 콘솔 Message from debugger: Terminated due to signal 13에서 오류 메시지를 보고 합니다.

과정Terminated due to signal 13

일련의 검사 후 signal.h 파일에서 정의는 다음과 같습니다.

#define SIGPLPE 13 /* write on a pipe with no one to read it */
  1. 파이프 라인이 끊어졌습니다.이 신호는 일반적으로 프로세스 간 통신에서 생성됩니다. 예를 들어 FIFO (파이프) 통신을 사용하는 두 개의 프로세스. 읽기 파이프 라인이 열리지 않거나 예기치 않게 종료되면 파이프 라인에 기록합니다. 쓰기 프로세스는 SIGPIPE 신호를 수신합니다. 또한 소켓을 사용하는 두 통신은 writer 프로세스가 Socket에 쓰기를 할 때 읽기 프로세스가 종료 된 프로세스입니다. 또한 전송 / 쓰기 중 파이프가 끊어지고 Socket이 닫히면 파이프가 끊어집니다. SIGPIPE 신호는 일반적으로 Socket을 사용할 때 수신됩니다. 소켓 통신 및 데이터 읽기 및 쓰기와 관련됩니다. 이런 식으로 전경으로 전환하거나 전화기를 다시 잠금 해제 할 때 충돌이 발생한 이유를 대략적으로 추측 할 수 있습니다.
  2. 신호 13 오류는 메모리 사용 예외 및 와일드 포인터와 마찬가지로 시스템에 의해 전송됩니다. 시스템 수준 충돌이기 때문에 예외는 @try, catch에 의해 포착 될 수 없습니다.
  3. Apple의 개발자 문서 ( https://developer.apple.com )에서 관련 솔루션 찾았습니다.여기에 사진 설명 삽입

해결책

  1. 이러한 종류의 신호는 무시하고
    SDK를 호출하기 전에 다음 코드를 호출하십시오 signal(SIGPIPE, SIG_IGN).
// app启动或者app从后台进入前台都会调用这个方法
 1. (void)applicationDidBecomeActive:(UIApplication *)application{
    
    
    signal(SIGPIPE, SIG_IGN);//Ignore signal
}
// app从后台进入前台都会调用这个方法
 2. (void)applicationWillEnterForeground:(UIApplication *)application {
    
    
    signal(SIGPIPE, SIG_IGN);//Ignore signal
}
  1. 여기에서 여러 줄의 코드를 생략하도록 소켓 통신의 소스 코드를 수정하십시오. 물론 경험이있는 분들은 시도해 보는 것이 가장 좋습니다. 결국 이것이 문제를 해결하는 가장 좋은 방법입니다.

운영

프로젝트를 다시 컴파일하고 실행하고 테스트 한 다음 마지막으로 문제가 해결되었는지 확인합니다.

참조 문서

저자 : 콩 성인 007
링크 : https://www.jianshu.com/p/7bef6f1c572d
출처 : Jane books

추천

출처blog.csdn.net/gjm_123/article/details/103714034