UIActivityViewController not showing body text in gmail

后端 未结 3 1906
半阙折子戏
半阙折子戏 2020-12-21 03:58

I\'m using uiactivityviewcontroller for showing sharing option. Everything working except when user selects the Gmail sharing option. If user chooses email then it shows the

相关标签:
3条回答
  • 2020-12-21 04:25

    Looks like there is a bug in Gmail Share extension. Please check if your URL has &, passing & character makes message subject and body empty. You can use & instead.

    PS: I didn't check for other special characters.

    0 讨论(0)
  • 2020-12-21 04:25

    It's a bit tricky in Swift 3 and iOS 9+.

    First, you need to add googlegmail to LSApplicationQueriesSchemes in Info.plist

    Second, here's how my UIActivity subclass looks like:

    It's a bit tricky in Swift 3 and iOS 9+.

    First, you need to add googlegmail to LSApplicationQueriesSchemes in Info.plist

    Second, here's how my UIActivity subclass looks like:

    final class GmailNewEmailShareActivity: UIActivity {
    
        private let urlScheme = "googlegmail:"
        private var activityItems: [Any]? = nil
    
        override class var activityCategory: UIActivityCategory {
            return .share
        }
    
        override var activityType: UIActivityType? {
            return UIActivityType(rawValue: "googlemail")
        }
    
        override var activityTitle: String? {
            return "Gmail"
        }
    
        override var activityViewController: UIViewController? {
            return nil
        }
    
        override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
            guard let url = URL(string: urlScheme) else {
                return false
            }
            return UIApplication.shared.canOpenURL(url)
        }
    
        override func prepare(withActivityItems activityItems: [Any]) {
            // At this point I store incoming activity items to use them later in `perform()`
            self.activityItems = activityItems
        }
    
        override var activityImage: UIImage? {
            // 60x60, 120x120 and 180x180
            return nil
        }
    
        override func perform() {
            guard let body = activityItems?.first as? String, let encodedBody = body.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
                activityDidFinish(false)
                return
            }
            let urlString = "\(urlScheme)///co?body=\(encodedBody)"
            guard let url = URL(string: urlString) else {
                activityDidFinish(false)
                return
            }
            UIApplication.shared.openURL(url)
            activityDidFinish(true)
        }
    
    }
    
    0 讨论(0)
  • 2020-12-21 04:28

    You can use the URL scheme Gmail to create a subclass of UIActivity:

    The code below was extracted this answer: https://stackoverflow.com/a/12766330/3726577

    //ActivityViewCustomActivity.h
    @interface ActivityViewCustomActivity : UIActivity
    
    @end
    
    //ActivityViewCustomActivity.m
    @implementation ActivityViewCustomActivity
    
    - (NSString *)activityType {
        return @"googlegmail";
    }
    
    - (NSString *)activityTitle {
        return @"Gmail";
    }
    
    - (UIImage *)activityImage {
        // Note: These images need to have a transparent background and I recommend these sizes:
        // iPadShare@2x should be 126 px, iPadShare should be 53 px, iPhoneShare@2x should be 100
        // px, and iPhoneShare should be 50 px. I found these sizes to work for what I was making.
    
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
            return [UIImage imageNamed:@"iPadShare.png"];
        }
        else
        {
            return [UIImage imageNamed:@"iPhoneShare.png"];
        }
    }
    
    - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
        NSLog(@"%s", __FUNCTION__);
        return YES;
    }
    
    - (void)prepareWithActivityItems:(NSArray *)activityItems {
        NSLog(@"%s",__FUNCTION__);
    }
    
    - (UIViewController *)activityViewController {
        NSLog(@"%s",__FUNCTION__);
        return nil;
    }
    
    - (void)performActivity {
        NSString *email = @"googlegmail:///co?subject=Check it out&body=Check the application";
        email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];
    
        [self activityDidFinish:YES];
    }
    

    @implementation ViewController2
    
    - (void)viewDidLoad{
        [super viewDidLoad];
    
        NSString *textItem = @"Check the application";
    
        ActivityViewCustomActivity * ca = [ActivityViewCustomActivity new];
    
        UIActivityViewController *activityVC =
        [[UIActivityViewController alloc] initWithActivityItems:@[textItem] applicationActivities:[NSArray arrayWithObject:ca]];
    
        activityVC.excludedActivityTypes = @[UIActivityTypePostToWeibo, UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeSaveToCameraRoll];
        [activityVC setValue:@"Check it out" forKey:@"subject"];
    
        activityVC.completionHandler = ^(NSString *activityType, BOOL completed)
        {
            NSLog(@" activityType: %@", activityType);
            NSLog(@" completed: %i", completed);
        };
    
        [self presentViewController:activityVC animated:YES completion:nil];
    }
    

    See more: http://www.macstories.net/links/gmail-for-ios-url-scheme/

    0 讨论(0)
提交回复
热议问题