【问题标题】:Send data from an iOS app to an HTML5 website将数据从 iOS 应用程序发送到 HTML5 网站
【发布时间】:2015-01-10 01:16:19
【问题描述】:

我希望能够将数据从 iOS 应用程序 (Objective-C) 发送到 HTML5 网站或 Google 电子表格或任何可以从任何地方访问数据的地方。

【问题讨论】:

    标签: ios objective-c html post google-sheets


    【解决方案1】:

    我强烈推荐Google Apps Script,它可以在没有服务器(您使用 Google 的服务器)的情况下轻松完成,而且它是免费。但是,你必须了解 JavaScript(我可以帮助很多,因为我刚刚完成了这个)

    我会假设当你发布(当你给服务器数据时它被称为简化事情时)你想要一些东西回来(即一些JSON),说“成功”或返回更多信息。另外,我现在要预先警告您:这不适用于企业软件 - 因为您想要一个真正的数据库和服务器(即 SQL 或 noSQL),但为了与其他非脚本编写者共享,这为您提供了一个内置的可共享 GUI (图形用户界面)。

    好的,进入代码。转到script.google.com 并选择左侧的“空白项目”。现在 3/4 的代码将处理请求 b/c 向 google 电子表格添加一行实际上是一行(这就是它的强大之处)。

    首先,将这个函数添加到:

    function doGet(e) {
      if (e.parameter.get) {
          Logger.log("GETing")
          //return getAsJSON()
      } else if (e.parameter.post) {
          Logger.log("POSTing")
          //return dopost(e)
      } else {
          //If don't do anything, get as JSON
          Logger.log("GETing")
          //return getAsJSON()
      }
    }
    

    转到运行 -> doGet 并接受弹出窗口以获得权限(现在和结束时执行此操作,或在任何时候执行此操作,它会给出错误“执行该操作需要授权。”)

    现在,转到文件 -> 管理版本 -> 保存新版本 然后发布 -> 部署为 Web 应用程序 -> 将项目版本设为最新编号,并确保它是“执行应用程序为:”我和“谁有权访问该应用程序:”任何人(甚至匿名)。

    打开下方的“当前网络应用 URL:和最新代码”链接。

    第二个链接(最新代码)应该类似于https://script.google.com/macros/s/AKfycbxHk_GXziSAwSH6umVyz3LnnbgpkA9BnqvL2ILeF/dev。在其末尾添加“?post=true”,然后刷新页面。返回文本编辑器页面并按 CTRL+Enter。你应该看到“POSTing”;将 URL 中的“post”替换为“get”并刷新。退出“记录输出”,然后再次按 CTRL+Enter。您应该会看到“GETing”。

    快到了;现在,函数doPost(首先取消注释上面doGet 函数中的所有内容,除了'//如果不做任何事情,获取JSON')并将您的URL 更改回从?get 中的?post。您非常不清楚要添加到工作表中的内容,因此我假设您要附加一行包含 2 个单元格。在 URL 中添加:

    &column1="TESTING"&column2="WOW"
    

    它的作用是告诉我们的代码 (1) 我们要 POST 和 (2) 新行应该是 TESTING, WOW(在不同的单元格中)。制作一个新的 Google 电子表格并复制“d/”和“/edit”之间的内容,将其放入电子表格和 ID 中,然后放入您的电子邮件;如果出现问题,它会向您发送电子邮件,因此请保持打开状态。代码是

    function doPost(e) {
        try {
            Logger.log(e)
            if (!(e.parameter.column1) || !(e.parameter.column2)) {
                MailApp.sendEmail("YOUR EMAIL HERE", "Problem with POST to gSheet", "Not correct parameters need column1 and column2 and both need to be '=something' ")
            } else {
                var allVals = SpreadsheetApp.openById("YOUR SPREADSHEET ID HERE").getActiveSheet().appendRow([e.parameter.column1, e.parameter.column2])
                return getAsJSON()
            }
        } catch (e) {
            MailApp.sendEmail("YOUR EMAIL HERE", "Problem with POST to gSheet", e)
        }
    }
    

    而getASJSON 是

    function getAsJSON(){
        output = ContentService.createTextOutput()
        output.append("DONE")
        return output
    }
    

    返回电子表格的 JSON 是非常可能的,但这超出了本文的范围,也是一个很好的练习。

    注意:它会将您重定向到“googleusercontent”域。如果是这样,请不要使用该 URL 或刷新该 URL:返回 /dev 或 /exec url。


    在 iOS 端,您所要做的就是使用上面构建的 URL 发出 POST 请求,这相当简单。你提到了 Objective-C,但我也会提供 Swift。

    Objective-C:

    - (NSURLResponse *)POST:(NSString *)parameters {
        NSString *baseURL = @"https://script.google.com/macros/s/your_ID/dev?post=true";
        NSURL *url = [NSURL URLWithString: [baseURL stringByAppendingString:parameters]]; // Set your URL here - don't forget to escape quotation marks when you pass the request parameters to the method
    
        NSURLSession *session = [NSURLSession sharedSession];
    
        __block NSURLResponse *postResponse;
        NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            // What to do after the POST has completed (if the POST returns any data, it'll be stored in the response parameter specified above); use dispatch_async to wait until the request has completed
            dispatch_async(dispatch_get_main_queue(), ^(void) {
                postResponse = response;
            });
        }];
    
        [dataTask resume];
        return postResponse;
    }
    

    斯威夫特:

    func POST(parameters: String) -> NSURLResponse? {
      let url: NSURL = NSURL(string:"https://script.google.com/macros/s/your_ID/dev?post=true\(parameters)")! // Set your URL here - don't forget to escape quotation marks when you pass the request parameters to the function
    
      let session: NSURLSession = NSURLSession.sharedSession()      
    
      var postResponse: NSURLResponse?
      let dataTask: NSURLSessionDataTask = session.dataTaskWithURL(url, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in // Closure
        // What to do after the POST has completed (if the POST returns any data, it'll be stored in the response parameter specified above); use dispatch_async to wait until the request has completed
          dispatch_async(dispatch_get_main_queue(), {
              postResponse = response
          })
    
      })
    
      dataTask.resume()
      return postResponse
    }
    

    【讨论】:

    • 是的,对于任何困惑的读者来说,这是共同努力的结果。 AstroCB 和我合作过一个非常相似的项目,我负责后端,他负责应用前端。我们认为我们每个人都可以提供帮助
    • 哇,感谢您的帮助!我不确定这意味着什么,但是当我尝试运行 doGet 时,我收到此错误“TypeError: Cannot read property "parameter" from undefined. (line 2, file "Code")"
    • 还只是为了澄清,在工作表上,我想要一列人名,每个人的名字旁边的单元格中都有一个数字。我希望应用程序能够在应用程序中每次发生特定事件时为某个人的号码加 1。我不确定何时可以测试该应用程序,因为我尚未注册 Apple 开发人员计划,并且该应用程序依赖于无法模拟的设备摄像头的使用。无论如何,再次感谢!
    • 您的网址是否以 ?post=true&parameter1=hello&parameter2=world 结尾
    • 好的,谢谢。在我加入苹果开发者计划之前,我真的无法做更多的事情,因为我想先测试我的应用程序,然后再用它做更多的事情。我正在为我的学校创建这个应用程序,但我不确定他们什么时候会让我加入开发者计划。
    【解决方案2】:
    1. 接受查询的代码服务器。
    2. 查询服务器的 iOS 应用程序代码。也许使用 AFNetworking。
    3. 从任何地方访问数据。

    【讨论】:

      【解决方案3】:

      您可以创建一个用 php 编写的页面,该页面接受您从 ios 应用程序发送的数据,然后 php 将数据发送到服务器。服务器包含一个表,其中包含您要填充的行。

      或者您可以使用为您执行此操作的后端提供商,这里有一个 link 来解释它是如何工作的(来自 raywenderlich)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 2018-01-04
        • 2013-03-13
        • 1970-01-01
        相关资源
        最近更新 更多