-1

我正在尝试构建一个调查应用程序,其中调查将在多个 ipad 上脱机,当这些 ipad 在线时,他们会将数据(调查答案)上传到我们的服务器?我真的很挣扎如何将调查发送到多个 ipad,更重要的是如何从不同的 ipad 捕获到一个来源?

我需要帮助来清除我的架构部分,并且我需要一些示例来完成编码部分。你知道类似的事情吗?

你有什么想法?

非常感谢,阿尔达

4

1 回答 1

1

创建一个 Web 服务器来接受和发送调查问题和答案。

我会设想一个像这样的应用程序:

1) 从 iPad 向服务器发出 HTTP POST 请求,要求进行调查

这通常使用 MKNetworkKit 或 AFNetworking 等 iOS 网络库来完成。一般流程是:

  • 创建键值对的 NSDictionary 以形成 HTTP POST 请求
  • 通过带有完成处理程序的块构造提交数据

所以像:

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
        }
    }];
}

需要考虑的要点

上面的大部分代码都是伪代码。您最终的真实代码可能会更深入。

您需要在您的应用程序中构建一些主登录信息,以防止所有人看到已完成的调查。

您应该知道的一些额外信息

这里有一些额外的信息可以帮助你

  • JSONKit 用于从您的 Web 服务器快速解码 JSON 数据
  • MKNetworking 或 AFNetworking 将您的数据提交到您的网络服务器
  • 您需要知道如何编写 Web 服务来处理接受调查答案。我建议学习像 Symfony 2.0 这样的 Web 框架

希望有帮助。

于 2013-05-23T12:59:14.507 回答