http://www.cocoachina.com/iphonedev/sdk/2010/1112/2339.html
让 iPhone App 以 https 方式连接网络
时间: 2010-11-12 17:20
问题 你是否也想让自己的 iPhone 应用程序连接 https 服务器呢?下面我就介绍一下其使用方法。 通常使用 Objective-C 的 NSURLConnection 连接有证明书的 https 服务器时会出现验证错误,我们可
问题
你是否也想让自己的 iPhone 应用程序连接 https 服务器呢?下面我就介绍一下其使用方法。
通常使用 Objective-C 的 NSURLConnection 连接有证明书的 https 服务器时会出现验证错误,我们可以使用私有API — setAllowsAnyHTTPSCertificate:forHost 来解决这个问题。如果是 Cocoa 的应用程序应该是没有什么问题,但是用在 iPhone 上,很可能过不了 App Store 的审查。
所以这里我们使用 libcurl 来完成在 iphone 上连接 https 服务器。
准备
编译 openssl
连接 https 的前提是要有 OpenSSL。你可以参考 这里 来为 iPhone 编译 OpenSSL 静态库。最终得到下面两个静态库文件。
libcrypto.a
libssl.a
libssl.a
编译 libcurl
接下来我们下载/编译 libcurl。下载展开后,按照下面配置(根据实际情况更改你的SDK目录,版本)。
./configure --prefix=$HOME/tmp/iphonelib/curl \
--host=arm-apple-darwin --disable-shared --with-random=/dev/urandom \
CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \
CFLAGS="-arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -I$HOME/tmp/iphonelib/openssl/include -L$HOME/tmp/iphonelib/openssl/lib" \
CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp \
AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar
--host=arm-apple-darwin --disable-shared --with-random=/dev/urandom \
CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \
CFLAGS="-arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -I$HOME/tmp/iphonelib/openssl/include -L$HOME/tmp/iphonelib/openssl/lib" \
CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp \
AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar
如果最后输出下面的内容,说明可以编译支持 https 的 libcurl 了。
SSL support: enabled (OpenSSL)
接下来
make
make install
make install
编译结果输出到 ~/tmp/iphonelib/curl/lib 下的 libcurl.a。
使用
添加到工程中
如下图所示,将编译好的静态库拖到你的工程中:
另外,由于 openssl 中使用了 zlib,所以还需要在工程中加入链接开关。(该库被包含在iPhone中,不需要重新编译)
如下图所示,在连接中追加 -lz。
最后,如下图添加编译所需的头文件路径。
比如,编译 libcurl 时的头文件的路径 ~/tmp/iphonelib/curl/include 。
代码例子
下来,让我们看看在程序中使用 libcurl 的例子。下面的例子在 AppDelegate.m 中实现。
#import "AppDelegate.h"
#include
@implementation AppDelegate
-(void)applicationDidFinishLaunching:(UIApplication *)application {
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch
[window makeKeyAndVisible];
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://twitter.com/");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
res = curl_easy_perform(curl);
if (0 != res) {
fprintf(stderr, "curl error: %d\n", res);
}
curl_easy_cleanup(curl);
}
}
-(void)dealloc {
[window release];
[super dealloc];
}
@end
#include
@implementation AppDelegate
-(void)applicationDidFinishLaunching:(UIApplication *)application {
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch
[window makeKeyAndVisible];
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://twitter.com/");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
res = curl_easy_perform(curl);
if (0 != res) {
fprintf(stderr, "curl error: %d\n", res);
}
curl_easy_cleanup(curl);
}
}
-(void)dealloc {
[window release];
[super dealloc];
}
@end
编译运行,可以用调试工具得到取得的html,如下图。
在模拟器中使用 libcurl
上面介绍的都是在设备上运行的例子,如果要在模拟器上使用,由于处理器结构不一样,需要重新编译 openssl 和 curl 静态库。编译的时候,只要将 SDK 的路径由 iPhoneOS.platform ⇒ iPhoneSimulator.platform,编译开关 -arch armv6 ⇒ -arch i386 就可以了。只是编译的文件名最好和iphone上用的区别开来,如下所示:
libcrypto_simulator.a
libssl_simulator.a
libcurl_simulator.a
libssl_simulator.a
libcurl_simulator.a
又或者不改变库的名称,而是增加新的编译目标。
沒有留言:
張貼留言