sanchessd Postado 15 de janeiro de 2012 Denunciar Compartilhar Postado 15 de janeiro de 2012 Boa tarde, estou fazendo um formulario para enviar link do app para um amigo(a) do usuario. salvei nomeDoUsuario, nomeDoAmigo e emailDoAmigo em strings separadas. Agora quero enviar para emailDoAmigo o link do meu app, ficaria +- assim: Olá "nomeDoAmigo", "nomeDoUsuario" enviou está indicaçao para voce: "link do app". // o email seria enviado com meu dominio no caso! voce tem alguma dica de como posso fazer isso ? Obrigado! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Vincent Postado 16 de janeiro de 2012 Denunciar Compartilhar Postado 16 de janeiro de 2012 (editado) Primeiro de tudo, adicione o framework necessário: Vai nas configurações do projeto (logo no topo da,lista de classes no XCode). Clique no ícone do seu app, em "Targets" > Build Phases > expanda "Link binary with libraries" > pesquise por "MessageUI" (sem aspas) > selecione o framework e clique em "Add". Agora informe ao viewController.h onde o form de email será mostrado que ele é delegate de <MFMailCompose e adicione as bibliotecas necessárias. #import <UIKit/UIKit.h>#import <MessageUI/MessageUI.h>#import <MessageUI/MFMailComposeViewController.h>@interface viewController : UIViewController <MFMailComposeViewControllerDelegate>@end[/CODE]Adicione os seguintes métodos no seu viewController.m:[CODE]// Launches the Mail application on the device.-(void)launchMailAppOnDevice{ NSString *recipients = @"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!"; NSString *body = @"&body=It is raining in sunny California!"; NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body]; email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];}#pragma mark -#pragma mark Compose Mail// Displays an email composition interface inside the application. Populates all the Mail fields.-(void)displayComposerSheet{ MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self; // Set up recipients NSArray *toRecipients = [NSArray arrayWithObject:@"emailDoAmigo@exemplo.com.br"]; [picker setToRecipients:toRecipients];[color=#8d5f25][color=#ffffff][p[/color][color=#1e9dcc]setSubject[/color][color=#ffffff]:[/color]@"Seu amigo te indicou um app!"[color=#ffffff]];[/color][/color][color=#8d5f25][color=#ffffff][p[/color][color=#1e9dcc]setMessageBody[/color][color=#ffffff]:[/color]@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br"[color=#ffffff] [/color][color=#1e9dcc]isHTML[/color][color=#ffffff]:[/color][color=#c04f53]YES[/color][color=#ffffff]];[/color][/color] [self presentModalViewController:picker animated:YES];}// Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with the result of the operation.- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error{ [self dismissModalViewControllerAnimated:YES];}-(IBAction)showPicker:(id)sender{ // This sample can run on devices running iPhone OS 2.0 or later // The MFMailComposeViewController class is only available in iPhone OS 3.0 or later. // So, we must verify the existence of the above class and provide a workaround for devices running // earlier versions of the iPhone OS. // We display an email composition interface if MFMailComposeViewController exists and the device can send emails. // We launch the Mail application on the device, otherwise. Class mailClass = (NSClassFromString(@"MFMailComposeViewController")); if (mailClass != nil) { // We must always check whether the current device is configured for sending emails if ([mailClass canSendMail]) { [self displayComposerSheet]; } else { [self launchMailAppOnDevice]; } } else { [self launchMailAppOnDevice]; }}[/CODE]Vamos focar na parte que é importante pra você:[CODE]-(void)displayComposerSheet{ MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self; // Set up recipients NSArray *toRecipients = [NSArray arrayWithObject:@"iluno@deaaz.com.br"]; [picker setToRecipients:toRecipients]; [picker setSubject:@"Seu amigo te indicou um app!"]; [picker setMessageBody:@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br" isHTML:NO]; [self presentModalViewController:picker animated:YES];}[/CODE]É aqui onde você seta o destinatário do email, o assunto do email a ser enviado e o corpo da mensagem. As strings você trabalha da forma que achar melhor. Ali em [font=courier new,courier,monospace][picker setMessageBody:@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br" isHTML:NO]; [font=arial,helvetica,sans-serif][size=3][size=4]você pode escolher entre enviar um email HTML ou não. Mas lembrando que se você enviar um email HTML, a string com o corpo da mensagem deve ser um código HTML.[/size][/size][/font][/font][font=courier new,courier,monospace][font=arial,helvetica,sans-serif][size=3][size=4]Não é necessário definir o email do remetente porque o app vai enviar o email através da conta padrão do usuário, definida nas configurações (a mesma conta que ele usa no Mail App).[/size][/size][/font][/font] Editado 16 de janeiro de 2012 por Gabriel Vincent Citar Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Vincent Postado 16 de janeiro de 2012 Denunciar Compartilhar Postado 16 de janeiro de 2012 Esqueci de dizer: em viewController.h, crie o método para linkar com um botão no interface builder: - (IBAction)showPicker:(id)sender;[/CODE]A não ser que você queira que o método seja chamado de outra forma que não permita a interação com o interface builder. Aí você cria o método em viewController.m como void e não precisa criá-lo em viewController.h:[CODE]- (void) showPicker { //Aqui o código é igual a se fosse uma IBAction}[/CODE] Citar Link para o comentário Compartilhar em outros sites More sharing options...
sanchessd Postado 16 de janeiro de 2012 Autor Denunciar Compartilhar Postado 16 de janeiro de 2012 Opa, primeiramente obrigado pela dica, implementei o codigo tudo certinho, no remetente e menssagem coloquei minhas strings, que serao o que o usuario digitar nos TextField, porem nao recebo o email quando faço o teste, estou usando o simulador pois estou ainda aguardando minha conta developer que comprei a uma semana, No simulador habilitei a opçao de enviar emails, tem mais alguma coisa que tenho que fazer ? Ou o problema seria no código mesmo, lembrando que está tudo certo, nenhum issue , verifiquei varias vezes o codigo para me certificar! Citar Link para o comentário Compartilhar em outros sites More sharing options...
sanchessd Postado 16 de janeiro de 2012 Autor Denunciar Compartilhar Postado 16 de janeiro de 2012 o que eu fiz foi o seguinte, criei uma nova classe no meu progeto, MailComposer.h e MailComposer.m em MailComposer.h #import <UIKit/UIKit.h>#import <MessageUI/MessageUI.h>#import <MessageUI/MFMailComposeViewController.h>@interface MailComposer : UIViewController <MFMailComposeViewControllerDelegate>{ IBOutlet UITextField *seuNome; IBOutlet UITextField *seuEmail; IBOutlet UITextField *amigoNome; IBOutlet UITextField *amigoEmail; IBOutlet UILabel *message;}@property (nonatomic, retain) IBOutlet UILabel *message;- (void) showPicker ;- (IBAction)chamada:(id)sender;-(void)displayComposerSheet;-(void)launchMailAppOnDevice;@end[/CODE]em MailComposer.m[CODE]#import "MailComposer.h"@implementation MailComposer@synthesize message;-(IBAction)chamada:(id)sender{ [self showPicker];}- (void) showPicker{// This sample can run on devices running iPhone OS 2.0 or later // The MFMailComposeViewController class is only available in iPhone OS 3.0 or later.// So, we must verify the existence of the above class and provide a workaround for devices running// earlier versions of the iPhone OS.// We display an email composition interface if MFMailComposeViewController exists and the device can send emails.// We launch the Mail application on the device, otherwise.Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));if (mailClass != nil){ // We must always check whether the current device is configured for sending emails if ([mailClass canSendMail]) { [self displayComposerSheet]; } else { [self launchMailAppOnDevice]; }}else{ [self launchMailAppOnDevice];}}#pragma mark -#pragma mark Compose Mail// Displays an email composition interface inside the application. Populates all the Mail fields.-(void)displayComposerSheet{ MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self; // Set up recipients NSArray *toRecipients = [NSArray arrayWithObject:@"joao.sanches@gruporscom.com.br"]; [picker setToRecipients:toRecipients]; [picker setSubject:@"Seu amigo te indicou um app!"]; [picker setMessageBody:@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br" isHTML:NO]; [self presentModalViewController:picker animated:YES];}// Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with the result of the operation.- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error{message.hidden = NO;// Notifies users about errors associated with the interfaceswitch (result){ case MFMailComposeResultCancelled: message.text = @"Result: canceled"; break; case MFMailComposeResultSaved: message.text = @"Result: saved"; break; case MFMailComposeResultSent: message.text = @"Result: sent"; break; case MFMailComposeResultFailed: message.text = @"Result: failed"; break; default: message.text = @"Result: not sent"; break;}[self dismissModalViewControllerAnimated:YES];}#pragma mark -#pragma mark Workaround// Launches the Mail application on the device.-(void)launchMailAppOnDevice{NSString *recipients = @"mailto:jucajl@hotmail.com&subject=Hello from California!";NSString *body = @"&body=It is raining in sunny California!";NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];}#pragma mark -#pragma mark Unload views- (void)viewDidUnload{// Release any retained subviews of the main view.// e.g. self.myOutlet = nil;self.message = nil;}@end[/CODE]e fiz as devidas ligaçoes na minha XIB, maas, quando clico no botão que faz a chama nada acontece, sendo que deveria chamar [self showPicker];o problema principal é que nao chama os campos de email,segunda coisa, meu objetivo é que nao chame os campos do email, é que simplesmente pegue o texto e dados do email de destinatario que tenho nas minhas strings e envie diretamente,terceira coisa, caso o usuario nao tenha uma conta de email cadastrada no iPhone, o email nao será enviado, certo ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Vincent Postado 16 de janeiro de 2012 Denunciar Compartilhar Postado 16 de janeiro de 2012 o que eu fiz foi o seguinte, criei uma nova classe no meu progeto, MailComposer.h e MailComposer.m em MailComposer.h #import <UIKit/UIKit.h>#import <MessageUI/MessageUI.h>#import <MessageUI/MFMailComposeViewController.h>@interface MailComposer : UIViewController <MFMailComposeViewControllerDelegate>{ IBOutlet UITextField *seuNome; IBOutlet UITextField *seuEmail; IBOutlet UITextField *amigoNome; IBOutlet UITextField *amigoEmail; IBOutlet UILabel *message;}@property (nonatomic, retain) IBOutlet UILabel *message;- (void) showPicker ;- (IBAction)chamada:(id)sender;-(void)displayComposerSheet;-(void)launchMailAppOnDevice;@end[/CODE]em MailComposer.m[CODE]#import "MailComposer.h"@implementation MailComposer@synthesize message;-(IBAction)chamada:(id)sender{ [self showPicker];}- (void) showPicker{// This sample can run on devices running iPhone OS 2.0 or later// The MFMailComposeViewController class is only available in iPhone OS 3.0 or later.// So, we must verify the existence of the above class and provide a workaround for devices running// earlier versions of the iPhone OS.// We display an email composition interface if MFMailComposeViewController exists and the device can send emails.// We launch the Mail application on the device, otherwise.Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));if (mailClass != nil){ // We must always check whether the current device is configured for sending emails if ([mailClass canSendMail]) { [self displayComposerSheet]; } else { [self launchMailAppOnDevice]; }}else{ [self launchMailAppOnDevice];}}#pragma mark -#pragma mark Compose Mail// Displays an email composition interface inside the application. Populates all the Mail fields.-(void)displayComposerSheet{ MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self; // Set up recipients NSArray *toRecipients = [NSArray arrayWithObject:@"joao.sanches@gruporscom.com.br"]; [picker setToRecipients:toRecipients]; [picker setSubject:@"Seu amigo te indicou um app!"]; [picker setMessageBody:@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br" isHTML:NO]; [self presentModalViewController:picker animated:YES];}// Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with the result of the operation.- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error{message.hidden = NO;// Notifies users about errors associated with the interfaceswitch (result){ case MFMailComposeResultCancelled: message.text = @"Result: canceled"; break; case MFMailComposeResultSaved: message.text = @"Result: saved"; break; case MFMailComposeResultSent: message.text = @"Result: sent"; break; case MFMailComposeResultFailed: message.text = @"Result: failed"; break; default: message.text = @"Result: not sent"; break;}[self dismissModalViewControllerAnimated:YES];}#pragma mark -#pragma mark Workaround// Launches the Mail application on the device.-(void)launchMailAppOnDevice{NSString *recipients = @"mailto:jucajl@hotmail.com&subject=Hello from California!";NSString *body = @"&body=It is raining in sunny California!";NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];}#pragma mark -#pragma mark Unload views- (void)viewDidUnload{// Release any retained subviews of the main view.// e.g. self.myOutlet = nil;self.message = nil;}@end[/CODE]e fiz as devidas ligaçoes na minha XIB, maas, quando clico no botão que faz a chama nada acontece, sendo que deveria chamar [self showPicker];o problema principal é que nao chama os campos de email,segunda coisa, meu objetivo é que nao chame os campos do email, é que simplesmente pegue o texto e dados do email de destinatario que tenho nas minhas strings e envie diretamente,terceira coisa, caso o usuario nao tenha uma conta de email cadastrada no iPhone, o email nao será enviado, certo ?Primeira coisa: Você adicionou o framework?Segunda coisa: Então você vai precisar usar requisições HTTP, pra enviar as informações para um servidor que vai rodar um código PHP que vai enviar esse email.Terceira coisa: certo.Você sabe alguma linguagem web e tem pelo menos um servidor virtual instalado no seu computador, para poder testar a linguagem? Citar Link para o comentário Compartilhar em outros sites More sharing options...
sanchessd Postado 16 de janeiro de 2012 Autor Denunciar Compartilhar Postado 16 de janeiro de 2012 sim, adcionei o framework. tenho um servidor para testar, e tenho um programador PHP que trabalha juntamente comigo. Agora preciso de mais informaçoes de como proceder, quero que o usuario nao precise de uma conta cadastrada no celular para enviar o email , semelhante aos apps da MOBRADIO. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Vincent Postado 16 de janeiro de 2012 Denunciar Compartilhar Postado 16 de janeiro de 2012 sim, adcionei o framework. tenho um servidor para testar, e tenho um programador PHP que trabalha juntamente comigo. Agora preciso de mais informaçoes de como proceder, quero que o usuario nao precise de uma conta cadastrada no celular para enviar o email , semelhante aos apps da MOBRADIO. Em objective-C, faça assim no método que enviará o email: NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:[NSString stringWithFormat:@"http://seudominio.com.br/enviaremail.php?nomeDoAmigo=%@&nomeDoUsuario=%@&emailDoAmigo=%@&linkDoApp=%@&emailDoUsuario=%@", nomeDoAmigo, nomeDoUsuario, emailDoAmigo, linkDoApp, emailDoUsuario]]];[request setHTTPMethod: @"GET"];NSData *response = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];NSString *stringResponse = [[NSString alloc] initWithData: response encoding: NSUTF8StringEncoding];NSLog(@"Response: %@", stringResponse);[/CODE]Aí você pede pro seu programador PHP criar um script PHP no seudominio.com.br/enviaremail.phpDiz pra ele pra, caso o email seja enviado com sucesso, que ele dê um [font=arial,helvetica,sans-serif][size=4][font=courier new,courier,monospace]echo "enviado"; [font=arial,helvetica,sans-serif]para que você receba no iOS a confirmação de que o email foi enviado.[/font][/font][/size][/font] Citar Link para o comentário Compartilhar em outros sites More sharing options...
sanchessd Postado 17 de janeiro de 2012 Autor Denunciar Compartilhar Postado 17 de janeiro de 2012 (editado) a funçao PHP ficou assim: <?php#ENVIAR E-MAIL.function enviaremail($para,$de,$assunto,$mensagem){$headers = 'Content-Type: text/html; charset=iso-8859-1\n';$headers .= 'From: '.$de.'\n';@mail($para, $assunto, $mensagem, $headers);return true;}print enviar_email($_REQUEST[destinatario],$_REQUEST[nomeRemetente],$_REQUEST[assunto],$_REQUEST[mensagem],$_REQUEST[emailRemetente]);?>[/CODE]e a funçao no xcode assim:[CODE]-(IBAction)enviar{ NSString *remetente = [NSString stringWithFormat:@"%@", [seuEmail text]]; NSString *nomeRemetente = [NSString stringWithFormat:@"%@", [seuNome text]]; NSString *destinatario = [NSString stringWithFormat:@"joao.sanches@gruporscom.com.br"]; NSString *menssagem = [NSString stringWithFormat:@"%@", [message text]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:[NSString stringWithFormat:@"http://www.gruporscom.com.br/enviaremail.php?destinatario=%@&nomeRemetente=%@&menssagem=%@&emailRemetente=%@", destinatario, nomeRemetente, menssagem,remetente]]]; [request setHTTPMethod: @"GET"]; NSData *response = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil]; NSString *stringResponse = [[NSString alloc] initWithData: response encoding: NSUTF8StringEncoding]; NSLog(@"Response: %@", stringResponse); [seuNome setText:@""]; [seuEmail setText:@""]; [message setText:@""];}[/CODE]Nao funcionou, nao recebo nenhum email, e observo que nos logs do app quando está em execução fica: [771:207] Response: 1no caso a string response com valor 1o que está errrado ? Editado 17 de janeiro de 2012 por sanchessd Citar Link para o comentário Compartilhar em outros sites More sharing options...
sanchessd Postado 17 de janeiro de 2012 Autor Denunciar Compartilhar Postado 17 de janeiro de 2012 eu supeito de que as minhas variaveis não estejam chegando na função PHP, não tem um meio que eu possa me certificar ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Vincent Postado 17 de janeiro de 2012 Denunciar Compartilhar Postado 17 de janeiro de 2012 eu supeito de que as minhas variaveis não estejam chegando na função PHP, não tem um meio que eu possa me certificar ? Sim, através de: NSData *response = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil]; NSString *stringResponse = [[NSString alloc] initWithData: response encoding: NSUTF8StringEncoding]; NSLog(@"Response: %@", stringResponse);[/CODE]Isso vai receber o output do script PHP Citar Link para o comentário Compartilhar em outros sites More sharing options...
sanchessd Postado 17 de janeiro de 2012 Autor Denunciar Compartilhar Postado 17 de janeiro de 2012 sim me retorna 1 'True', mas o email nao chega, enviei para voce uma MP, a minha supeita de nao estar enviando minhas strings é que caso voce abrir direto no navegador www.gruporscom.com.br/enviaremail.php ele vai te retornar 1 TRUE sendo que nao está recebendo nada como parametro quando voce acessa pelo navegador! Citar Link para o comentário Compartilhar em outros sites More sharing options...
sanchessd Postado 17 de janeiro de 2012 Autor Denunciar Compartilhar Postado 17 de janeiro de 2012 Descobri qual era meu problema, era o servidor da LocaWeb que estava bloqueando, hospedei em outro servidor e funcionou tranquilo, porem mais um detalhe, ficou case sensitive, sendo que se eu colocar uma letra maiuscula ou caracteres especiais ele nao envia, pela lógica o PHP identifica as variaveis independente do tipo. Mas mesmo assim exige um tratamento especial nas strings que recebo como parametro ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Vincent Postado 17 de janeiro de 2012 Denunciar Compartilhar Postado 17 de janeiro de 2012 (editado) Descobri qual era meu problema, era o servidor da LocaWeb que estava bloqueando, hospedei em outro servidor e funcionou tranquilo, porem mais um detalhe, ficou case sensitive, sendo que se eu colocar uma letra maiuscula ou caracteres especiais ele nao envia, pela lógica o PHP identifica as variaveis independente do tipo. Mas mesmo assim exige um tratamento especial nas strings que recebo como parametro ? Não tenho certeza, mas vê se no programa PHP, se vc fizer isso: $new = htmlspecialchars($stringComCharsEspeciais, ENT_DISALLOWED);[/CODE]Quanto a ser case sensitive, antes de passar pro PHP, faça assim:[CODE]string = [string lowercaseString];[/CODE] Editado 17 de janeiro de 2012 por Gabriel Vincent Citar Link para o comentário Compartilhar em outros sites More sharing options...
sanchessd Postado 22 de janeiro de 2012 Autor Denunciar Compartilhar Postado 22 de janeiro de 2012 (editado) OK resolvi o problema, na verdade salvei todas minhas strings que ia enviar por parametro e uma unica, depois usei o NSUTF8StringEncoding nessa string // Enviando parametros para funcao PHP NSString *urlEnvio = [[NSString alloc] initWithFormat:@"http://www.bgclassificados.com.br/envia_email.php?destinatario=%@&remetente=%@&mensagem=%@&assunto=%@&nome=%@", destinatario, remetente, mensagem,assunto,nomeRemetente]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:[urlEnvio stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];[/CODE]e no PHP usei para mostrar os acentos,[CODE]utf8_decode($stringComMensagem);[/CODE]e para que os enters dados pelo usuario no form fossem reconhecidos, se nao ficava tudo na mesma linha usei o, [CODE]nl2br($stringComMensage);[/CODE] Editado 22 de janeiro de 2012 por sanchessd Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Participe do debate
Você pode postar agora e se registrar depois. Se você tem uma conta, entre agora para postar com ela.