diff --git a/packages/share_plus/CHANGELOG.md b/packages/share_plus/CHANGELOG.md index c9186a7660..a4e34c33cb 100644 --- a/packages/share_plus/CHANGELOG.md +++ b/packages/share_plus/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.1.3 + +- Update iOS share target to present on the top ViewController. This fixes "Unable to present" errors when the app is already presenting such as in an add to app scenario. + # 2.1.2 - Do not tear down method channel onDetachedFromActivity. diff --git a/packages/share_plus/ios/Classes/FLTSharePlusPlugin.m b/packages/share_plus/ios/Classes/FLTSharePlusPlugin.m index e5f2e09c6c..accd0e7a71 100644 --- a/packages/share_plus/ios/Classes/FLTSharePlusPlugin.m +++ b/packages/share_plus/ios/Classes/FLTSharePlusPlugin.m @@ -7,6 +7,21 @@ static NSString *const PLATFORM_CHANNEL = @"dev.fluttercommunity.plus/share"; +static UIViewController *RootViewController() { + return [UIApplication sharedApplication].keyWindow.rootViewController; +} + +static UIViewController *TopViewControllerForViewController(UIViewController *viewController) { + if (viewController.presentedViewController) { + return TopViewControllerForViewController(viewController.presentedViewController); + } + if ([viewController isKindOfClass:[UINavigationController class]]) { + return TopViewControllerForViewController( + ((UINavigationController *)viewController).visibleViewController); + } + return viewController; +} + @interface SharePlusData : NSObject @property(readonly, nonatomic, copy) NSString *subject; @@ -135,9 +150,11 @@ + (void)registerWithRegistrar:(NSObject *)registrar { return; } + UIViewController *topViewController = + TopViewControllerForViewController(RootViewController()); [self shareText:shareText subject:shareSubject - withController:[UIApplication sharedApplication].keyWindow.rootViewController + withController:topViewController atSource:originRect]; result(nil); } else if ([@"shareFiles" isEqualToString:call.method]) { @@ -162,11 +179,13 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } } + UIViewController *topViewController = + TopViewControllerForViewController(RootViewController()); [self shareFiles:paths withMimeType:mimeTypes withSubject:subject withText:text - withController:[UIApplication sharedApplication].keyWindow.rootViewController + withController:topViewController atSource:originRect]; result(nil); } else { diff --git a/packages/share_plus/pubspec.yaml b/packages/share_plus/pubspec.yaml index 3661ef88a8..99348b3c68 100644 --- a/packages/share_plus/pubspec.yaml +++ b/packages/share_plus/pubspec.yaml @@ -1,6 +1,6 @@ name: share_plus description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS. -version: 2.1.2 +version: 2.1.3 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/