From 03e6502549e20592ed4bf2341fc96a39d01efc28 Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Fri, 2 Feb 2024 17:04:46 +0800 Subject: [PATCH] fix: iOS app crash when exit to background (#494) --- ios/Classes/FijkPlugin.m | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/ios/Classes/FijkPlugin.m b/ios/Classes/FijkPlugin.m index 5aeeee95..e6406009 100644 --- a/ios/Classes/FijkPlugin.m +++ b/ios/Classes/FijkPlugin.m @@ -62,6 +62,9 @@ + (void)registerWithRegistrar:(NSObject *)registrar { FijkPlugin *instance = [[FijkPlugin alloc] initWithRegistrar:registrar]; _instance = instance; [registrar addMethodCallDelegate:instance channel:channel]; + [registrar addApplicationDelegate:instance]; + // For receiving detachFromEngineForRegistrar. + [registrar publish:instance]; FijkPlayer *player = [[FijkPlayer alloc] initJustTexture]; int64_t vid = [[registrar textures] registerTexture:player]; @@ -99,6 +102,24 @@ - (instancetype)initWithRegistrar: return self; } +// Called when a plugin is being removed from a FlutterEngine. +// See: https://github.com/flutter/engine/blob/e29263212bfdd3e51f8b1cd4b07dd60e2395d5bd/shell/platform/darwin/ios/framework/Headers/FlutterPlugin.h#L231-L242 +- (void)detachFromEngineForRegistrar:(NSObject *)registrar { + [self shutdownAllPlayers]; +} + +- (void)applicationWillTerminate:(UIApplication *)application { + [self shutdownAllPlayers]; +} + +- (void)shutdownAllPlayers { + for (NSNumber *pid in _fijkPlayers) { + FijkPlayer *fijkplayer = _fijkPlayers[pid]; + [fijkplayer shutdown]; + } + [_fijkPlayers removeAllObjects]; +} + - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {