34 votes

UIActivityViewController - Partage par e-mail et sur Twitter

J'ai récemment commencé à travailler avec UIActivity pour partager mon application avec le monde, mais j'ai quelques problèmes. Tout d'abord, je n'ai pas trouvé comment définir le sujet de mon email. Y a-t-il un moyen ? Deuxièmement, lorsque je définis le texte du corps de mon email, il y a un "saut de ligne" supplémentaire (la première ligne de l'email est vide et mon texte commence à la deuxième ligne). Voici le code :

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

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

Et dans l'email, cela s'affiche comme suit :

"

Test "

Troisièmement : y a-t-il un moyen de savoir quelle méthode de partage a été sélectionnée ? Car je veux inclure un hashtag dans mon message lorsque l'utilisateur partage sur Twitter, mais pour l'instant il est également intégré dans l'email, ce qui évidemment n'a pas de sens.

Merci !

50voto

Ajay Points 661

Pour ajouter un objet à l'e-mail en utilisant UIActivityViewController sur iOS6, voici la meilleure solution que quiconque peut utiliser.. Tout ce que vous avez à faire est d'appeler la ligne suivante lors de l'initialisation de UIActivityViewController.

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];
[activityViewController setValue:@"Mon texte de sujet" forKey:@"subject"];

Et votre UIActivityViewController est maintenant peuplé d'un objet.

24voto

Namit Gupta Points 173

Dans iOS 7, ceci est possible en utilisant -

activityViewController:subjectForActivityType:

Lors de la publication d'un élément, le service peut prévoir un champ de sujet séparé et un champ de données, comme un message électronique. Implémentez cette méthode si vous souhaitez fournir un champ de sujet pour les services qui le supportent.

Vérifiez - https://developer.apple.com/library/ios/documentation/uikit/reference/UIActivityItemSource_protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIActivityItemSource/activityViewController:subjectForActivityType:

16voto

esp Points 1051

1 et 2 : Comment définir les destinataires pour UIActivityViewController dans iOS 6 ?

Bien que les deux méthodes fournies soient un peu des astuces, en particulier la première, c'est possible.

3 : il est possible de partager différents contenus sur différents services, mais le nombre d'éléments et leurs types doivent être les mêmes (mais ce n'est pas une limitation, vraiment, car vous pouvez retourner nil pour les éléments dont vous n'avez pas besoin sur un service particulier). Vous devez créer des éléments à partager après que le service ait été sélectionné en utilisant le protocole UIActivityItemSource

Code que j'utilise :

Afficher UIActivityViewController avec le contrôleur actuel comme fournisseur de tous les éléments (il devrait avoir dans le fichier .h) :

const int numberOfSharedItems = 5;

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

        UIActivityViewController *shareController =
            [[UIActivityViewController alloc]
                // les éléments réels sont préparés par les méthodes du protocole UIActivityItemSource ci-dessous
                initWithActivityItems: shareItems
                applicationActivities :nil];

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

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

Créer des espaces réservés pour les éléments qui seront partagés :

-(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 par email
        case 1: return @""; // texte par email
        case 2: return [NSURL new]; // lien
        case 3: return [UIImage new]; // image
        case 4: return @""; // texte supplémentaire (via sur Twitter, signature par email)
        default: return nil;
    }
}

Créer les éléments réels qui seront partagés, différemment pour différents services :

-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{
    // le nombre d'éléments à partager
    static UIActivityViewController *shareController;
    static int itemNo;
    if (shareController == activityViewController && itemNo < numberOfSharedItems - 1)
        itemNo++;
    else {
        itemNo = 0;
        shareController = activityViewController;
    }

    NSString *shareText = [self shareText]; // ce que vous voulez
    NSURL *shareURL = [self shareURL];

    // Twitter
    if ([activityType isEqualToString: UIActivityTypePostToTwitter])
        switch (itemNo) {
            case 0: return nil;
            case 1: return shareText; // vous pouvez changer le texte pour Twitter, j'ajoute $ au symbole boursier à l'intérieur de shareText ici, par exemple. Les hashtags peuvent également être ajoutés
            case 2: return shareURL;
            case 3: return nil; // pas d'image
            case 4: return @"via @VotreApp";
            default: return nil;
        }

    // E-mail
    else if ([activityType isEqualToString: UIActivityTypeMail])
        switch (itemNo) {
            case 0: return @"Salut !\r\n\r\nJ'ai utilisé YourApp\r\n";
            case 1: return shareText;
            case 2: return shareURL;
            case 3: return nil; // pas d'image
            case 4: return [@"\r\nDécouvrez-le.\r\n\r\nCordialement\r\n" stringByAppendingString: [self userName]];
            default: return nil;
        }

    else // Facebook ou autre chose à l'avenir
        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;
        }
}

2voto

kkkpg Points 3

Vous pouvez simplement créer une classe comme suit :

 @interface MYNActivityProvider : UIActivityItemProvider 

 @end

// implémentation

 - (id) activityViewController:(UIActivityViewController *)activityViewController
      itemForActivityType:(NSString *)activityType
 { 
    if ( [activityType isEqualToString:UIActivityTypePostToTwitter] ) {
        return stringToPost;
     }
    if ( [activityType isEqualToString:UIActivityTypePostToFacebook] ) {
         return stringToPost;
    }
    if ( [activityType isEqualToString:UIActivityTypeMessage] ) {
        return @"Texte du message SMS";  
    }
    if ( [activityType isEqualToString:UIActivityTypeMail] ) {
        return @"Texte de l'e-mail ici !";
    }
    if ( [activityType isEqualToString:@"Custom"] ) {
        return @"texte personnalisé de l'application";
    }
    return nil;
 }

0voto

samwize Points 4144

Vous voudrez peut-être essayer OvershareKit.

Nous sommes souvent interrogés sur la raison pour laquelle quelqu'un utiliserait OvershareKit au lieu de UIActivityViewController (UIAVC) et UIActivity. UIAVC est parfait pour les applications qui savent qu'elles n'auront jamais besoin de ce qui suit :

  1. Ne jamais avoir besoin de s'intégrer avec plus d'un ou deux services tiers.
  2. Ne jamais avoir besoin de modifier l'interface utilisateur pour la feuille d'activité et les écrans de partage.
  3. Ne jamais se préoccuper de fournir un contenu spécifique aux médias pour chaque type de partage (email versus SMS, etc.).
  4. Ne jamais avoir besoin d'avoir plusieurs éléments tels qu'une Copie de texte par rapport à un Copie de lien dans la même feuille.
  5. Ne vous dérangez pas que toutes les activités non fournies par le système soient bloquées avec des icônes monotones ennuyeuses.

Votre situation est (3) - le besoin de se soucier de contenus différents pour chaque type de partage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X