ios objective-c xcode url uiactivityviewcontroller

ios - UIActivityViewController: solo adjunte una URL para ciertas actividades



objective-c xcode (2)

He intentado usar el nuevo UIActivityViewController para reemplazar todas mis UIActionSheets para compartir, sin embargo, me he encontrado con un problema.

Tengo 5 actividades, Mensaje, Correo electrónico, Copia, Twitter y Facebook. Ya he descubierto cómo mostrar esos textos diferentes, a través de esto en una subclase UIActivityProvider personalizada:

- (id) activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { if ( [activityType isEqualToString:UIActivityTypePostToTwitter] ) return twitter; if ( [activityType isEqualToString:UIActivityTypePostToFacebook] ) return facebook; if ( [activityType isEqualToString:UIActivityTypeMessage] ) return urlScheme; if ( [activityType isEqualToString:UIActivityTypeMail] ) return urlScheme; if ( [activityType isEqualToString:UIActivityTypeCopyToPasteboard]) return urlScheme; return nil; }

Y esto en mi vista controlador:

ActivityProvider *aProvider = [[ActivityProvider alloc] init]; aProvider.facebook = facebook; aProvider.twitter = twitter; aProvider.urlScheme = URL; NSArray *Items = @[aProvider, sharedURL]; UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:Items applicationActivities:Nil]; activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll, UIActivityTypePostToWeibo]; [self presentViewController:activityVC animated:TRUE completion:nil];

Sin embargo, solo quiero mostrar la URL (sharedURL) en las hojas de compartir de Facebook y Twitter, no el mensaje, correo electrónico o copia. Cualquier forma de lograr esto?


Puede elegir qué enviar a cada tipo de actividad. Creé un proveedor de actividades personalizado y lo llamo así:

NSMutableArray *activityItems = [NSMutableArray array]; CustomActivityItemProvider *activityItemProvider = [[CustomActivityItemProvider alloc] initWithText:text urlText:urlString]; [activityItems addObject:activityItemProvider]; //you can have your own custom activities too: NSArray *applicationActivities = @[[CustomActivity new], [OtherCustomActivity new]]; UIActivityViewController *vc = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:applicationActivities];

El proveedor personalizado es una subclase de UIActivityItemProvider

@interface CustomActivityItemProvider : UIActivityItemProvider - (id)initWithText:(NSString *)text urlText:(NSString *)url; @end

Las agallas de mi clase de proveedor personalizado se parecen a esto:

- (id)initWithText:(NSString *)text urlText:(NSString *)url{ if ((self = [super initWithPlaceholderItem:text])) { self.text = text ?: @""; self.url = url ?: @""; } return self; } - (id)item { NSString *activityType = self.activityType; if ([self.placeholderItem isKindOfClass:[NSString class]]) { if ([self.activityType isEqualToString:UIActivityTypePostToFacebook] || [self.activityType isEqualToString:UIActivityTypeMail]) { return [NSString stringWithFormat:@"%@/n%@", self.text, self.url]; } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) { return [self findBestStringOfLength:kTwitterMessageLength hashTags:YES]; } else if ([activityType isEqualToString:UIActivityTypeMessage]) { return [self findBestStringOfLength:kSMSMessageLength hashTags:YES]; } else { return self.text; } } return self.placeholderItem; }


Debería poder hacer esto implementando su propio UIActivityItemProvider, y devolver cero para cualquier tipo de actividad donde no desee utilizar esa información.