web-dev-qa-db-fra.com

UIActivityViewController - Partage de courriels et 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 l'objet de mon e-mail. Y a-t-il un moyen? Deuxièmement, lorsque je définit le corps du texte de mon e-mail, il y a un "enter" supplémentaire (la première ligne de l'e-mail 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'e-mail, cela montre que:

"

Test "

Troisièmement: existe-t-il un moyen de savoir quelle méthode de partage a été sélectionnée? Parce que je veux inclure un hashtag dans mon message lorsque l'utilisateur partage sur Twitter, mais maintenant il est également intégré dans l'e-mail, ce qui n'a évidemment aucun sens.

Merci!

34
anthoprotic

Pour ajouter sujet à l'e-mail en utilisant UIActivityViewController sur iOS6, c'est la meilleure solution que tout le monde peut utiliser. Tout ce que vous avez à faire est d'appeler ce qui suit lors de l'initialisation de UIActivityViewController.

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

Et votre UIActivityViewController est rempli avec un sujet.

50
Ajay

Dans iOS7, cela est possible en utilisant -

activityViewController:subjectForActivityType:

Lors de la publication d'un article, le service peut fournir un champ d'objet et un champ de données distincts, comme un e-mail. Implémentez cette méthode si vous souhaitez fournir un champ d'objet pour les services qui en prennent en charge un.

Vérifier - https://developer.Apple.com/library/ios/documentation/uikit/reference/UIActivityItemSource_protocol/Reference/Reference.html#//Apple_ref/occ/intfm/UIActivityItemSource/activityViewController : subjectForActivityType :

24
Namit Gupta

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

Bien que les deux méthodes fournies soient un peu un hack, 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'articles et leurs types doivent être les mêmes (mais ce n'est pas vraiment une limitation, car vous pouvez renvoyer zéro pour les articles dont vous n'avez pas besoin sur un service particulier ). Vous devez créer des éléments de partage après la sélection du service à l'aide du protocole UIActivityItemSource

Code que j'utilise:

Afficher UIActivityViewController avec le contrôleur actuel en tant que 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]
                // 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];
}

Créez 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 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;
    }
}

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

-(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;
        }
}
16
esp

vous pouvez simplement créer une classe comme suit:

 @interface MYNActivityProvider : UIActivityItemProvider <UIActivityItemSource>

 @end

// la mise en oeuvre

 - (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;
 }
2
KP_G

Vous voudrez peut-être essayer OvershareKit .

On nous demande souvent pourquoi quelqu'un utiliserait OvershareKit au lieu de UIActivityViewController (UIAVC) et UIActivity. UIAVC est idéal pour les applications qui savent qu'elles n'auront jamais besoin des éléments suivants:

  1. Jamais besoin de s'intégrer à plus d'un ou deux services tiers.
  2. Jamais besoin de modifier l'interface utilisateur pour la feuille d'activité et les écrans de partage.
  3. Ne vous souciez jamais de fournir un contenu spécifique aux médias pour chaque type de partage (e-mail ou SMS, etc.)
  4. Jamais besoin d'avoir plusieurs éléments tels qu'un texte de copie par rapport à un lien de copie dans la même feuille.
  5. N'oubliez pas que toutes les activités non fournies par le système sont bloquées avec des icônes monochromes ennuyeuses.

Votre situation est (3) - un besoin de se soucier de différents contenus pour différents types de partage.

0
samwize