¿Cómo excluir aplicaciones de Notas y Recordatorios del UIActivityViewController?

Estoy creando un UIActivityViewController y le paso String y URL . Esto, obviamente, configura el UIActivityViewController para usar algunos elementos que quiero excluir (mi objective es compartir la información sobre mi aplicación).

He logrado excluir muchas actividades proporcionadas por el sistema (como ‘Agregar a la lista de lectura’) estableciendo los tipos de actividad de excludedActivityTypes apropiados.

Sin embargo, no puedo excluir las aplicaciones Recordatorios y Notas. ¿Alguien puede sugerir una forma de hacerlo? Estas aplicaciones aparecen 3ra y 4ta en la lista y por lo tanto hacen que Twitter y Facebook no sean visibles a menos que el usuario se desplace.

    Hay una manera, pero implica una API privada .

    Algunas veces Apple hace excepciones, especialmente si arreglas un error.

    Vamos a sumergirnos en los detalles …


    UIActivityViewController tiene un método privado llamado “_availableActivitiesForItems:”, que devuelve una matriz de objetos UISocialActivity .

    UISocialActivity tiene una propiedad interesante, llamada “activityType”, que devuelve un tipo de actividad con formato de dominio.

    Después de algunas pruebas, logré descubrir los tipos de actividad Recordatorio y Notas:

    • com.apple.reminders.RemindersEditorExtension
    • com.apple.mobilenotes.SharingExtension

    Desafortunadamente , pasar esos dos tipos a “.excludedActivityTypes” no hizo ninguna diferencia.

    “_AvailableActivitiesForItems:” al rescate!

    VIEJO CAMINO :

    Actualización : he encontrado una mejor manera de hacerlo.

    La primera solución que he publicado no funciona en algunos casos, por lo tanto, no debe considerarse estable.

    Encabezamiento:

     #import  @interface UISocialActivity : NSObject - (id)activityType; @end @interface UIActivityViewController (Private) - (id)_availableActivitiesForItems:(id)arg1; @end @interface ActivityViewController : UIActivityViewController @end 

    Implementación:

     @implementation ActivityViewController - (id)_availableActivitiesForItems:(id)arg1 { id activities = [super _availableActivitiesForItems:arg1]; NSMutableArray *filteredActivities = [NSMutableArray array]; [activities enumerateObjectsUsingBlock:^(UISocialActivity* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (![[obj activityType] isEqualToString:@"com.apple.reminders.RemindersEditorExtension"] && ![[obj activityType] isEqualToString:@"com.apple.mobilenotes.SharingExtension"]) { [filteredActivities addObject:obj]; } }]; return [NSArray arrayWithArray:filteredActivities]; } @end 

    NUEVA FORMA :

    Encabezamiento:

     @interface UIActivityViewController (Private) - (BOOL)_shouldExcludeActivityType:(UIActivity*)activity; @end @interface ActivityViewController : UIActivityViewController @end 

    Implementación:

     @implementation ActivityViewController - (BOOL)_shouldExcludeActivityType:(UIActivity *)activity { if ([[activity activityType] isEqualToString:@"com.apple.reminders.RemindersEditorExtension"] || [[activity activityType] isEqualToString:@"com.apple.mobilenotes.SharingExtension"]) { return YES; } return [super _shouldExcludeActivityType:activity]; } 

    @fin

    “Ilegal”, pero funciona.

    Sería genial saber si realmente pasa la validación de Apple.

    Si no desea subclasificar UIActivityViewController , puede incluirlos en sus .excludedActivityTypes al crear su UIActivityViewController .

    C objective:

     UIActivityViewController *activityController = [[UIActivityViewController alloc]initWithActivityItems:sharingItems applicationActivities:nil]; activityController.excludedActivityTypes = @[ UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeAddToReadingList, UIActivityTypeSaveToCameraRoll, UIActivityTypeOpenInIBooks, @"com.apple.mobilenotes.SharingExtension", @"com.apple.reminders.RemindersEditorExtension" ]; [self presentViewController:activityController animated:YES completion:nil]; 

    Swift 3:

     let activityController = UIActivityViewController(activityItems: sharingItems, applicationActivities: nil) activityController.excludedActivityTypes = [ UIActivityType.assignToContact, UIActivityType.print, UIActivityType.addToReadingList, UIActivityType.saveToCameraRoll, UIActivityType.openInIBooks, UIActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension"), UIActivityType(rawValue: "com.apple.mobilenotes.SharingExtension"), ] present(activityController, animated: true, completion: nil) 

    Swift 2.2 versión. Probado en iOS9.3. Trabajos.

    ACTUALIZADO y aprobado por App Store Review.

     import UIKit class ActivityViewController: UIActivityViewController { func _shouldExcludeActivityType(activity: UIActivity) -> Bool { let activityTypesToExclude = [ "com.apple.reminders.RemindersEditorExtension", "com.apple.mobilenotes.SharingExtension", UIActivityTypeOpenInIBooks, UIActivityTypePrint, UIActivityTypeAssignToContact, "com.google.Drive.ShareExtension" ] if let actType = activity.activityType() { if activityTypesToExclude.contains(actType) { return true } else if super.excludedActivityTypes != nil { return super.excludedActivityTypes!.contains(actType) } } return false } } 

    También es útil

      "com.apple.mobileslideshow.StreamShareService" 

    se deshace de la “nube”.

    enter image description here

    No puede excluir estos ya que las Notas y Recordatorios no están declarados como UIActivities en la Documentación de Apple. Solo un problema con iOS9 y, con suerte, Apple proporcionará esta opción. Las UIActividades declaradas hasta este momento son:

     UIActivityTypePostToFacebook, UIActivityTypePostToTwitter, UIActivityTypePostToWeibo, UIActivityTypeMessage, UIActivityTypeMail, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr, UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo, UIActivityTypeAirDrop 

    Para Swift3 +, no hay necesidad de ningún hack privado de API. Simplemente use la matriz pública “excludedTypes” en UIActivityViewController. Como todavía no hay UIActivityType para estos (ya que son extensiones de Apple), debe consultarlo a través de String. También puede usar este formato para extensiones de terceros que comparta.

    p.ej

     let avc = UIActivityViewController(activityItems: ["my item"], applicationActivities: nil) avc.excludedActivityTypes = [ .copyToPasteboard, UIActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension"), UIActivityType(rawValue: "com.apple.mobilenotes.SharingExtension") ] avc.completionWithItemsHandler = { (activity, success, items, error) in print("AVC finished \(success) \(activity as Optional) \(items as Optional) \(error as Optional)") } present(avc, animated: true, completion: nil) 

    La única forma que he encontrado es crear sus propias actividades personalizadas, pasarles parámetros directamente (no a través de la hoja de actividades) y luego pasar alguna variable aleatoria (no cadena, URL, imagen) a través de la hoja de actividades.

     MyCustomPinterestShareActivity* pinterest = [[MyCustomPinterestShareActivity alloc] init]; MyCustomFacebookGroupsActivity* facebook = [[MyCustomFacebookGroupsActivity alloc] init]; MyCustomInstagramActivity* instagram = [[MyCustomInstagramActivity alloc] init]; NSArray *activities = @[facebook,instagram,pinterest]; NSArray *activityItems = @[someVarThatCanBeWhateverTypeJustNotStringURLOrImg]; UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:activities]; 

    Pero, una vez más, ¿por qué querría utilizar el ActivityViewController en primer lugar si no puede utilizar ninguna de las funciones … Espero que pronto haya una solución mejor?

    ¡Gracias por esto! En xcode 8.1, swift 3, pude usar para obtener:

    UIActivityType (rawValue: “com.apple.reminders.RemindersEditorExtension”), UIActivityType (rawValue: “com.apple.mobilenotes.SharingExtension”),

    No pude enviar _shouldExcludeActivityType a Super como lo recomendó Matteo Pacini, pero así es como pude solucionar esto:

     @interface CustomActivityViewController() - (BOOL)_shouldExcludeActivityType:(UIActivity *)activity; @end @implementation CustomActivityViewController (...) - (BOOL)_shouldExcludeActivityType:(UIActivity *)activity{ if([[activity activityType] isEqualToString:@"com.apple.reminders.RemindersEditorExtension"] || [[activity activityType] isEqualToString:@"com.apple.mobilenotes.SharingExtension"]){ return YES; } return [[super excludedActivityTypes]containsObject:activity.activityType]; }