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.