创建您自己的iOS应用程序的Web服务,第一部分
在我以前的TechRepublic的系列中,我们使用了现有的Web服务来创建iOS应用程序(“创建一个Web服务,零件 一个和 二 “)。在这个系列中,我们将创建Web服务后端iGlobe为不同的应用程序,这是一个游戏,我前一阵子。
基本上,我们希望用户能够标记一个地方或一个人,并获得该动作点。 (与多数点在比赛结束的竞争对手赢得了钱罐)为了做到这一点,应用程序进行交互,我们将创建一个Web服务。 我们的Web服务将需要能够:
- 存储每个玩家的用户名信息
- 接收用户的点
- 目前用户的点
在本教程中,我们将使用一个辅助类称为SantiappsHelper,其中包含的代码来运行这些连接到Web。 在这种情况下,通常被称为一个独立的类图书馆,需要照顾这些进程。 如果您只需要这样一个类(在我们的例子一样)的一个实例,您创建一个Singleton模式。 你只想要一个实例的连接,因为你不希望很多的连接类的实例创建,接收,并断开 – 这可能最终在多个连接到相同的资源在不同的时间,这可能混淆你或服务器。
这里是什么,我们将在本系列:
1。 创建Web数据库
2。 创建Web服务的后端
3。 创建iOS的前端(故事板)
4。 获取数据
- 了。 NSURLConnection的
- 二。 GCD和完成块
5。 添加 凹凸 API
6。 扔在社会
步骤1:创建Web数据库
Web服务通常都是大型的信息数据库,我们的数据库将需要一个表来存储我们上面提到的所有信息。 我们与数据库中的四个主要方法:创建,读取,更新,删除( CRUD )数据。 所以,让,简短迂回,谈谈数据库 – 特别是,它们的结构,以及我们如何与他们进行互动。
数据库
数据库是信息存储,它可以写成文件(如Word或PowerPoint)。 这些文件中的信息具有预定的结构,Word和PowerPoint知道如何读取和访问,以目前你想要什么,让您编辑它,再存放起来,问题是只有Word将阅读的docx文件,唯一的PowerPoint会读pptx文件。 数据库的巨大优势,他们将信息存储在一个非常紧凑的方式和许多不同的接口可以读取。 简单的数据库,多个接口可以读取它。
大多数网络托管服务通常是免费提供的,我们将使用一个数据库。 我的网站托管服务有phpMySQL,都包含免费包。 如果你想其他如MSSQL数据库,你需要一个有偿服务。 图A是我的数据库管理界面看起来像。
图A
我们有一个名为iglobe localhost上有两个表:用户和标签的数据库。 用户表( 图B)包含主键与一个用户名,一个密码,密码提示,第一个和最后一个名称,以及电子邮件,电话号码,地址,且该等定期的东西。
图B
标签表( 图C)也有自己的主键(TAGID),相应的用户名,一个标识符,标签的经度和纬度,创建日期,它的价值,用户多少分。 还有一个国家的领域,这是实施后,随着项目的进展(它已经在2011年以来的作品)。
图C
第2步:创建Web服务后端
我们的Web服务的想法是从这些表中读取和写入他们的任何数据用户请求或交他们。 这部分需要你知道的一些 PHP 。 让我们开始寻找什么样的代码来读取一个表看起来像。
<?php include_once("JSON.php"); $json = new Services_JSON(); $link = mysql_pconnect("localhost", "user", "pass") or die("Could not connect"); mysql_select_db("iglobe") or die("Could not select database"); $arr = array(); $rs = mysql_query("SELECT * FROM users"); while($obj = mysql_fetch_object($rs)) { $arr[] = $obj; } Echo $json->encode($arr); ?>
首先,我们包括json.php的文件,以访问您的服务器上的JSON文件(请确保您的网络服务器或主机,为您提供至少PHP 5.2)。 然后,我们做一个连接到数据库,使用数据库的用户名和密码,以及数据库主机。 现在,我们创建一个数组对象,所以一旦我们执行的mysql_query从用户表中的所有条目被收集到$ RS,我们可以把该对象到我们到达[]对象。 最后,我们到$ json的编码$ ARR和回声它搬上了银幕。
一旦这个代码,并准备连同你的数据库(包括一些记录),您的浏览器可以直接到该文件(我把它叫做myserver.com / getusers.php的)。 我得到了以下的结果:
[{"id":"35","username":"zlitsami ","password":"932d1c42a4e4880e57037994fd3584b1","password_hint":"","lastname":"","firstname":"","email":"joe@iglobe.com","phone":"","address1":"","address2":"","city":"","state":"","zip":"","country":"","url":"","permissions":"1","udid":"9","userCreated":"2013-01-01 14:27:22","time_queued":null,"time_sent":null}, {another}, {another}]
这是一个有很多元素的数组。 每个元素是用户的表项。 每个条目是一个键值对的字典。 眼熟吗?
现在我们知道了如何从我们的数据库中读取信息,让创建的代码写入到数据库。
<?php $con = mysql_connect("localhost","user","pass"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("iglobe", $con); $sql="INSERT INTO tags (username, latitude, longitude, country,destintyudid,points) VALUES ('$_POST[sender]','$_POST[latitude]','$_POST[longitude]','$_POST[country]','$_POST[receiver]','$_POST[points]')"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } echo "1 record added to tags"; mysql_close($con) ?>
我们再次连接到我们的数据库,我们创建了一个SQL语句插入值(这些值来自于一种形式,是在网上或移动设备上的)。 我们执行该SQL语句与我们联系,并验证用户呼应的结果。 我打电话给此文件writephp.php的。
之前,我们移动到iOS上,让的网上测试我们的服务。 创建一个HTML文件称为Writeform.html,这段代码保存:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <form action="writephp.php" method="post"> <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2"> <tbody> <tr> <td>Name:</td> <td><input name="sender" type="text"></td> <td></td> </tr> <tr> <td>UDID(unnecessary):</td> <td><input name="udid" type="text"></td> <td></td> </tr> <tr> <td>Latitude:</td> <td><input name="latitude" type="text"></td> <td></td> </tr> <tr> <td>Longitude:</td> <td><input name="longitude" type="text"></td> <td></td> </tr> <tr> <td>Country</td> <td><input name="country" type="text"></td> <td></td> </tr> <tr> <td>Receiver</td> <td><input name="receiver" type="text"></td> <td></td> </tr> <tr> <td></td> <td></td> <td><input type="submit"></td> </tr> </tbody> </table> <br> </form> </body> </html>
现在,您的网页浏览器上加载的形式和提交数据到你的数据库。
我不想让此Web服务太复杂了,因为我想保持你的注意力在iOS端,让我们创建一个表单,最终从我们的服务针对特定用户读取点。 创建另一个HTML文件称为Testform.html,这段代码保存:
<HTML> <head> <form action="readpoints.php" method="post"> User: <input type="text" name="userNa"/> <input type="submit" /> </form> </head> </HTML> 并创建PHP对口:
<?php include_once("JSON.php"); $json = new Services_JSON(); $link = mysql_pconnect("localhost", "user", "pass") or die("Could not connect"); mysql_select_db("iglobe") or die("Could not select database"); $username = $_POST["userNa"]; $result = mysql_query("SELECT username, SUM(points) AS PUNTOS FROM tags WHERE username='$username' GROUP BY username"); // THIS RETURNS ARRAY NOT READ PROPERLY BY iOS JSON $resultado = array(); while($obj = mysql_fetch_object($result)) { $resultado[] = $obj; } Echo $json->encode($resultado); ?>
一旦我们得到更多的数据到数据库中,我们将使用此代码后的最后一位。
到目前为止,我们有一个资源,返回一个特定的用户,readpoints.php点,这是什么所谓的Web服务端点。 可以有很多的Web服务端点。 我们可能要在游戏或应用程序,一旦得到了很多用户的点,以填补一个领导委员会,例如。 从发票数据库,而不是一个接一个,我们可能想获取很多交易。 因此,让我们自己和创建端点管理一组输入数据。 在我们的例子中,我们必须能够通过Web服务的一组用户。 我们的文件看起来像这样:
<?php include_once("JSON.php"); $json = new Services_JSON(); //1. PROCESS RECEIVED ARRAY $handle = fopen("php://input", "rb"); $http_raw_post_data = ''; while (!feof($handle)) { $http_raw_post_data .= fread($handle, 8192); } fclose($handle); //1.1 Just decode to see what kind of object it is $post_data = json_decode($http_raw_post_data,true); if (is_array($post_data)) $response = array("status" => "ok", "code" => 0, "original request" => $post_data); else $response = array("status" => "error", "code" => -1, "original_request" => $post_data); //2. CALL DB QUERY $link = mysql_pconnect("localhost", "username", "password") or die("Could not connect"); mysql_select_db("iglobe") or die("Could not select database"); //3. CREATE FINAL ARRAY TO RETURN $arrayToReturn = array(); //4. CYCLE THROUGH USERS foreach ($post_data as $value) { //CREATE QUERY $result = mysql_query("SELECT username, SUM(points) AS PUNTOS FROM tags WHERE username='$value' GROUP BY username"); //EXECUTE QUERY & ADD EACH USER/POINTS DICTIONARY TO $resultado ARRAY $resultado = array(); while($obj = mysql_fetch_object($result)){ $arrayToReturn[] = $obj; } } Echo $json->encode($arrayToReturn); ?>
这个基本的PHP代码,需要传递的,正如我们前面提到的数组,遍历数据库,为每个用户获得积分。 这是很重要的,因为我们的应用程序保存到Web服务器的数据库中有很多车次。
步骤3:创建的的iOS前端(故事板)
现在,我们要对我们的iOS故事板或前端工作。 然后,我们将硬编码数据,并获取从实际的后端网络,这样,我们就可以看到我们的前端将需要在数据模型,然后我们就可以获取网络数据并更换我们的数据,这些数据模型。 我们也将学习两种方式获取数据:直列,凌乱的代码和整洁的编码。
遵循以下步骤:
- 创建一个新的空项目使用故事板,ARC,iPhone,没有核心数据。
- 进入到情节提要,并拖动到网格的UITableViewController。
- 创建一个类UsersListViewController。 故事情节,选择现场,在Identity督察使我们的场景UsersListViewController类型从下拉列表中。
- 运行一个快速的测试,以确保我们的TVC工作。
- 构建与运行。 你应该得到一个空的tableview。
让我们回顾一下在本节中,我们将做什么:
- 一个数组属性添加到您的m文件
- 充液阵列在viewDidLoad
- 消除讨厌的警告线
- 让tableview的一节返回
- 让tableview的返回数组数
- 让tableview的细胞返回数组对象
这应该是现在你的第二天性,所以我会杀出通过具体。
这里的物业代码:
@property (nonatomic, strong) NSArray *testArray; Here's the viewDidLoad code: - (void)viewDidLoad { [super viewDidLoad]; self.testArray = [[NSArray alloc] initWithObjects:@"me", @"you", @"them", nil]; NSLog(@"array %d", [self.testArray count]); } 这里是返回数组数代码:
return [self.testArray count]; 这里是代码cFRAIP:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; // Configure the cell... cell.textLabel.text = [self.testArray objectAtIndex:indexPath.row]; return cell; }
在构建与运行,选择在故事板的UITableViewCell,在“属性”检查,确保你使用电池作为重用标识符。 你的应用程序应该正常工作。
如果构建与运行,用户应显示在tableview的。 爽! 这就是我们要想做的事 – 即,显示一个用户列表在tableview的,然后加点,像一个得分表。
图D是一个模型,我们的应用程序将是什么样子。 在本质上,我们将有一个标签栏控制器管理三个视图:用户,地图和说明。 我们还将抛出一个登录视图中的应用程序启动。 这应该给你一个什么样的任务,我们需要执行,为了做到这一点的想法。
a)现在登录视图控制器
b)除用户和传递信息
C)从Web服务获取用户数据
图四)地图上的点
E)显示在一个视图中的说明
图D
你应该能够重新创建在你的故事板。 这里的基本步骤是:
1。 选择您现有UsersViewController现场,从“编辑”菜单,选择“嵌入在标签栏控制器。 你应该有一个的场景和一类UsersViewController,和身份督察,现场应设置为它的类的类型。
2。 清除时添加嵌入式的tableview的现场在一个标签栏(出清晰,我的意思是确保它没有任何标签或其他控制)的第二个场景。 现在拖动一个UIMapView到。 添加一个UINavigationBar的顶部和两个按钮(情节和凹凸)对任何一方的。 创建它一个MapViewController类,将其类型设置。 添加的MKMapView IBOutlet属性和两个的UIBarButtonItem IBOutlet属性,并把它们连接起来。 添加MKMapViewDelegate。
3。 对于最后一个视图添加另一个UIViewController的,并把它拖动一个UIWebView和UINavigationBar。 创建它的类文件和它命名为InstructionsVC。 添加一个UIWebView的IBOutlet物业,并将其连接。 添加UIWebViewDelegate,不要忘记设置的场景类型。
4。 添加一个UIViewController,ModalViewController( 图E矿山看起来像什么),并创建IBOutlet属性-这是四个标签,静态文本(用户,垭口,电子邮件,和通行证需要…)。 有三个UITextFields带有占位符文本,以指导用户。 有三种不同的操作UIButtons。 人图标是一个按钮设置图像与背景图像,这将是“按钮,用户将使用到Web服务器上传自己的形象。
现在我们可以创建其他类文件的TagListController,标签/用户模式,以及注释/ PlacemarkVC。
图E
一两分钟的可视化应用程序的布局将类似于现在我们有一个更好的主意在哪里,我们要去,然后比较最初的草图,你让你的应用程序的可视化。
在第二部分,我们将连接到Web服务,并获取实际数据。《创建您自己的iOS应用程序的Web服务,第二部分》