Подтвердить что ты не робот

UIActivityViewController - обмен электронной почтой и Twitter

Недавно я начал работать с UIActivity, чтобы поделиться своим приложением с миром, но у меня мало проблем. Во-первых, я не нашел, как задать тему моего сообщения. Есть ли способ? Во-вторых, когда я устанавливаю основной текст моего сообщения, есть дополнительный "enter" (первая строка сообщения пуста, и мой текст начинается со второй строки). Здесь код:

 NSMutableArray *array = [[NSMutableArray alloc] initWithObjects: @"Test", nil];

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
                                   initWithActivityItems:array applicationActivities:nil];

И в письме он показывает, что:

"

Test "

В-третьих: есть ли способ узнать, какой метод совместного доступа был выбран? Потому что я хочу включить хэштег в свой пост, когда пользователь делится на твиттере, но теперь он также интегрируется в электронную почту, что, очевидно, не имеет смысла.

Спасибо!

4b9b3361

Ответ 1

Чтобы добавить тему к электронной почте с помощью UIActivityViewController на iOS6, это лучшее решение, которое может использовать любой пользователь. Все, что вам нужно сделать, это вызвать следующее при инициализации UIActivityViewController.

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];
[activityViewController setValue:@"My Subject Text" forKey:@"subject"];

И ваш UIActivityViewController заполнен субъектом.

Ответ 2

В iOS7 это возможно при использовании -

activityViewController:subjectForActivityType:

При публикации товара услуга может предоставить отдельный объект поле и поле данных, например, сообщение электронной почты. Внедрить этот метод если вы хотите предоставить поле темы для служб, которые поддерживают его.

Отметьте https://developer.apple.com/library/ios/documentation/uikit/reference/UIActivityItemSource_protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIActivityItemSource/activityViewController:subjectForActivityType:

Ответ 3

1 и 2: Как установить получателей для UIActivityViewController в iOS 6?

Хотя оба предоставленных метода немного взломаны, особенно первый, возможно.

3: можно разделить разные материалы на разных сервисах, но количество элементов и их типов должно быть одинаковым (но это не ограничение, действительно, поскольку вы можете вернуть нуль для предметов, которые вам не нужны на конкретную услугу). Вы должны создать элементы общего доступа после того, как служба была выбрана с использованием протокола UIActivityItemSource.

Код, который я использую:

Показать UIActivityViewController с текущим контроллером в качестве поставщика всех элементов (он должен иметь файл .h):

const int numberOfSharedItems = 5;

- (IBAction)shareAction:(id)sender
{
    NSMutableArray *shareItems = [NSMutableArray new];
        while ([shareItems count] < numberOfSharedItems)
            [shareItems addObject: self];

        UIActivityViewController *shareController =
            [[UIActivityViewController alloc]
                // actual items are prepared by UIActivityItemSource protocol methods below
                initWithActivityItems: shareItems
                applicationActivities :nil];

        shareController.excludedActivityTypes = @[UIActivityTypeMessage, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll];

        [self presentViewController: shareController animated: YES completion: nil];
}

Создайте заполнители для элементов, которые будут доступны:

-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
    static UIActivityViewController *shareController;
    static int itemNo;
    if (shareController == activityViewController && itemNo < numberOfSharedItems - 1)
        itemNo++;
    else {
        itemNo = 0;
        shareController = activityViewController;
    }

    switch (itemNo) {
        case 0: return @""; // intro in email
        case 1: return @""; // email text
        case 2: return [NSURL new]; // link
        case 3: return [UIImage new]; // picture
        case 4: return @""; // extra text (via in twitter, signature in email)
        default: return nil;
    }
}

Сделать фактические предметы, которые будут использоваться совместно, по-разному для разных служб:

-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{
    // the number of item to share
    static UIActivityViewController *shareController;
    static int itemNo;
    if (shareController == activityViewController && itemNo < numberOfSharedItems - 1)
        itemNo++;
    else {
        itemNo = 0;
        shareController = activityViewController;
    }

    NSString *shareText = [self shareText]; // whatever you fancy
    NSURL *shareURL = [self shareURL];

    // twitter
    if ([activityType isEqualToString: UIActivityTypePostToTwitter])
        switch (itemNo) {
            case 0: return nil;
            case 1: return shareText; // you can change text for twitter, I add $ to stock symbol inside shareText here, e.g. Hashtags can be added too
            case 2: return shareURL;
            case 3: return nil; // no picture
            case 4: return @"via @YourApp";
            default: return nil;
        }

    // email
    else if ([activityType isEqualToString: UIActivityTypeMail])
        switch (itemNo) {
            case 0: return @"Hi!\r\n\r\nI used YourApp\r\n";
            case 1: return shareText;
            case 2: return shareURL;
            case 3: return nil; // no picture
            case 4: return [@"\r\nCheck it out.\r\n\r\nCheers\r\n" stringByAppendingString: [self userName]];
            default: return nil;
        }

    else // Facebook or something else in the future
        switch (itemNo) {
            case 0: return nil;
            case 1: return shareText;
            case 2: return shareURL;
            case 3: return [self shareImage];
            case 4: return nil;
            default: return nil;
        }
}

Ответ 4

u может просто создать класс следующим образом:

 @interface MYNActivityProvider : UIActivityItemProvider <UIActivityItemSource>

 @end

//реализация

 - (id) activityViewController:(UIActivityViewController *)activityViewController
      itemForActivityType:(NSString *)activityType
 { 
    if ( [activityType isEqualToString:UIActivityTypePostToTwitter] ) {
        return stringToPost;
     }
    if ( [activityType isEqualToString:UIActivityTypePostToFacebook] ) {
         return stringToPost;
    }
    if ( [activityType isEqualToString:UIActivityTypeMessage] ) {
        return @"SMS message text";  
    }
    if ( [activityType isEqualToString:UIActivityTypeMail] ) {
        return @"Email text here!";
    }
    if ( [activityType isEqualToString:@"Custom"] ) {
        return @"app custom text";
    }
    return nil;
 }

Ответ 5

Возможно, вы захотите попробовать OvershareKit.

Нам часто задают вопрос, почему кто-то использует OvershareKit вместо UIActivityViewController (UIAVC) и UIActivity. UIAVC отлично подходит для приложений, которые знают, что они никогда не будут нуждаться в любом из следующих действий:

  • Никогда не нужно интегрироваться с более чем одной или двумя сторонними службами.
  • Никогда не нужно настраивать пользовательский интерфейс для листа активности и общих экранов.
  • Не заботьтесь о предоставлении отдельного содержимого для конкретного контента для каждого типа совместного доступа (электронная почта или SMS и т.д.).
  • Никогда не нужно иметь несколько элементов, таких как "Копировать текст" или "Копировать ссылку" на том же листе.
  • Не возражайте, чтобы все не связанные с системой действия зависали от скучных монохромных значков.

Ваша ситуация (3) - необходимость заботиться о другом контенте для разных типов совместного доступа.