recordatorios poner pantalla mis lista google eliminar elimina como añadir app ios cocoa-touch uiactivityviewcontroller uiactivity

poner - eliminar lista de recordatorios iphone



¿Cómo excluir las aplicaciones de Notas y Recordatorios del UIActivityViewController? (8)

¡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"),

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

Logré excluir muchas actividades proporcionadas por el sistema (como ''Agregar a la lista de lectura'') estableciendo los tipos de actividad excludedActivityTypes apropiados.

Sin embargo, no puedo excluir las aplicaciones Recordatorios y Notas. ¿Alguien puede sugerir una forma de hacerlo? Estas aplicaciones aparecen tercero y cuarto 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 API privada .

A veces Apple hace excepciones, especialmente si corrige 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!

ANTIGUA MANERA :

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

La primera solución que publiqué no funciona en algunos casos, por lo que no debe considerarse estable.

Encabezamiento:

#import <UIKit/UIKit.h> @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 MANERA :

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

@final

" Ilegal ", pero funciona.

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


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 String, URL, Image) 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, de nuevo, ¿por qué querrías usar ActivityViewController en primer lugar si no puedes usar ninguna de las funcionalidades? Espero que haya una solución mejor pronto


No pude enviar _shouldExcludeActivityType a Super según lo recomendado por Matteo Pacini, pero así es como podría 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]; }


No puede excluirlos, ya que las Notas y Recordatorios no se declaran como actividades UIActivities en la Documentación de Apple. Solo un problema a partir de iOS9 y con suerte Apple proporcionará esta opción. Las actividades declaradas de UIA 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 pirateo de API privada. Simplemente use la matriz pública "excludedTypes" en el UIActivityViewController. Como todavía no hay UIActivityType para estos (ya que son las extensiones integradas de Apple), debe consultarlo a través de String. También puede usar este formato para cualquier extensión de uso compartido de terceros.

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)


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

C objetivo:

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 4.2:

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


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

ACTUALIZACIÓN y fue 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 útil

"com.apple.mobileslideshow.StreamShareService"

se deshace de la "nube".