web-dev-qa-db-fra.com

Comment personnaliser un UIActivityViewController pour afficher un lien URL lors de la publication sur Facebook et Twitter?

J'essaie donc le nouveau UIActivityViewController dans iOS 6, et c'est vraiment facile à mettre en place, mais je ne sais pas comment le contrôler comme je le veux. Je veux donc publier un lien vers un article et je veux également joindre une image pour le lien. JE NE VEUX PAS que cette image soit téléchargée sur un album Facebook, juste comme une vignette URL.

C'est facile à réaliser dans le SDK Facebook car ils lui donnent un contrôle total, mais existe-t-il un moyen de le faire avec le UIActivityViewController? Voici ce que j'ai obtenu:

    NSArray *activityItems = @[[NSURL URLWithString:[article link]], [UIImage imageNamed:@"myStockImage"]];
    UIActivityViewController *viewCont = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
    [self presentViewController:viewCont animated:YES completion:nil];

Et cela fonctionne, mais il télécharge l'image sur un "album iOS". Si je n'ajoute pas l'image dans le tableau, la feuille facebook semble vide et la pièce jointe montre un logo safari grisé (comme la vignette est manquante!) Dans safari lorsque vous essayez de Facebook un lien, il utilise un capture d'écran de la page comme miniature, je veux faire quelque chose comme ça

MISE À JOUR :

Voici à quoi cela ressemble depuis mon application (en utilisant UIActivityViewController ou la manière SLCompose). Découvrez comment il va télécharger l'image dans un album photo iOS Photos

Incorrect placement of photo

Voici à quoi je veux qu'il ressemble (voir aussi Safari):

enter image description here

27
Ovi Tisler

J'ai cherché à ce sujet et je suis arrivé à la conclusion qu'en utilisant le UIActivityViewController, il n'y a tout simplement aucun moyen de faire ce que vous avez l'intention de faire. Chaque fois que vous essayez de partager une photo, cela vous fait simplement la mettre dans l'un de vos albums, l'album "iOS" par défaut.

Dans mon cas, je n'ai pas eu besoin de publier une photo tant qu'une image a été récupérée à partir du lien que je devais partager (tout comme lorsque vous publiez un lien sur votre chronologie Facebook et qu'il saisit automatiquement une photo de ce lien, et le l'image devient le lien). Pour ce faire, j'ai compris que si je ne publiais qu'une URL, cela ne fonctionnerait pas. Vous devez publier du texte initial, puis l'URL, et vous le faites en plaçant les objets dans cet ordre dans le tableau activityItems.

Voici mon code de travail:

NSArray * activityItems = @[[NSString stringWithFormat:@"Some initial text."], [NSURL URLWithString:@"http://www.google.com"]];
NSArray * applicationActivities = nil;
NSArray * excludeActivities = @[UIActivityTypeAssignToContact, UIActivityTypeCopyToPasteboard, UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeMessage];

UIActivityViewController * activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];
activityController.excludedActivityTypes = excludeActivities;

[self presentViewController:activityController animated:YES completion:nil]; 

J'ai également remarqué que si vous postez une photo le long de ces objets, elle ne récupérera aucune image du lien.

J'espère que ça aide.

49
camilomq

Mise à jour de la réponse pour Swift 3.0

let url = URL(string: "google.com")
let shareText = "Your string goes here"
let shareItems: [Any] = [shareText, url!]

let activityVC = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
activityVC.excludedActivityTypes = [.airDrop, .postToFlickr, .assignToContact, .openInIBooks]

self.present(activityVC, animated: true, completion: nil)

Facebook n'acceptera pas la chaîne, mais, comme beaucoup d'autres sites de médias sociaux, affichera une boîte d'image/lien pour l'URL

2
mauriii

Si vous n'avez pas spécifiquement besoin d'utiliser UIActivityViewController, SLComposeViewController est facile à utiliser à cet effet.

+(void)presentShareWidgetWithText:(NSString*)text url:(NSURL*)url images:(NSArray*)images toService:(NSString*)service presentIn:(UIViewController*)parentViewController {
    SLComposeViewController* controller = [SLComposeViewController composeViewControllerForServiceType:service];
    if (controller == nil) {
        DLog(@"Could not initialize SLComposeViewController for %@!", service);
        return;
    }
    if (url != nil) {
        if (![controller addURL:url])
            DLog(@"Failed adding url %@!", url);
    }
    if (images != nil) {
        for (UIImage* image in images) {
            if (![controller addImage:image]) {
                DLog(@"Failed adding image: %@", image);
            }
        }
    }
    if (![controller setInitialText:text]) {
        DLog(@"Failed setting initial text: %@", text);
    }

    SLComposeViewControllerCompletionHandler handler = ^(SLComposeViewControllerResult result) {
        switch (result) {
            case SLComposeViewControllerResultCancelled:
                DLog(@"SLComposeViewControllerResultCancelled");
                break;

            case SLComposeViewControllerResultDone:
                DLog(@"SLComposeViewControllerResultDone, Shared on service: %@", service);
                break;

            default:
                DLog(@"Unhandled result: %d", result);
                break;
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [parentViewController dismissViewControllerAnimated:YES completion:^{
                DLog(@"Dismissed a controller here!");
            }];
        });
    };

    [controller setCompletionHandler:handler];

    [parentViewController presentViewController:controller animated:YES completion:^{
        DLog(@"Presented %@!", controller);
    }];
}
1
Jonny
- (void)tweetURL:(NSString *)url title:(NSString *)title {
    TWTweetComposeViewController *Twitter = [[TWTweetComposeViewController alloc] init];
    NSString *format = @"“%@” %@ /via @DesignSceneApp";
    NSString *message = [NSString stringWithFormat:format, title, url]
    NSUInteger idx = title.length;
    while (![Twitter setInitialText:message]) {
        idx -= 5;
        if (idx > 5) {
            message = [NSString stringWithFormat:format,
                [NSString stringWithFormat:@"%@…", [title substringToIndex:idx]],
                url
            ];
        } else {
            // Give up on the title.
            message = [NSString stringWithFormat:@"%@ /via @DesignSceneApp", url];
            [Twitter setInitialText:message];
            break;
        }
    }

    [self presentViewController:Twitter animated:YES completion:nil];
}
0
Tamilarasan