web-dev-qa-db-ja.com

UIActivityViewController Gmail共有の件名と本文が空になりますか?

UIActivityViewControllerを使用して共有を表示しています。リストでメールアプリを選択すると、件名と本文が適切に設定され、Gmailアプリの場合と同様に空になります。

- (void)shareAVideoWithSubject:(NSString*)subject Link:(NSString *)string onViewController:(UIViewController *)viewController fromView:(UIView *)view {

    _activityViewController =
    [[UIActivityViewController alloc] initWithActivityItems:@[string]
                                      applicationActivities:nil];
    _activityViewController.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAddToReadingList, UIActivityTypeAirDrop];
    [_activityViewController setValue:subject forKey:@"subject"];


    UIWindow *window = [[[UIApplication sharedApplication] delegate]window];

    //if iPhone
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        if(!viewController){
            viewController = ((SWRevealViewController*)window.rootViewController).presentedViewController;
        }
        [viewController presentViewController:_activityViewController
                                     animated:YES
                                   completion:nil];

    }   
    //if iPad
    else
    {
        // Change Rect to position Popover
        popup = [[UIPopoverController alloc] initWithContentViewController:_activityViewController];
        UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:view];
        [popup presentPopoverFromBarButtonItem:barButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}

StackOverFlowで以下の2つの質問を確認しました。

  1. IActivityViewControllerがGmailに本文テキストを表示していません

  2. IActivityViewControllerがGmailに本文テキストを表示していません

これらはリストに新しいアクティビティを追加するため、私の質問に対する答えではありません。むしろ、iOSにすべての共有可能なアプリを表示させたいのです。その場合、Gmailの共有本体は空になります。

前もって感謝します。スクリーンショットを追加して、 UIActivityViewController showing Gmail app to share

Gmail window open with empty subject and body. Cropped the image because of company policy can show the email address

25
Ankit Jain

[_activityViewController setValue:subject forKey:@"subject"];電子メールの件名を設定するための文書化されていない方法です。
本文と件名を設定する正しい方法(iOS 7.0以降)-共有するアイテムにUIActivityItemSourceプロトコルを実装します。

//  EmailItemProvider.h
@interface EmailItemProvider : NSObject <UIActivityItemSource>
@property (nonatomic, strong) NSString *subject;
@property (nonatomic, strong) NSString *body;
@end

//  EmailItemProvider.m
#import "EmailItemProvider.h"

@implementation EmailItemProvider

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
    return _body;
}

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType {
    return _body;
}

- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType {
    return _subject;
}
@end

そしてそれを提示するよりも:

EmailItemProvider *emailItem = [EmailItemProvider new];
emailItem.subject = @"Subject";
emailItem.body = @"Body";

UIActivityViewController *activityViewController =
[[UIActivityViewController alloc] initWithActivityItems:@[emailItem]
                                  applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];

これによりメールアプリの本文と件名が設定されますが、Gmailアプリは件名を無視して本文と同じに設定しているようです。

Mail.appGmail

重要:Gmailアプリにバグがあるようです。合格&文字は、メッセージの件名と本文を空にします。使用する &amp;代わりに。その他の特殊文字はテストされていません。

12
Sergey Kuryanov

Swift(4)愛好家のために:

activityViewController(_:subjectForActivityType:) サブジェクトを共有メソッドに置くことができます。

extension YOURViewController: UIActivityItemSource {
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return "YOUR_EMAIL_BODY"
    }

    func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
        if activityType == .mail {
            return "YOUR_EMAIL_SUBJECT"
        } else {
            return "SUBJECT_FOR_OTHER_SHARING_METHOD"
        }
    }

    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        if activityType == .mail {
            return "YOUR_EMAIL_BODY"
        } else {
            return "OTHER_SHARING_MESSAGES"
        } 
    }


}
0
Allen