. Crie o seu próprio serviço de web para um aplicativo iOS, - Tudo Sobre Tecnologia


apple_620x465.png
Nós temos a estrutura básica do jogo, mas nós queremos ser capazes de lidar com múltiplos usuários. Cada usuário terá que autenticar a fim de jogar. Queremos também ser capaz de armazenar as credenciais do usuário para que ele ou ela não tem que digitá-los a cada vez. NSUserDefaults é um conceito muito simples: Um aplicativo iOS basicamente armazena certos dados localmente.
Vamos começar por ir à nossa classe ModalVIewController e adicionando propriedades e métodos. Então,  nós vamos  trabalhar em algum código php para o nosso servidor.
Em primeiro lugar, importa a classe Santiapps Helper criado acima em nosso arquivo h..Enquanto estiver lá, adicionar alguns protocolos, propriedades e métodos.

# Import <UIKit/UIKit.h>
# Import "SantiappsHelper.h"
ModalViewController Interface: UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> {
@ } @ Property (não atômica, reter) NSURLConnection * myConnection;
roperty (não atômica, reter) IBOutlet UIButton * RegisterUser; @
@ Property (não atômica, reter) NSMutableData * incomingPostData; @ PProperty (não atômica, reter) IBOutlet UIButton * LoginUser; @ Property (não atômica, reter) IBOutlet UIButton * dismissModal;
serPass; @ Property (não atômica, reter) IBOutlet UITextField * USEREMA
@ Property (não atômica, reter) IBOutlet UITextField * Nome de Usuário; @ Property (não atômica, reter) IBOutlet UITextField * UIL; - (IBAction) userWillDismiss; - (IBAction) userWillLogIn; - (IBAction) userWillRegister;
tring *) direccion; - (NSString *) checkUserLogin: (NSString *) loginUsuario withPass: (NSString *) loginClave; @
- (NSDictionary *) addUser: (NSString *) usuario withPass: (NSString *) withAddress clave: (NS
SEnd

O controlador delegado navegação é necessária, juntamente com o UIImagePickerControllerDelegate para a colheita de imagens. Vamos usá-los quando o usuário carrega sua imagem.
Quanto a propriedades, vamos rever o nosso velho amigo, NSURLConnection, para o qual solicitamos NSMutableData. Em seguida, vamos conectar os botões e campos de texto para seus controles.
Os métodos serão utilizados para quando o usuário descarta a tela de login. É sempre importante acrescentar uma maneira de sair de uma tela de login, mesmo que isso signifique o usuário terá acesso limitado ao aplicativo. O método de login vai fazer exatamente isso, ao passo que o método de registo irá criar um novo usuário. Vamos usar os outros métodos para a verificação de um pedido de login.  Vamos ver o que eles se parecem.

# Import "ModalViewController.h"
ModalViewController implementação
@ - (IBAction) userWillLogIn {
rar user / pass e retornar valor NSString * loginSuccess = [au
/ / Chama checklogin.php comp ato checkUserLogin: self.userName.text withPass: self.userPass.text];
zemos isso ..."); / / Se tudo estiver bem, em seg
if ([loginSuccess isEqualToString: @ "sucesso"]) { NSLog (@ "Nós f iuida, armazená userDefaults NSUserDefaults * prefs = [NSUserDefaults standardUserDefaults];
ss.text forKey: @ "storedPass"]; [Prefs sincronizar]; [Auto
[prefs SetObject: self.userName.text forKey: @ "storedUser"]; [prefs SetObject: self.userP a dismissViewControllerAnimated: SIM conclusão: nil]; } Else { NSLog (@ "Falha na autenticação .."); / / Adicionar UIAlertView
@ otherButtonTitles "OK": nil]; [AlertView show]; [Release alertView]; } / / Se checklogin.php = OK, em seguida, descartar } - (IBAction) userWillRegister
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @ "Oops ..." mensagem: loginSuccess delegado: nil cancelButtonTitle : { / / Cria uniqueIdentifier / / UIDevice * device = [UIDevice currentDevice]; / / NSString * uniqueIdentifier = [dispositivo uniqueIdentifier]; / / 1. Obter o errorsDictionary LOGIN
([[errorsDict objectForKey: @ "code1"] intValue] == 5926) { NSLog (@ "yeay"); / / Se tudo estiver bem, em seguida, armazen
NSDictionary * errorsDict = [auto addUser: self.userName.text withPass: self.userPass.text withAddress: self.userEmail.text]; / / 2. se dictcount = 1 então demitir && = 5926, então OK if á userDefaults NSUserDefaults * prefs = [NSUserDefaults standardUserDefaults]; [prefs SetObject: self.userName.text forKey: @ "storedUser"]; [prefs SetObject: self.userPass.text forKey: @ "storedPass"]; [Prefs sincronizar]; / / Dismis ModalVC depois que os usuários primeiro login
: @ "&"]; [ResultString AppendFormat: @ "% @ =% @", chav
[Auto dismissViewControllerAnimated: SIM conclusão: nil]; } Else { NSLog (@ "erros"); / / Extrato nsdict NSMutableString * ResultString = [string NSMutableString]; for (NSString * chave no [errorsDict AllKeys]) { if ([comprimento ResultString]> 0) [ResultString appendStrin ge, [errorsDict objectForKey: key]]; } NSLog (@ "RS:% @", ResultString); / / Adicionar UIAlertView UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @ "Verifique se o seu usuário, passar ou e-mail" mensagem: ResultString delegado: nil cancelButtonTitle: @ "OK" otherButtonTitles: nil]; [AlertView show]; [Release alertView];
@"
} } - (IBAction) userWillDismiss { [Auto dismissViewControllerAnimated: SIM conclusão: nil]; } / / Registrar usuário ---- mudou-se para modalVC - (NSString *) checkUserLogin: (NSString *) loginUsuario withPass: (NSString *) loginClave { / / CRIAR URL ENVIAR NSString * urlString = [NSString stringWithFormat: @ "username =% @ & password = %, loginUsuario, loginClave]; NSLog (@ "corda login:% @", urlString); / / POST DO CORDA NSData * postData = [urlString dataUsingEncoding: NSUTF8StringEncoding allowLossyConversion: YES]; NSString * postLength = [NSString stringWithFormat: @ "% d", [comprimento postData]];
[Pedido setValue: postLength forHTTPHeaderField: @ "Content-Length"]; [Pedido se
NSMutableURLRequest * request = [[[NSMutableURLRequest alloc] init] autorelease]; NSURL * url = [NSURL URLWithString: [NSString stringWithFormat: @ "http://www.yourserver.com/iGlobe/login2/checklogin.php"]]; [Pedido setURL: url]; [Pedido setHTTPMethod: @ "POST"]; tValue: @ "application / x-www-form-urlencoded" forHTTPHeaderField: @ "Content-Type"]; [Pedido setHTTPBody: postData]; NSURLResponse * Resposta = nil; NSError * Erro = nil; / / Nós provavelmente deve ser analisar os dados retornados por esta chamada, por agora basta verificar o erro.
cação myData: NSUTF8StringEncoding]; / / NSLog (@ "es de string:% @,% i,% C", string, [comprimento da corda], [strin
NSData * myData = [NSURLConnection sendSynchronousRequest: pedido returningResponse: & erro de resposta: e erro]; / / NSError * outError = NULL; / / NSDictionary * tempDict = [NSDictionary dictionaryWithJSONData: erro myData: & outError]; NSString * string = [[NSString alloc] initWithData: codif ig characterAtIndex: 7]); NSLog (@ "corda ess:% @", string); / / NSLog (@ "Dict de erros:% @", tempDict); retornar string; } - (NSDictionary *) addUser: (NSString *) usuario withPass: (NSString *) withAddress clave: (NSString *) direccion { / / CRIAR URL ENVIAR NSString * urlString = [NSString stringWithFormat: @ "username =% @ &% @ password = & email =% @", usuario, clave, direccion];
String stringWithFormat: @ "http://www.yourserver.com/i
NSLog (@ "usuário string de registro:% @", urlString); / / POST DO CORDA NSData * postData = [urlString dataUsingEncoding: NSUTF8StringEncoding allowLossyConversion: YES]; NSString * postLength = [NSString stringWithFormat: @ "% d", [comprimento postData]]; NSMutableURLRequest * request = [[[NSMutableURLRequest alloc] init] autorelease]; NSURL * url = [NSURL URLWithString: [N SGlobe/login2/user_add_save.php"]]; [Pedido setURL: url]; [Pedido setHTTPMethod: @ "POST"]; [Pedido setValue: postLength forHTTPHeaderField: @ "Content-Length"]; [Pedido setValue: @ "application / x-www-form-urlencoded" forHTTPHeaderField: @ "Content-Type"]; [Pedido setHTTPBody: postData]; NSURLResponse * Resposta = nil; NSError * Erro = nil;
& outError]; NSLog (@ "Dict de erros:% @", tempDict); voltar tempDict; } / /
/ / Nós provavelmente deve ser analisar os dados retornados por esta chamada, por agora basta verificar o erro. NSData * myData = [NSURLConnection sendSynchronousRequest: pedido returningResponse: & erro de resposta: e erro]; NSError * outError = NULL; NSDictionary * tempDict = [NSJSONSerialization JSONObjectWithData: opções MYDATA: erro NSJSONReadingMutableContainers :/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / --------------- -PHOTO UPLOAD ----- - (IBAction) uploadPhoto: (id) sender { NSLog (@ "picker"); UIImagePickerController * picker = [[UIImagePickerController alloc] init]; picker.delegate = auto; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [Auto presentViewController: seletor animado: SIM conclusão: nil]; }
: nil]; } - (Void) imagePickerControllerDidCancel: (UIImagePickerController *) selecionador { [Selecionador dismissViewControlle
- (Void) imagePickerController: (UIImagePickerController *) selecionador didFinishPickingMediaWithInfo: (NSDictionary *) Informação { NSLog (@ "pickerPicked"); UIImage * profile_image = [info objectForKey: UIImagePickerControllerOriginalImage]; [Auto uploadImage: UIImageJPEGRepresentation (profile_image, 1.0) filename: @ "globe57.png"]; [Selecionador dismissViewControllerAnimated: SIM conclusã orAnimated: SIM conclusão: nil]; } - (BOOL) uploadImage: (NSData *) imageData filename: (NSString *) {nome do arquivo NSLog (@ "upload"); NSString * urlString = @ "http://www.yourserver.com/iGlobe/photos/uploadPhoto.php"; NSMutableURLRequest * request = [[[NSMutableURLRequest alloc] init] autorelease]; [Pedido setURL: [NSURL URLWithString: urlString]]; [Pedido setHTTPMethod: @ "POST"]; NSString * fronteira = @ "0xKhTmLbOuNdArY";
ingWithFormat: @ "Content-Disposition: form-data; name = \" userfile \ "; filename = \" "\ r \ n", filename
NSString * contentType = [NSString stringWithFormat: @ "multipart / form-data; boundary =% @", limite]; [Pedido AddValue: contentType forHTTPHeaderField: @ "Content-Type"]; NSMutableData * body = [NSMutableData dados]; [AppendData corpo: [[NSString stringWithFormat: @ "\ r \ n -% @ \ r \ n", limite] dataUsingEncoding: NSUTF8StringEncoding]]; / / Definir o nome do arquivo [AppendData corpo: [[NSString stringWithString: [NSString st r]] dataUsingEncoding% @ \: NSUTF8StringEncoding]]; [AppendData corpo: [@ "Content-Type: application / octet-stream \ r \ n \ r \ n" dataUsingEncoding: NSUTF8StringEncoding]]; / / Anexa os dados da imagem [AppendData corpo: [NSData dataWithData: imageData]]; [AppendData corpo: [[NSString stringWithFormat: @ "\ r \ n -% @ - \ r \ n", limite] dataUsingEncoding: NSUTF8StringEncoding]]; [Pedido setHTTPBody: corpo]; NSData * returnData = [NSURLConnection sendSynchronousRequest: pedido returningResponse: Erro zero: nil];
[Super dealloc]; } @ End
NSString * returnString = [[[NSString alloc] initWithData: codificação returnData: NSUTF8StringEncoding] autorelease]; NSLog (@ "returningOKString"); voltar ([returnString isEqualToString: @ "OK"]); } / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / - (Void) {didReceiveMemoryWarning / / Libera a vista, se ele não tem um superview. [Super didReceiveMemoryWarning]; / / Libera quaisquer dados, imagens em cache, etc, que não estão em uso. } - (Void) {viewDidUnload [Super viewDidUnload]; } - Dealloc (void) {

Vamos rever o método de código por método.  
  1. userWillLogin faz método que envia os dados apresentados para o servidor e executa uma verificação (checkUserLogin) uma chamada para a web buscar. Se a autenticação foi bem sucedida, nós armazenamos os dados do usuário em NSUserDefaults para que o usuário não tem que logar novamente. Caso contrário, vamos exibir uma exibição de alerta com a resposta de erro do servidor.
  2. checkUserLogin torna a web buscar e retorna a resposta do servidor.
  3. userWillRegister chamadas para criar um novo usuário, quando o usuário toca no botão de registro. Ele chama o addUser: withPass: withAddress:.
  4. addUser: withPass: withAddress: faz com que o pós web para adicionar o usuário para o nosso banco de dados web.
  5. userWillDismiss é auto-explicativo.
  6. uploadPhoto é responsável por chamar o UIImagePicker para que o usuário pode selecionar sua imagem para upload.
  7. imagePickerController: didFinishPickingMediaWithInfo retorna a imagem selecionada pelo usuário e passa para uploadImage. Para simplificar, não estamos usando a imagem escolhido, em vez disso, nós codificado imagem um espaço reservado apenas para fazer as coisas se movem ao longo de mais suavemente.
  8. uploadImage: filename faz o post da web para fazer o upload da imagem para o servidor.
Agora precisamos que o backend para responder a estes dois pedidos. Especificamente, precisamos de dois arquivos php (checklogin.php e user_add_save.php) e seus arquivos auxiliares. Aqui está checklogin.php.

<? Php
ncluem "login_config.php";
i
/ String de conexão Variables_________________________________________________
/ / / Conecta-se ao servidor
db_username, $ db_password) or die ("Erro não foi po
mysql_connect ($ db_host, $ ssível conectar ao banco de dados:". mysql_error ());
or die ("Erro Não foi poss
/ / Seleciona o banco de dados mysql_select_db ($ db )ível selecionar o banco de dados:". mysql_error ());
= strip_tags (substr ($ _REQUEST ['username'],
/ / IBM sugeriu matagal para solicitação de URL $ Urlu n 0,32)); $ Urlpw = strip_tags (substr ($ _REQUEST ['password'], 0,32)); $ Cleanpw = md5 ($ urlpw);
password = '$ urlpw'"; $ Sql ​​= "S
/ / Echo "Cleanpw: $ cleanpw <br>"; / / $ Sql ​​= "SELECT * FROM agentes ONDE username = '$ urlun' e ELECT * FROM utilizadores WHERE username = '$ urlun' e password = '$ cleanpw'"; $ Resultado = mysql_query ($ sql);
sponde $ myusername e US $ minhasenha, linha da tab
/ / Mysql_num_row está contando as linhas da tabela $ Count = mysql_num_rows ($ resultado); / / Se o resultado corr eela deve ser uma linha / / Echo "Count: $ count <br>"; if ($ contagem == 1) { / / Registra $ myusername e redirecionar para o arquivo arquivo sucesso designado
() + (86400), "/", $ cookie_dom
Cookie_name $ = "$ cookiename"; Cookie_value $ = "$ urlun"; / / Configura até 24 horas $ Cookie_expire = "86400"; setcookie ($ cookie_name, $ cookie_value, time ain); header ("location: $ successful_login_url"); } Else { header ("location: $ failed_login"); } >  e user_add_save.php: <? incluem "master_inc.php";
obrenome'], 0,32)); $ Nome = strip_tags (substr ($ _POST ['nome'], 0,32)); $ Telefone = strip_tags (substr ($ _POS
/ / ------------------------------------------------ -------------------------- RECEBER variáveis ​​locais DE FORM $ Sobrenome = strip_tags (substr ($ _POST [' sT ['telefone'], 0,32)); $ Password_hint = $ _REQUEST ['password_hint']; $ NoError = 1; $ Udidposted = 9; / / ------------------------------------------------ --------------------------- VERIFIQUE SE nome de usuário é o tempo suficiente
nte, então executar uma consulta OBTENDO todos os dados de que
$ Username = strip_tags (substr ($ _POST ['username'], 0,32)); if (trim ($ username)! =='' && strlen (trim ($ username))> = 4) { / / ------------------------------------------------ --------------------------- Se por muito tempo o sufici e o usuário $ Sql ​​= "SELECT * FROM utilizadores WHERE username = '$ username'"; $ Resultado = mysql_query ($ sql); $ Count = mysql_num_rows ($ resultado);
conjunto existente USUÁRIO 104 BANDEIRA if ($ count> 0) { $ Username_already_in_use = 3141; } / / ------------------------------------------------ --------------------------- NOME DE USUÁRIO MAIS
/ / ------------------------------------------------ --------------------------- IF $ sql OBTIDO TEM ROW COUNT> 1 então o usuário JÁ EXISTE ---------- ----- -É MUITO CURTO!! -------------- ----------------------------------------- SET USER TOO SHORT 104 BANDEIRA } Else { $ USERNAME_TOO_SHORT = 3142;} / / ------------------------------------------------ --------------------------- EMAIL FORMATO DE VERIFICAÇÃO $ Email_raw = $ _REQUEST ['email'];
------------------------------------------ SET-mail inválido 104 BANDEIRA $ Bad_email = 3143; } / / E-mail exclusivo? $ S
if (eregi ("^ [_a-z0-9-] + (\. [_a-z0-9-] +) * @ ([a-z0-9-] {2,3}) + (\. [ a-z0-9-] +) * (\. [az] {2,3}) $ ", $ email_raw)) { $ Email = $ email_raw; } Else { / / ------------------------------------------------ --------------------------- EMAIL Se inválido ENTÃO ------------------- ------- -ql ​​= "SELECT * FROM utilizadores WHERE email = '$ email'"; $ Resultado = mysql_query ($ sql); $ Count = mysql_num_rows ($ resultado); if ($ count> 0) { / / ------------------------------------------------ --------------------------- Se o SQL para o email retorna uma linha ENTÃO --------------- --------------------------------- SET EMAIL 104 BANDEIRA $ Email_already_in_use = 3144; }
------ SET PW 104 BANDEIRA $ Pw_i
/ / Verifica senha formato seguro $ Pw_clean = strip_tags (substr ($ _POST ['password'], 0,32)); if (preg_match ("/ ^. * (? =. {4,}) (? =. * [0-9]) (? =. * [az]) (? =. * [AZ]). * $ / ", $ pw_clean, $ matches)) { } Else { / / ------------------------------------------------ --------------------------- SE PW não em formato ENTÃO ----------------- ----------------------------------------- -nsecure = 3145; } / / ------------------------------------------------ --------------------------- Se sinalizadores error são definidos então log HEADERS --------------- ------------- if ($ username_already_in_use == 3141 OR $ email_already_in_use == 3144 OR $ pw_insecure == 3145 OR $ bad_email == 3143 OR $ USERNAME_TOO_SHORT == 3142) { header (
-------------------------------------- ------------------- INSERT INTO SQL / / Criptografar senha $ Encrypted_pw = md5 ($ pw_clean); $ Query = "INSERT INTO` usuários `(` username `, `Password`, `Sobrenome`, ``
"location:user_add_errors.php?pw_insecure=$pw_insecure&email_already_in_use=$email_already_in_use&username_already_in_use=$username_already_in_use&bad_email=$bad_email&username_too_short=$username_too_short"); die (); } else {header ("location: user_add_errors.php noError = $ noError");} Erro / / Fim Checks________________________ / / --------- -Primeiro nome, `Email`, `Telefone`, `Password_hint`, `` UDID, `` UserCreated) VALORES ( '$ Username', '$ Encrypted_pw', '$ Sobrenome', '$ Nome', '$ Email', '$ Telefone', '$ Password_hint', '$ Udidposted', now ()) "; / / Salva as informações para o banco de dados $ resultados = mysql_query ($ query); / / Mostra os resultados if ($ resultado) { if ($ USERNAME_TOO_SHORT == 3142) {echo "ShortUser =" $ USERNAME_TOO_SHORT;.} if ($ username_already_in_use == 3141) {. echo "UserTaken =" $ username_already_in_use;}
--------------- $ Sql ​​= "SELECT * FROM users"; $ Resultado = mysql_query ($ sql);
if ($ email_already_in_use == 3144) {. echo "EmailTaken =" $ email_already_in_use;} if ($ pw_insecure == 3145) {echo "ShortPass =" $ pw_insecure;.} if ($ bad_email == 3143) {echo "BadEmail" $ bad_email;.} / / Echo ("<font size='2' face='Verdana, Arial, Helvetica, sans-serif'> Suas alterações foram feitas com sucesso. <br> <a Href='login.php'> Voltar fazer o login </ a> </ font> "); } outro { die (". informações sobre economia problema no banco de dados:" mysql_error ()); } / / ---------------------- -$ Count = mysql_num_rows ($ resultado); if ($ contagem == 1) { $ Query = "UPDATE` usuários `SET` permissões `= '5 'WHERE` email `=' $ email '"; / / --------------------------------------- Salvar as informações para o banco de dados $ resultados = mysql_query ($ query); / / --------------------------------------- Apenas imprimir CODE if ($ resultado) {Echo ("ADMINCREATED"); } outro { die ("ERRORSAVINGADMIN" mysql_error ().); } }
>

Não vamos rever tudo o que esses arquivos fazem, mas nós fizemos-los disponíveis para download . Basicamente, checklogin consulta o banco de dados para o usuário e senha apresentado; user_add_save.php verifica o usuário e senha submetida a registro, bem como o e-mail, em seguida, retorna um resultado de acordo. 
Você deve configurar seu banco de dados, usuário e senha de acordo no arquivo login_config.php. Outro arquivo php importante é user_add_errors.php, que cuida de erros durante o registro, como um nome de usuário que é muito curto, uma senha que é muito simples, um e-mail inválido, ou um usuário que já existe.
Autor: 

Sobre 

Meu nome é Marcio Valenzuela e eu sou de Honduras. Tenho vindo a codificação em iOS por 5 anos e eu já trabalhei em aplicações web em ASP e PHP / MySQL. Eu tenho alguns aplicativos se na app store e estou trabalhando atualmente em um par de jogos Cocos2d ...

0 comentários Goocle+ 0 Facebook

Postar um comentário

 
Tudo Sobre Tecnologia © 2013-2020. Todos os direitos reservados. Tudo Sobre Tecnologia. Desenvolvido por TST
Topo