Skip to content

Commit 6da46f4

Browse files
tkreuderDependencyBotmiquelbeltran
authored
fix(share_plus): Throw error if sharePositionOrigin not in sourceView (#1038)
* fix(share_plus): Throw error if sharePositionOrigin not in sourceView The sharePositionOrigin must be in the coordinate space of sourceView. See https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller/1622324-sourcerect * Bump version number * Ensure that it raises a PlatformException if argument is required, but not given * Version 4.3.0 Co-authored-by: DependencyBot <[email protected]> Co-authored-by: Miguel Beltran <[email protected]>
1 parent 1453efc commit 6da46f4

File tree

3 files changed

+49
-12
lines changed

3 files changed

+49
-12
lines changed

packages/share_plus/share_plus/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 4.3.0
2+
3+
- iOS: Throw PlatformException when iPad share dialog not appearing (sharePositionOrigin not in sourceView)
4+
15
# 4.2.0
26

37
- iOS: Fix Instagram does not show up in provider list for web links

packages/share_plus/share_plus/ios/Classes/FLTSharePlusPlugin.m

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -298,11 +298,13 @@ + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
298298

299299
UIViewController *topViewController =
300300
TopViewControllerForViewController(RootViewController());
301+
301302
[self shareText:shareText
302303
subject:shareSubject
303304
withController:topViewController
304305
atSource:originRect
305-
toResult:withResult ? result : nil];
306+
toResult:result
307+
withResult:withResult];
306308
if (!withResult)
307309
result(nil);
308310
} else if ([@"shareFiles" isEqualToString:call.method] ||
@@ -336,7 +338,8 @@ + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
336338
withText:text
337339
withController:topViewController
338340
atSource:originRect
339-
toResult:withResult ? result : nil];
341+
toResult:result
342+
withResult:withResult];
340343
if (!withResult)
341344
result(nil);
342345
} else {
@@ -349,7 +352,8 @@ + (void)share:(NSArray *)shareItems
349352
withSubject:(NSString *)subject
350353
withController:(UIViewController *)controller
351354
atSource:(CGRect)origin
352-
toResult:(FlutterResult)result {
355+
toResult:(FlutterResult)result
356+
withResult:(BOOL)withResult {
353357
UIActivityViewSuccessController *activityViewController =
354358
[[UIActivityViewSuccessController alloc] initWithActivityItems:shareItems
355359
applicationActivities:nil];
@@ -361,10 +365,32 @@ + (void)share:(NSArray *)shareItems
361365

362366
activityViewController.popoverPresentationController.sourceView =
363367
controller.view;
368+
BOOL isCoordinateSpaceOfSourceView =
369+
CGRectContainsRect(controller.view.frame, origin);
370+
371+
// If device is e.g. an iPad then hasPopoverPresentationController is true
372+
BOOL hasPopoverPresentationController =
373+
[activityViewController popoverPresentationController] != NULL;
374+
if (hasPopoverPresentationController &&
375+
(!isCoordinateSpaceOfSourceView || CGRectIsEmpty(origin))) {
376+
NSString *sharePositionIssue = [NSString
377+
stringWithFormat:
378+
@"sharePositionOrigin: argument must be set, %@ must be non-zero "
379+
@"and within coordinate space of source view: %@",
380+
NSStringFromCGRect(origin),
381+
NSStringFromCGRect(controller.view.bounds)];
382+
383+
result([FlutterError errorWithCode:@"error"
384+
message:sharePositionIssue
385+
details:nil]);
386+
return;
387+
}
388+
364389
if (!CGRectIsEmpty(origin)) {
365390
activityViewController.popoverPresentationController.sourceRect = origin;
366391
}
367-
if (result) {
392+
393+
if (withResult) {
368394
UIActivityViewSuccessCompanion *companion =
369395
[[UIActivityViewSuccessCompanion alloc] initWithResult:result];
370396
activityViewController.companion = companion;
@@ -384,7 +410,8 @@ + (void)shareText:(NSString *)shareText
384410
subject:(NSString *)subject
385411
withController:(UIViewController *)controller
386412
atSource:(CGRect)origin
387-
toResult:(FlutterResult)result {
413+
toResult:(FlutterResult)result
414+
withResult:(BOOL)withResult {
388415
NSURL *url = [NSURL URLWithString:shareText];
389416
if (!url || ![url scheme] || ![url host]) {
390417
NSObject *data = [[SharePlusData alloc] initWithSubject:subject
@@ -393,7 +420,8 @@ + (void)shareText:(NSString *)shareText
393420
withSubject:subject
394421
withController:controller
395422
atSource:origin
396-
toResult:result];
423+
toResult:result
424+
withResult:withResult];
397425
return;
398426
}
399427

@@ -415,7 +443,8 @@ + (void)shareText:(NSString *)shareText
415443
withSubject:subject
416444
withController:controller
417445
atSource:origin
418-
toResult:result];
446+
toResult:result
447+
withResult:withResult];
419448
});
420449

421450
return;
@@ -430,7 +459,8 @@ + (void)shareText:(NSString *)shareText
430459
withSubject:subject
431460
withController:controller
432461
atSource:origin
433-
toResult:result];
462+
toResult:result
463+
withResult:withResult];
434464
});
435465
}];
436466
} else {
@@ -439,7 +469,8 @@ + (void)shareText:(NSString *)shareText
439469
withSubject:subject
440470
withController:controller
441471
atSource:origin
442-
toResult:result];
472+
toResult:result
473+
withResult:withResult];
443474
return;
444475
}
445476
}
@@ -450,7 +481,8 @@ + (void)shareFiles:(NSArray *)paths
450481
withText:(NSString *)text
451482
withController:(UIViewController *)controller
452483
atSource:(CGRect)origin
453-
toResult:(FlutterResult)result {
484+
toResult:(FlutterResult)result
485+
withResult:(BOOL)withResult {
454486
NSMutableArray *items = [[NSMutableArray alloc] init];
455487

456488
for (int i = 0; i < [paths count]; i++) {
@@ -469,7 +501,8 @@ + (void)shareFiles:(NSArray *)paths
469501
withSubject:subject
470502
withController:controller
471503
atSource:origin
472-
toResult:result];
504+
toResult:result
505+
withResult:withResult];
473506
}
474507

475508
@end

packages/share_plus/share_plus/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: share_plus
22
description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS.
3-
version: 4.2.0
3+
version: 4.3.0
44
homepage: https://plus.fluttercommunity.dev/
55
repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/
66
issue_tracker: https://github.com/fluttercommunity/plus_plugins/labels/share_plus

0 commit comments

Comments
 (0)