转自:http://mobile.51cto.com/iphone-278138.htm
iPhone应用程序 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
编译 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
如果最后输出下面的内容,说明可以编译支持 https 的 libcurl 了。
- SSL support: enabled (OpenSSL)
接下来
- make
- make install
编译结果输出到 ~/tmp/iphonelib/curl/lib 下的 libcurl.a。
使用
添加到工程中,如图:
如下图所示,将编译好的静态库拖到你的工程中:
另外,由于 openssl 中使用了 zlib,所以还需要在工程中加入链接开关。(该库被包含在iPhone中,不需要重新编译)
如下图所示,在连接中追加 -lz。如图:
最后,如下图添加编译所需的头文件路径。如图:
比如,编译 libcurl 时的头文件的路径 ~/tmp/iphonelib/curl/include 。
代码例子下来,让我们看看在程序中使用 libcurl 的例子。下面的例子在 AppDelegate.m 中实现。
- #import "AppDelegate.h"
- #include <curl/curl.h>
- @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,如下图。
上面介绍的都是在设备上运行的例子,如果要在模拟器上使用,由于处理器结构不一样,需要重新编译 openssl 和 curl 静态库。编译的时候,只要将 SDK 的路径由 iPhoneOS.platform ⇒ iPhoneSimulator.platform,编译开关 -arch armv6 ⇒ -arch i386 就可以了。只是编译的文件名最好和iphone上用的区别开来,如下所示:
- libcrypto_simulator.a
- libssl_simulator.a
- libcurl_simulator.a
又或者不改变库的名称,而是增加新的编译目标。