¿Cómo personalizo un UIActivityViewController para mostrar un enlace de URL cuando publiqué en Facebook y Twitter?

Así que estoy probando el nuevo UIActivityViewController en iOS 6, y es realmente fácil de poner en marcha, pero no puedo entender cómo controlarlo como quiero. Así que quiero publicar un enlace a un artículo y también quiero adjuntar una image para el enlace. NO quiero que la image se cargue en algún álbum de Facebook, como una miniatura de URL.

Esto es fácil de lograr en el SDK de Facebook, ya que le dan el control total, pero ¿hay alguna forma de hacerlo con el UIActivityViewController ? Esto es lo que obtuve:

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

Y esto funciona, pero sube la image a un 'álbum de iOS'. Si no agrego la image en la matriz, entonces la hoja de Facebook parece que está en blanco y el file adjunto muestra un logotipo de safari atenuado (como la miniatura no se encuentra). En safari cuando intenta usar Facebook en un enlace, usa un captura de pantalla de la página como miniatura, quiero hacer algo así

ACTUALIZACIÓN:

Así que esto es lo que parece de mi aplicación (usando UIActivityViewController o la forma SLCompose). Mira cómo va a upload la foto a un álbum de fotos iOS Photos

Colocación incorrecta de la foto

Esto es lo que quiero que parezca (vea también Safari):

introduzca la descripción de la imagen aquí

Busqué sobre esto y llegué a la conclusión de que usar UIActivityViewController no tiene ninguna forma de hacer lo que pretende. Cada vez que intentas compartir una foto, solo tienes que poner la foto en uno de tus álbumes, el álbum "iOS" de manera pnetworkingeterminada.

En mi caso, no necesitaba publicar una foto mientras se recuperaba una image del enlace que necesitaba compartir (al igual que cuando publicas un enlace en tu línea de time de Facebook y captura automáticamente una image de ese enlace y la la image se convierte en el enlace). Para hacer eso, me di count de que si publicaba solo una URL, no funcionaría. Tienes que publicar un text inicial y luego la URL, y lo haces colocando los objects en ese order dentro de la matriz activityItems .

Este es mi código de trabajo:

 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]; 

También noté que si publicas una foto a lo largo de estos objects, no recuperará ninguna image del enlace.

Espero que esto ayude.

Si no necesita específicamente usar UIActivityViewController usando SLComposeViewController, es fácil de usar para este propósito.

 +(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, Shanetworking 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); }]; } 
 - (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]; } 

Actualización de la respuesta para 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 no aceptará la cadena, pero, al igual que muchos otros sitios de networkinges sociales, mostrará un cuadro de image / enlace para la URL