我正在尝试构建一个调查应用程序,其中调查将在多个 ipad 上脱机,当这些 ipad 在线时,他们会将数据(调查答案)上传到我们的服务器?我真的很挣扎如何将调查发送到多个 ipad,更重要的是如何从不同的 ipad 捕获到一个来源?
我需要帮助来清除我的架构部分,并且我需要一些示例来完成编码部分。你知道类似的事情吗?
你有什么想法?
非常感谢,阿尔达
创建一个 Web 服务器来接受和发送调查问题和答案。
我会设想一个像这样的应用程序:
1) 从 iPad 向服务器发出 HTTP POST 请求,要求进行调查
这通常使用 MKNetworkKit 或 AFNetworking 等 iOS 网络库来完成。一般流程是:
所以像:
MKNetworkOperation *op = [engine operationWithURLString:@"http://www.mywebserver.com/api/fetchQuestions"
params:nil
httpMethod:@"POST"];
2) 服务器接收请求,抓取数据库中的所有调查问题并将 JSON 编码的问题返回给从 ipad。
我不确定您的 Web 服务器在哪个平台上,但在过去,我使用的是 Symfony 2.0,它是一个 PHP Web 框架。
它提供了非常有用的工具,例如Doctrine(一个对象关系映射器或ORM),让我可以像处理对象一样处理我的 MySQL 数据。
所以我获取数据的一般过程是这样的:
// pseudo php function codes
public function sendSurveyQuestionAction()
{
$repository = $this->getDoctrine()->getRepository('MyAppBundle:Survey');
$query = $repository->createQueryBuilder('query')->getQuery();
$arrObjs = $query->getResult();
$arrObjDatas = NULL;
foreach($arrObjs as $obj)
{
$arrObjDatas[] = $obj->toArray();
}
$response = new Response(json_encode(array('data' => $arrObjDatas)));
$response->headers->set('Content-Type', 'application/json');
$return $response;
}
这将返回 JSON 格式的所有调查,准备好由您的主 iPad 应用程序解析。
3) 从 iPad 上的用户通过 App UI 填写问题并提交。该应用程序将数据保存到磁盘,在将数据发送回服务器之前检查有效的互联网连接。
提交答案与抓取问题非常相似,因此您的 iOS 代码应类似于:
// ------------------------------------------------------------------------------------
// store all question-answers into a dictionary to be submitted as HTTP POST variables
// obviously, you wouldn't create it here, this is just example code, you would likely
// have stored your questions and answers when user presses 'finish' button
// ------------------------------------------------------------------------------------
NSMutableDictionary *paramDictionary = [[NSMutableDictionary alloc] init];
[paramDictionary setObject:@"5" forKey:@"q1"];
[paramDictionary setObject:@"10" forKey:@"q2"];
[paramDictionary setObject:@"15" forKey:@"q3"];
// this helps your web server know how many question-answers to expect, or you could hard code it into your business logic
[paramDictionary setObject:[NSNumber numberWithInteger:3] forKey:@"numberOfQA"];
MKNetworkOperation *op = [engine operationWithURLString:@"http://www.mywebserver.com/api/submitAnswers"
params:paramDictionary
httpMethod:@"POST"];
这将提交您对每个问题的答案。您可能已经注意到我使用了 q1、q2、q3。
这些用于您的 Web 服务器代码,以识别每个问题并从中提取相应的答案。
4)服务器接收完成的答案并将它们提交到数据库
因此,如果您使用的是 Symfony 2.0 PHP 代码,那么类似:
// pseudo php function
public function saveAnswersAction()
{
$numOfQA = $_REQUEST['numberOfQA'];
for($i = 0; $i < $numOfQA; $i++)
{
// ----------------------------------------------------------------------
// looping through all the questions such as q1, q2, q3, q4, q5....
// by appending the counter variable to the question identifier
// ----------------------------------------------------------------------
$currentAnswer = $_REQUEST['q'.$i];
// use Doctrine to create new answer entities, and fill in their data
$answerEntity.answer = $currentAnswer;
$surveyEntity->addAnswerEntity($answerEntity);
// mark survey as complete so we can fetch all 'completed' surveys later
$surveyEntity.complete = true;
}
// tell Doctrine to commit changes to MySQL Database
// return HTTP OK status message
}
5) 现在剩下的就是让您的主 iPad 应用发出 HTTP POST 请求以获取所有调查。
该过程与您的 iOS 代码发出 HTTP POST 请求来自您的 Web 服务器的所有“已完成”调查实体的过程相同。
Web 服务器抓取它们并将它们作为 JSON 编码数据返回。
然后,您的应用会收到已完成的调查,其中包含如下问题的答案:
surveys
{
{
questionNumber: 1,
questionAnswer: "5"
},
{
questionNumber: 2,
questionAnswer: "10"
},
{
questionNumber: 3,
questionAnswer: "15"
}
}
现在您使用 JSONKit 来解析这个 JSON 数据。你应该最终得到一个来自 JSONKit 的 NSDictionary。
然后,您可以执行以下操作:
// pseudo code
-(void)displayCompletedSurveys
{
[MKNetworkOperationEngine doRequest:
...
^completionBlock {
// parse JSON data
NSDictionary *surveyData = [JSONKit dictionaryFromJSONData:data)
NSEnumerator *enumerator = [surveyData enumerator];
NSDictionary *currentQuestion = nil;
while([enumerator nextObject] != nil)
{
// do something with each of your question-answer e.g. show it on screen
}
}];
}
上面的大部分代码都是伪代码。您最终的真实代码可能会更深入。
您需要在您的应用程序中构建一些主登录信息,以防止所有人看到已完成的调查。
这里有一些额外的信息可以帮助你
希望有帮助。