IPhone SDK使用服务器发送/接收数据

时间:2009-09-19 08:59:05

标签: iphone objective-c iphone-sdk-3.0

我正在构建一个IPhone应用程序(第一个),它需要将数据发送到服务器并从服务器响应数据。作为一个.net开发人员,我创建了一个带有2个调用(GetData和SendData)的Web服务,其中1个参数在XML数据中发送。这些将发送和接听电话,其中包括媒体内容,例如一张照片。

我还有哪些其他选项可以向服务器发送数据(媒体)以及从服务器发送数据(媒体)有哪些优缺点?

3 个答案:

答案 0 :(得分:6)

如果您想最小化编码,可以通过以下方法调用从服务器获得快速HTTP回复:

NSURL* url = [NSURL URLWithString:@"http://mysite.com/my_page.html"];
NSStringEncoding encoding;
NSError* error = nil;
NSString* pageData = [NSString stringWithContentsOfURL:url
                                          usedEncoding:&encoding error:&error];
// Now pageData is a string with the html from that URL, or error will indicate
// any network error that occurred.

NSData有一个名为dataWithContentsOfURL:options:error:的类似方法,它可以处理从服务器获取二进制数据。这两种方法都是同步的,这意味着您的代码在等待服务器响应时会被阻止 - 至少在超时发生之前或检测到错误之前。

对于异步网络通信,您可以使用NSURLConnection中的其他方法,这些方法也适用于伴随类NSURLRequestNSURLResponseNSURL。了解这一点的最快方法是浏览the NSURLConnection docs。这是使用这些类的some example code of how to write an asynchronous HTTP get

我假设您主要考虑了HTTP传输,上面的类可以处理这些传输 大多数交互,包括不同的HTTP请求类型(例如post vs get),不同的编码类型或二进制数据,允许您的应用程序在到达时处理每个数据包,挂钩到http级重定向,设置自定义超时等等。

还有更多的通信方式,例如使用Bonjour,这有助于无服务器设置(例如两个iPhone共享一个Wi-Fi连接);或者Game Kit,它可以处理点对点蓝牙连接,并且支持游戏内语音通信。

答案 1 :(得分:4)

一种选择是使用Hessian。 Hessian是一种用于Web服务的语言不可知协议,以及用于发送消息调用和响应的二进制序列化。 Hessian的一些优点:

  • Hessian更适合传输二进制数据块,因为不需要文本编码。
  • 二进制序列化协议比任何XML,JSON或其他文本格式都严格得多,这意味着解析起来更容易,更快捷。
  • 服务器和客户端都有可用的框架,可以将传输方法抽象为分布式对象。允许您专注于您的应用程序,而不是协议详细信息。

您可以使用HessianC#在.NET中实现服务器。 Hessian基于接口,因此您可以在C#中定义此接口:

public interface HelloService {
  string GetGreeting();
}

然后你只需执行:

public class HelloHandler : CHessianHandler, HelloService {
  public string GetGreeting() {
    return "Hello World";
  }
}

在iPhone端,您可以使用HessianKit设置客户端。这分两步完成,首先必须将C#interace转换为Objective-C协议:

@protocol HelloService
-(NSString*)GetGreeting;
@end

然后,您需要从此接口/协议获取Web服务的代理:

id<HelloService> proxy = [CWHessianConnection proxyWithURL:url
                                                  protocol:@protocol(HelloService)];
NSLog([proxy GetGreeting]);

答案 2 :(得分:1)

.Net拥有出色的SOAP支持。但是在iPhone上使用SOAP是一件非常糟糕的事情,它并没有得到很好的支持,即使它对于可能非常轻量级的调用来说也是一个非常繁重的协议。

了解.Net可用的REST库类型 - 它们更容易使用并且带宽更低。还有用于iPhone的REST包装器。

在为移动通信开发任何服务器时,如果可能的话,应该避免使用SOAP。