Con respecto al registro de pit de Flutter usando socket para informar Terminado debido a la señal 13 en iOS

Descripción

En el desarrollo de Flutter, se usó socket, pero en el proceso de depuración, se encontró un error más inexplicable en el sistema iOS 13.

  1. Cambie la aplicación actual a segundo plano, abra otras aplicaciones, espere de 5 a 10 minutos y luego cambie la aplicación actual al primer plano
  2. Cambiar al fondo y luego volver al primer plano
  3. Desbloquea el teléfono después de descansar la pantalla

Cuando se realiza la operación anterior, la APLICACIÓN se cerrará directamente (fenómeno de bloqueo), pero a diferencia del bloqueo habitual, el compilador no capturará la información de bloqueo relevante al vincular el compilador a la depuración, el compilador y el teléfono móvil. El enlace se interrumpirá directamente.

Empiece a intentar solucionar el problema

1. Integrar Bugly en APPdelegate

- (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];
}

Después de la prueba, no hay registro en el registro de Bugly, por lo que el método Bugly no es factible.

2. Prueba de máquina real

Pruebe los puntos de ruptura con los siguientes métodos

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

Después de que la prueba encontró que la APLICACIÓN del fondo al primer plano, la consola informa Message from debugger: Terminated due to signal 13un mensaje de error

pistaTerminated due to signal 13

Después de una serie de inspecciones, se encuentra que en el archivo signal.h, la definición es la siguiente:

#define SIGPLPE 13 /* write on a pipe with no one to read it */
  1. La canalización está rota. Esta señal generalmente se genera en la comunicación entre procesos. Por ejemplo, dos procesos que usan comunicación FIFO (canalización). Si la canalización de lectura no se abre o termina inesperadamente, escriba en la canalización. El proceso de escritura recibirá la señal SIGPIPE. Además, las dos comunicaciones mediante Socket Un proceso, cuando el proceso de escritura está escribiendo en el Socket, el proceso de lectura ha finalizado. Además, la tubería se romperá durante el envío / escritura y la tubería se romperá cuando se cierre el Socket. La señal SIGPIPE generalmente se recibirá cuando se utilice el Socket. Está asociado con la comunicación de socket y la lectura y escritura de datos. De esta manera, puede adivinar aproximadamente por qué ocurrió el bloqueo al cambiar al primer plano o desbloquear el teléfono nuevamente.
  2. El sistema envía el error de la señal 13, al igual que las excepciones de uso de memoria y los punteros salvajes, debido a que es un bloqueo a nivel del sistema, la excepción no puede ser detectada por @try, catch.
  3. Encontramos soluciones relacionadas en la documentación para desarrolladores de Apple ( https://developer.apple.com ).Inserte la descripción de la imagen aquí

solución

  1. Ignore este tipo de señal.
    Antes de llamar a su SDK, llame al siguiente código 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. Modifique el código fuente de la comunicación de socket para omitir varias líneas de código aquí. Por supuesto, aquellos que tienen experiencia, lo mejor es intentarlo, después de todo, esta es la mejor manera de resolver el problema.

correr

Vuelva a compilar el proyecto, ejecútelo, pruebe y, finalmente, descubra que el problema se ha resuelto.

Documentos de referencia

Autor: beans adultos 007
Enlaces: https://www.jianshu.com/p/7bef6f1c572d
Fuente: Jane books

Supongo que te gusta

Origin blog.csdn.net/gjm_123/article/details/103714034
Recomendado
Clasificación