ios - UIActivityViewController-Uso compartido de correo electrónico y Twitter
email nsmutablearray (5)
Recientemente comencé a trabajar con UIActivity para compartir mi aplicación al mundo, pero tengo pocos problemas. Primero, no encontré cómo establecer el tema de mi correo electrónico. ¿Hay alguna manera? En segundo lugar, cuando configuro el texto del cuerpo de mi correo electrónico, aparece una "entrada" adicional (la primera línea del correo electrónico está en blanco y el texto comienza en la segunda línea). Aquí está el código:
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects: @"Test", nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
initWithActivityItems:array applicationActivities:nil];
Y en el correo electrónico, muestra que:
"
Prueba "
Tercero: ¿hay alguna manera de saber qué método de intercambio se ha seleccionado? Porque quiero incluir un hashtag en mi publicación cuando el usuario comparte en Twitter, pero ahora también se integra en el correo electrónico, lo que obviamente no tiene sentido.
¡Gracias!
1 y 2: ¿cómo configuro los destinatarios para UIActivityViewController en iOS 6?
Aunque ambos métodos proporcionados son un poco piratas informáticos, especialmente el primero, es posible.
3: es posible compartir contenido diferente en diferentes servicios, pero el número de elementos y sus tipos debe ser el mismo (pero no es una limitación, en realidad, ya que puede devolver nada para los artículos que no necesita en un servicio particular) ) Debe crear elementos para compartir después de seleccionar el servicio utilizando el protocolo UIActivityItemSource
Código que uso:
Muestra UIActivityViewController con el controlador actual como proveedor de todos los elementos (debe tenerlo en el archivo .h):
const int numberOfSharedItems = 5;
- (IBAction)shareAction:(id)sender
{
NSMutableArray *shareItems = [NSMutableArray new];
while ([shareItems count] < numberOfSharedItems)
[shareItems addObject: self];
UIActivityViewController *shareController =
[[UIActivityViewController alloc]
// actual items are prepared by UIActivityItemSource protocol methods below
initWithActivityItems: shareItems
applicationActivities :nil];
shareController.excludedActivityTypes = @[UIActivityTypeMessage, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll];
[self presentViewController: shareController animated: YES completion: nil];
}
Haga marcadores de posición para los artículos que serán compartidos:
-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
static UIActivityViewController *shareController;
static int itemNo;
if (shareController == activityViewController && itemNo < numberOfSharedItems - 1)
itemNo++;
else {
itemNo = 0;
shareController = activityViewController;
}
switch (itemNo) {
case 0: return @""; // intro in email
case 1: return @""; // email text
case 2: return [NSURL new]; // link
case 3: return [UIImage new]; // picture
case 4: return @""; // extra text (via in twitter, signature in email)
default: return nil;
}
}
Haga artículos reales que serán compartidos, de manera diferente para diferentes servicios:
-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{
// the number of item to share
static UIActivityViewController *shareController;
static int itemNo;
if (shareController == activityViewController && itemNo < numberOfSharedItems - 1)
itemNo++;
else {
itemNo = 0;
shareController = activityViewController;
}
NSString *shareText = [self shareText]; // whatever you fancy
NSURL *shareURL = [self shareURL];
// twitter
if ([activityType isEqualToString: UIActivityTypePostToTwitter])
switch (itemNo) {
case 0: return nil;
case 1: return shareText; // you can change text for twitter, I add $ to stock symbol inside shareText here, e.g. Hashtags can be added too
case 2: return shareURL;
case 3: return nil; // no picture
case 4: return @"via @YourApp";
default: return nil;
}
// email
else if ([activityType isEqualToString: UIActivityTypeMail])
switch (itemNo) {
case 0: return @"Hi!/r/n/r/nI used YourApp/r/n";
case 1: return shareText;
case 2: return shareURL;
case 3: return nil; // no picture
case 4: return [@"/r/nCheck it out./r/n/r/nCheers/r/n" stringByAppendingString: [self userName]];
default: return nil;
}
else // Facebook or something else in the future
switch (itemNo) {
case 0: return nil;
case 1: return shareText;
case 2: return shareURL;
case 3: return [self shareImage];
case 4: return nil;
default: return nil;
}
}
En iOS7, esto es posible mediante el uso de -
activityViewController:subjectForActivityType:
Al publicar un artículo, el servicio puede proporcionar un campo de asunto y un campo de datos por separado, como un mensaje de correo electrónico. Implemente este método si desea proporcionar un campo temático para los servicios que lo respaldan.
Es posible que desee probar OvershareKit .
Con frecuencia nos preguntan por qué alguien usaría OvershareKit en lugar de UIActivityViewController (UIAVC) y UIActivity. UIAVC es ideal para aplicaciones que saben que nunca necesitarán lo siguiente:
- Nunca necesita integrarse con más de uno o dos servicios de terceros.
- No es necesario modificar la interfaz de usuario para la hoja de actividades y las pantallas para compartir.
- Nunca se preocupe por proporcionar contenido separado y específico para cada tipo de uso compartido (correo electrónico o SMS, etc.)
- Nunca necesita tener varios elementos como Copiar texto en lugar de Copiar enlace en la misma hoja.
- No importa que todas las actividades no provistas por el sistema se atasquen con aburridos iconos monocromáticos.
Su situación es (3): la necesidad de preocuparse por el contenido diferente para diferentes tipos de uso compartido.
Para agregar sujeto al correo electrónico usando UIActivityViewController en iOS6, esta es la mejor solución que cualquiera puede usar. Todo lo que tiene que hacer es invocar lo siguiente al inicializar UIActivityViewController.
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];
[activityViewController setValue:@"My Subject Text" forKey:@"subject"];
Y su UIActivityViewController se completa con un asunto.
Puedes simplemente crear una clase de la siguiente manera:
@interface MYNActivityProvider : UIActivityItemProvider <UIActivityItemSource>
@end
// implementación
- (id) activityViewController:(UIActivityViewController *)activityViewController
itemForActivityType:(NSString *)activityType
{
if ( [activityType isEqualToString:UIActivityTypePostToTwitter] ) {
return stringToPost;
}
if ( [activityType isEqualToString:UIActivityTypePostToFacebook] ) {
return stringToPost;
}
if ( [activityType isEqualToString:UIActivityTypeMessage] ) {
return @"SMS message text";
}
if ( [activityType isEqualToString:UIActivityTypeMail] ) {
return @"Email text here!";
}
if ( [activityType isEqualToString:@"Custom"] ) {
return @"app custom text";
}
return nil;
}