iOSのシグナル13により終了を報告するためにソケットを使用するFlutterのピットレコードについて
説明
フラッター開発ではソケットが使用されましたが、デバッグプロセスでは、iOS 13システムでより不可解なバグが見つかりました。
- 現在のアプリケーションをバックグラウンドに切り替え、他のアプリケーションを開き、5〜10分待ってから、現在のアプリケーションをフォアグラウンドに切り替えます。
- 背景に切り替えてから前景に戻る
- 画面を休めたら電話のロックを解除します
上記の操作が実行されると、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 */
- パイプラインが壊れています。通常、この信号はプロセス間通信で生成されます。たとえば、FIFO(パイプ)通信を使用する2つのプロセスです。読み取りパイプラインが開いていないか予期せず終了した場合は、パイプラインに書き込みます。書き込みプロセスはSIGPIPE信号を受信します。さらに、ソケットを使用する2つの通信プロセス。書き込みプロセスがソケットに書き込みを行っているときに、読み取りプロセスが終了しました。さらに、送信/書き込み中にパイプが壊れ、ソケットが閉じているときにパイプが壊れます。通常、ソケットの使用時にSIGPIPEシグナルが受信されます。これは、ソケット通信およびデータの読み取りと書き込みに関連付けられています。このようにして、フォアグラウンドに切り替えたり、電話を再度ロック解除したときにクラッシュが発生した理由を大まかに推測できます。
- シグナル13エラーは、メモリ使用量の例外やワイルドポインターと同様にシステムによって送信されます。これはシステムレベルのクラッシュであるため、@ try、catchで例外をキャッチすることはできません。
- Appleの開発者向けドキュメント(https://developer.apple.com)で関連ソリューションを見つけました。
解決
- この種類の信号は無視して
ください。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
}
- ソケット通信のソースコードを変更して、ここで複数行のコードを省略します。もちろん、経験のある人は、試してみるのが最善です。結局のところ、これが問題を解決する最良の方法です。
走る
プロジェクトを再コンパイルし、実行してテストし、最後に問題が解決されたことを確認します。
参照文書
著者:豆大人007
リンク:https : //www.jianshu.com/p/7bef6f1c572d
出典:Jane Books