【发布时间】:2015-01-10 01:16:19
【问题描述】:
我希望能够将数据从 iOS 应用程序 (Objective-C) 发送到 HTML5 网站或 Google 电子表格或任何可以从任何地方访问数据的地方。
【问题讨论】:
标签: ios objective-c html post google-sheets
我希望能够将数据从 iOS 应用程序 (Objective-C) 发送到 HTML5 网站或 Google 电子表格或任何可以从任何地方访问数据的地方。
【问题讨论】:
标签: ios objective-c html post google-sheets
我强烈推荐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
}
【讨论】:
【讨论】:
您可以创建一个用 php 编写的页面,该页面接受您从 ios 应用程序发送的数据,然后 php 将数据发送到服务器。服务器包含一个表,其中包含您要填充的行。
或者您可以使用为您执行此操作的后端提供商,这里有一个 link 来解释它是如何工作的(来自 raywenderlich)。
【讨论】: