iPhone开发技巧之网络篇(5)--- 使用libcurl连接https服务器

问题

你是否也想让自己的 iPhone 应用程序连接 https 服务器呢?下面我就介绍一下其使用方法。

通常使用 Objective-C 的 NSURLConnection 连接有证明书的 https 服务器时会出现验证错误,我们可以使用私有API — setAllowsAnyHTTPSCertificate:forHost 来解决这个问题。如果是 Cocoa 的应用程序应该是没有什么问题,但是用在 iPhone 上,很可能过不了 App Store 的审查。

所以这里我们使用 libcurl 来完成在 iphone 上连接 https 服务器。

准备

编译 openssl

连接 https 的前提是要有 OpenSSL。你可以参考 这里 来为 iPhone 编译 OpenSSL 静态库。最终得到下面两个静态库文件。

1
2
libcrypto.a
libssl.a
编译 libcurl

接下来我们下载/编译 libcurl。下载展开后,按照下面配置(根据实际情况更改你的SDK目录,版本)。

1
2
3
4
5
6
./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 了。

1
SSL support:     enabled (OpenSSL)

接下来

1
2
make
make install

编译结果输出到 ~/tmp/iphonelib/curl/lib 下的 libcurl.a。

使用

添加到工程中

如下图所示,将编译好的静态库拖到你的工程中:

 


libcurl iphone https

另外,由于 openssl 中使用了 zlib,所以还需要在工程中加入链接开关。(该库被包含在iPhone中,不需要重新编译)

如下图所示,在连接中追加 -lz。

 


libcurl iphone https

最后,如下图添加编译所需的头文件路径。

 


libcurl iphone https

比如,编译 libcurl 时的头文件的路径 ~/tmp/iphonelib/curl/include 。

代码例子

下来,让我们看看在程序中使用 libcurl 的例子。下面的例子在 AppDelegate.m 中实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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,如下图。

 


libcurl iphone https

在模拟器中使用 libcurl

上面介绍的都是在设备上运行的例子,如果要在模拟器上使用,由于处理器结构不一样,需要重新编译 openssl 和 curl 静态库。

编译的时候,只要将 SDK 的路径由 iPhoneOS.platform ⇒ iPhoneSimulator.platform,编译开关 -arch armv6 ⇒ -arch i386 就可以了。

只是编译的文件名最好和iphone上用的区别开来,如下所示:

1
2
3
libcrypto_simulator.a
libssl_simulator.a
libcurl_simulator.a

又或者不改变库的名称,而是增加新的编译目标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值