YIFEIYANG 易飞扬的博客

17五/102

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

  • 博主:易飞扬
  • 原文链接 : http://www.yifeiyang.net/iphone-web-development-skills-of-the-article-5-https-server-using-libcurl-to-connect/
  • 转载请保留上面文字。




  • 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。

    使用

    添加到工程中

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


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

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


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


    比如,编译 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

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

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

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

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

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

    相关文章

    评论 (2) 引用 (0)
    1. 为什么我编译的时候会出现下面的错误?而且编译出来的libcurl.a只有444k,还有哪里需要注意的,我的qq是634038132,方便的话请指教,这个问题把我愁死了……
      make[6]: *** [install-pkgincludeHEADERS] Error 64
      make[5]: *** [install-am] Error 2
      make[4]: *** [install-recursive] Error 1
      make[3]: *** [install-data-hook] Error 2
      make[2]: *** [install-data-am] Error 2
      make[1]: *** [install-am] Error 2
      make: *** [install-recursive] Error 1

    2. 使用这样的库是否能通过审核?


    发表评论


    还没有引用.