Лучший способ сохранить рейтинг пользователя - приложение для iPhone - PullRequest
1 голос
/ 05 июля 2011

Я создаю простую игру (приложение для iPhone) и хочу, чтобы пользователи имели рейтинг, основанный на баллах.Каков наилучший способ сохранить все баллы пользователей, а затем присвоить рейтинг пользователю при первом запуске приложения?У меня есть сервер (веб-сайт), поэтому я могу использовать SQL при необходимости.Есть идеи?

Ответы [ 3 ]

3 голосов
/ 05 июля 2011

Я предлагаю вам взглянуть на Apple Game Center. Он содержит (почти) готовые списки лидеров.

1 голос
/ 05 июля 2011

Вы можете использовать NSMutableURLRequest для доступа к странице php, которая считывает рейтинг (ы) из базы данных mySQL.Имейте выход php xml и анализируйте результат.Следующий код отправляет запрос на страницу php, а затем анализирует xml, возвращаемый этой страницей.(Вы также можете публиковать данные на другой php-странице для обновления записей в БД и т. Д.).

//IN THE .h class (of a viewController)
... : UIViewController {

  //I use a label to display the data
  IBOutlet UILabel *label1;
  //Create global variable
  NSString *tempString;
  //Dataset for response from HTTP Request
  NSMutableData *receivedData;
  NSXMLParser *xmlParser;

}

-(void) initiateAPIConnection;

@property (nonatomic, retain) NSString *tempString;

@property (nonatomic, retain) UILabel *label1;

@end
//IN THE .h class


//IN THE .m class
//...
@synthesize label1, tempString;
//...

-(void)initiateAPIConnection{

  NSString *post = [NSString stringWithFormat:@"user=Chris"];
  NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
  NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

  NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
  [request setURL:[NSURL URLWithString:@"http://www.yourDomain.com/yourPhpPage.php"]];
  [request setHTTPMethod:@"POST"];
  [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
  [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
  [request setTimeoutInterval:10.0]; //fail after 10 seconds with no response
  [request setHTTPBody:postData];

  NSURLConnection *conn=[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
  if (conn){
    NSLog(@"In if conn");
    receivedData = [[NSMutableData data] retain];
    NSLog(@"End of if conn");
  }
  else{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Conn error" message:@"No Server" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil];
    [alert show];
    [alert release];
  }

}//initiateAPIConnection

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
  UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Connection error" message:[error localizedDescription] delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil];
  [alert show];
  [alert release];
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
  NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response;
  NSLog(@"%i",[urlResponse statusCode]);
  [receivedData setLength:0];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
  [receivedData appendData:data];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
  xmlParser = [[NSXMLParser alloc]initWithData:receivedData];
  [xmlParser setDelegate:self];

  //you may want to enable these features of NSXMLParser.
  [xmlParser setShouldProcessNamespaces:NO];
  [xmlParser setShouldReportNamespacePrefixes:NO];
  [xmlParser setShouldResolveExternalEntities:NO];
  [xmlParser parse];
}


//XMLdeligate methods
-(void)parserDidStartDocument:(NSXMLParser *)parser{
  NSLog(@"Started Parsing");
}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
  NSLog(@"Started Element name: %@", elementName);
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
  NSLog(@"Found characters: %@", string);
  tempString = string;
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
  NSLog(@"Finished Element name: %@", elementName);

  //my outputted xml would have <ranking>...ValueFromDb...</ranking> in it's response
  if([elementName isEqualToString:@"ranking"]){
    //display result in a label (you could save it to a local variable instead)
    label1.text = tempString;
  }

}

-(void)parserDidEndDocument:(NSXMLParser *)parser{
  NSLog(@"Finished Parsing");
}


//...


//Don't forget to dealloc
-(void)dealloc {
  //...
  [label1 release];
  [tempString release];
  [xmlParser release];
  [receivedData release];
  //...
  [super dealloc];
}
//IN THE .m class

Вам придется выработать логику, необходимую для поиска пользователя в базе данных в вопросах, ранжирующих себя,Вы можете передать информацию для входа, добавив (например)? User = USERNAME & pass = PASSWORD в конец файла .php ... т.е. ...

[request setURL:[NSURL URLWithString:@"http://www.yourDomain.com/yourPhpPage.php?user=USERNAME&pass=PASSWORD"]];

USERNAME и PASSWORD будут значениями, считанными из песочницыи т.д. ... вам нужно отформатировать URLWithString (как вы делаете с stringWithFormat)

-Chris Allinson

0 голосов
/ 05 июля 2011

Да, на мой взгляд, это лучший вариант, чтобы использовать функцию ранга на том экране, где вы выбираете или просматриваете информацию о пользователях.

Вы можете использовать другую функцию для этого экрана, где вам нужно выбрать пользователя, отсортированного по количеству баллов, при этом типе программирования вам не нужно выполнять дополнительную работу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...