ios - 将数据从 iOS 应用程序发送到 HTML5 网站

标签 ios objective-c html post google-sheets

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

最佳答案

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

我假设当您 POST 时(当您提供服务器数据时,为了简化事情,它被称为什么)您想要返回一些东西(即一些 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。你应该看到“发布”;将 URL 中的“post”替换为“get”并刷新。退出“日志输出”,然后再次按 CTRL+Enter。您应该会看到“正在获取”。

快到了;现在,函数 doPost(首先取消注释上面 doGet 函数中的所有内容,除了 '//If don't do anything, get as JSON')并将你的 URL 改回?从?得到。您非常不清楚要添加到工作表中的内容,因此我假设您想要添加包含 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;
}

swift :

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
}

关于ios - 将数据从 iOS 应用程序发送到 HTML5 网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27871817/

相关文章:

objective-c - 在 Objective C 惰性实例化中,我们为什么不接触 setter?

ios - 在 iPad Pro 中没有调用 shouldStartLoadwithRequest

javascript - 使用 XMLHttpRequest.responseText 解析 XML 文件不会显示在 div 上

ios - 添加 xib tableview 单元格的 subview (swift)

iphone - 使用 UIAutomation 和其他工具(例如分配)

ios - CollectionView 中的自定义单元格重新排序行为

ios - 从 NSTimer 调用静态方法。可能吗?

objective-c - MKMapView RegionDidChangeAnimated 由用户操作或程序调用

javascript - 单击表列时不调用单击函数

javascript - 如何在 jQuery 中使用一个元素的属性值来定位另一个具有相同属性值的元素?