2012-09-30 14 views
26

Quindi sto provando il nuovo UIActivityViewController in iOS 6, ed è davvero facile da installare e utilizzare, ma non riesco a capire come controllarlo come voglio. Quindi voglio pubblicare un link ad un articolo e voglio anche allegare un'immagine per il link. NON voglio che l'immagine venga caricata su qualche album di Facebook, proprio come una miniatura dell'URL.Come personalizzare un UIActivityViewController per mostrare un collegamento URL quando si postano su Facebook e Twitter?

Questo è facile da eseguire in SDK di Facebook in quanto danno il pieno controllo per questo, ma c'è un modo per farlo con il UIActivityViewController? Ecco cosa ho ottenuto:

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

E questo funziona, ma carica l'immagine su un 'album iOS'. Se non aggiungo l'immagine nell'array, il foglio di Facebook sembra vuoto e l'allegato mostra un logo di safari in grigio (come la miniatura mancante!) In safari quando provi a Facebook un link, utilizza un Screen Grab della pagina come miniatura, voglio fare qualcosa di simile

UPDATE:

Quindi, ecco quello che sembra dalla mia app (utilizzando UIActivityViewController o il modo SLCompose). Guarda come si sta andando a caricare l'immagine di un album fotografico iOS Photos

Incorrect placement of photo

Ecco quello che voglio farlo sembrare come (vedi Safari anche):

enter image description here

risposta

46

Ho cercato su questo e sono giunto alla conclusione che utilizzando il UIActivityViewController non c'è proprio nessun modo per fare ciò che si intende. Ogni volta che provi a condividere una foto, ti fa semplicemente mettere la foto in uno dei tuoi album, album "iOS" per impostazione predefinita.

Nel mio caso, non ho avuto bisogno di postare una foto fintanto che un'immagine è stata recuperata dal link che avevo bisogno di condividere (proprio come quando si pubblica un link sulla timeline di Facebook e automaticamente si scatta una foto da quella link, e l'immagine diventa il link). Per fare ciò, ho capito che se ho postato solo un URL non funziona. Devi pubblicare un po 'di testo iniziale e poi l'URL, e lo fai mettendo gli oggetti in quell'ordine all'interno dell'array activityItems.

Questo è il mio codice di lavoro:

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

Ho anche notato che se si registra una foto insieme questi oggetti, non recupererà qualsiasi immagine dal collegamento.

Spero che questo aiuti.

+0

ORE DI PAGINA !!! su questa cosa insanguinata, cercando di capire perché non avrebbe preso il mio url correttamente. Grazie uomo ! – Alex

+0

Funziona quando utrying con google.com, ma quando si utilizza un collegamento alla nostra pagina facebook, mostra solo una brutta bussola. Ma quando condivido il link su Facebook, il link è un link "pagina facebook" integrato che è molto bello. Ma è molto fastidioso che la miniatura sul telefono non funzioni durante l'utilizzo nelle pagine di Facebook. grrr – bobmoff

+0

Grazie. Funziona .... – Puvanarajan

1

Se don' t specificamente necessario utilizzare UIActivityViewController usando SLComposeViewController è facile da usare per questo scopo.

+(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

Quello non funziona neanche.Aggiunge l'immagine nell'anteprima della miniatura, ma se la guardi, in realtà metterà l'immagine in un album chiamato 'foto iOS'. Voglio che sia solo l'anteprima in miniatura (come fa il safari). Non voglio che l'immagine vada nell'album fotografico dell'utente –

+0

Hmm ok Ho usato solo il link finora, senza immagini. Con solo il link seleziona un'immagine dal link stesso. Funziona dove il link target è un URL dell'app iOS, che è l'unica cosa che ho usato fino ad ora. – Jonny

0
- (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

Per favore, ricordati di formattare il codice in futuro :-) – kleopatra

1

Aggiornato la risposta per 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 non accetterà la stringa, ma, come molti altri dei siti di social media, mostrerà una casella di immagine/link per l'URL

Problemi correlati