¿Cómo mostrar la hoja de acción para compartir predeterminada de iOS 6 con las opciones para compartir disponibles?

97

Algunas aplicaciones muestran una hoja de acción predeterminada en iOS 6 con opciones para compartir.

Social Framework solo tiene dos clases, una para componer y otra para solicitar.

Sin embargo, lo que encontré es sobre la composición de un servicio en particular con SLComposeViewController y antes de mostrar esto, debo consultar manualmente si el servicio está disponible. Y luego también tengo que crear mi propia hoja de acción con iconos propios.

¿Cómo muestran esas aplicaciones esta hoja de acción de opciones para compartir predeterminada en iOS 6? ¿O están usando un marco de código abierto?

rana abierta
fuente
Quiero abrir la hoja para compartir con un ícono personalizado como wechat, weibo, qq e integrar su funcionalidad, ¿cómo puedo hacer esto?
Ravi Ojha
Solo revisa este enlace también ... stackoverflow.com/a/35267035/3908884
Conoce a Doshi

Respuestas:

223

El UIActivityViewController indicado en la otra respuesta hace que esto sea trivial. Todo lo que tiene que hacer es especificar el texto / imagen / URL que desea compartir y presentar el controlador de vista de actividad de forma modal e iOS mostrará automáticamente todos los servicios de uso compartido aplicables. Ejemplos:

C objetivo

- (void)shareText:(NSString *)text andImage:(UIImage *)image andUrl:(URL *)url
{
    NSMutableArray *sharingItems = [NSMutableArray new];

    if (text) {
        [sharingItems addObject:text];
    }
    if (image) {
        [sharingItems addObject:image];
    }
    if (url) {
        [sharingItems addObject:url];
    }

    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil];
    [self presentViewController:activityController animated:YES completion:nil];
}

Rápido

func share(sharingText: String?, sharingImage: UIImage?, sharingURL: URL?) {
    let sharingItems:[AnyObject?] = [
                                        sharingText as AnyObject,
                                        sharingImage as AnyObject,
                                        sharingURL as AnyObject
                                    ] 
    let activityViewController = UIActivityViewController(activityItems: sharingItems.compactMap({$0}), applicationActivities: nil)
    if UIDevice.current.userInterfaceIdiom == .pad {
        activityViewController.popoverPresentationController?.sourceView = view
    }
    present(activityViewController, animated: true, completion: nil)
}
Mick MacCallum
fuente
6
Buena edición para la versión Swift. Cambiaría el .append (elemento) por un elemento + =. Parece más veloz
Ignacio Inglese
2
En la última versión de Swift, reemplace AnyObject[]()con[AnyObject]()
Ruben Martinez Jr.
5
Está funcionando, solo después de iniciar sesión en las cuentas respectivas en la configuración (facebook / twitter), pero en la aplicación de fotos / aplicación de notas, las opciones están disponibles incluso si el usuario no ha iniciado sesión, ¿podría explicar por qué es así? ¿O hay alguna otra solución?
Jaldip Katre
4
Agregué una edición para la compatibilidad con iOS 8 en iPad; también debe configurar los UIActivityViewController's UIPopoverControllero se bloqueará present…. He tenido dos rechazos de tres en la edición hasta ahora, así que suponiendo que sea rechazada, quizás pueda ver si desea agregar la edición usted mismo. O no :-)
Benjohn
Oh, la edición cita esta respuesta que explica todo.
Benjohn
39

Agregue esto para usar el UIActivityViewController.

-(IBAction)shareButtonPressed:(id)sender {

    NSLog(@"shareButton pressed");

    NSString *texttoshare = _txt; //this is your text string to share
    UIImage *imagetoshare = _img; //this is your image to share
    NSArray *activityItems = @[texttoshare, imagetoshare];    
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
    activityVC.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypePrint];
    [self presentViewController:activityVC animated:TRUE completion:nil];
}
Davide
fuente
2
Respuesta preferida para mí ya que también muestra la exclusión.
José