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
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.
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)
}
}
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/