diff --git a/packages/share/CHANGELOG.md b/packages/share/CHANGELOG.md index 7ac36c080c33..f3159bbfbdc1 100644 --- a/packages/share/CHANGELOG.md +++ b/packages/share/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.2+3 + +* Fix iOS crash when setting subject to null. + ## 0.6.2+2 * Update and migrate iOS example project. diff --git a/packages/share/ios/Classes/SharePlugin.m b/packages/share/ios/Classes/SharePlugin.m index cfd8eac6876d..79903f8a1e5b 100644 --- a/packages/share/ios/Classes/SharePlugin.m +++ b/packages/share/ios/Classes/SharePlugin.m @@ -6,6 +6,49 @@ static NSString *const PLATFORM_CHANNEL = @"plugins.flutter.io/share"; +@interface ShareData : NSObject + +@property(readonly, nonatomic, copy) NSString *subject; +@property(readonly, nonatomic, copy) NSString *text; + +- (instancetype)initWithSubject:(NSString *)subject text:(NSString *)text NS_DESIGNATED_INITIALIZER; + +- (instancetype)init __attribute__((unavailable("Use initWithSubject:text: instead"))); + +@end + +@implementation ShareData + +- (instancetype)init { + [super doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (instancetype)initWithSubject:(NSString *)subject text:(NSString *)text { + self = [super init]; + if (self) { + _subject = subject; + _text = text; + } + return self; +} + +- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { + return @""; +} + +- (id)activityViewController:(UIActivityViewController *)activityViewController + itemForActivityType:(UIActivityType)activityType { + return _text; +} + +- (NSString *)activityViewController:(UIActivityViewController *)activityViewController + subjectForActivityType:(UIActivityType)activityType { + return [_subject isKindOfClass:NSNull.class] ? nil : _subject; +} + +@end + @implementation FLTSharePlugin + (void)registerWithRegistrar:(NSObject *)registrar { @@ -31,7 +74,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSNumber *originWidth = arguments[@"originWidth"]; NSNumber *originHeight = arguments[@"originHeight"]; - CGRect originRect; + CGRect originRect = CGRectZero; if (originX != nil && originY != nil && originWidth != nil && originHeight != nil) { originRect = CGRectMake([originX doubleValue], [originY doubleValue], [originWidth doubleValue], [originHeight doubleValue]); @@ -48,14 +91,13 @@ + (void)registerWithRegistrar:(NSObject *)registrar { }]; } -+ (void)share:(id)sharedItems ++ (void)share:(NSString *)shareText subject:(NSString *)subject withController:(UIViewController *)controller atSource:(CGRect)origin { + ShareData *data = [[ShareData alloc] initWithSubject:subject text:shareText]; UIActivityViewController *activityViewController = - [[UIActivityViewController alloc] initWithActivityItems:@[ sharedItems ] - applicationActivities:nil]; - [activityViewController setValue:subject forKey:@"subject"]; + [[UIActivityViewController alloc] initWithActivityItems:@[ data ] applicationActivities:nil]; activityViewController.popoverPresentationController.sourceView = controller.view; if (!CGRectIsEmpty(origin)) { activityViewController.popoverPresentationController.sourceRect = origin; diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index d140fab114c5..78d094ee487b 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/share -version: 0.6.2+2 +version: 0.6.2+3 flutter: plugin: