如何解决这个错误'BIO_new'在可可中被弃用?

时间:2013-05-09 12:02:08

标签: objective-c macos compiler-errors

我是Macintosh开发的新手。我有NSData + connection.m文件。此文件包含更多已弃用的函数,例如BIO_newBIO_writeBIO_get_mem_data等。这些函数都会遇到已弃用的错误。

- (NSString *)base64Encoding
{
    BIO * mem = BIO_new(BIO_s_mem());
    BIO * b64 = BIO_new(BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    mem = BIO_push(b64, mem);

    BIO_write(mem, [self bytes], [self length]);
    BIO_flush(mem);

    char * base64Pointer;
    long base64Length = BIO_get_mem_data(mem, &base64Pointer);

    NSString * base64String = [NSString stringWithCString:base64Pointer
                                               length:base64Length];

    BIO_free_all(mem);
    return base64String;
}

请帮帮我。

3 个答案:

答案 0 :(得分:4)

Apple不赞成使用他们的 OpenSSL标头和他们的 OpenSSL动态库。原因是OpenSSL的界面即使在较小的版本中也会以不兼容的方式发生变化,因此很难在不破坏客户端代码的情况下及时更新错误修正和安全更新。

可以做什么(以及我过去所做的)是grab OpenSSL yourself,使用该版本的功能并将其与您的应用程序捆绑在一起。

答案 1 :(得分:3)

如果您的应用程序面向Mac OS X 10.7或更高版本,则可以改为使用SecTransform

值得注意的是,base64有很多变体(the Wikipedia article列出不少于13个),这可能会让你警惕使用其他人的实现,除非他们正确记录他们的行为(IMO都是OpenSSL)并且SecTransform无法在其文档中完全指定其行为。)

答案 2 :(得分:0)

  

如何解决此错误' BIO_new'在cocoa中弃用了吗?

您可以使用位于/usr/include/usr/lib的Apple的OpenSSL版本,通过而非解决此问题。它的旧版本 - 0.9.8 - 所以它缺少一些功能。它的损失不会错过。

相反,您应该下载,构建和安装最新版本的OpenSSL。您可以从OpenSSL: Source, Tarballs下载。

配置以下内容(Configure Options上的OpenSSL wiki上有更全面的选项列表。)

$ export KERNEL_BITS=64
$ ./config no-ssl2 enable-ec_nistp_64_gcc_128 --openssldir=/usr/local
$ make all
$ sudo make install

--openssldir=/usr/local表示/usr/local/ssl将成为安装的基本目录。

稍后,在编译和链接时,执行以下操作:

  • 添加/usr/local/ssl/include和标题搜索路径(即-I选项)
  • 添加/usr/local/ssl/lib和库搜索路径(即-L选项)

如果您使用-L,请务必在执行程序时使用DYLD_LIBRARY_PATH。就像Linux上的LD_PRELOAD一样。如果您不使用DYLD_LIBRARY_PATH,那么dyld将加载位于/usr/lib的旧的0.9.8版OpenSSL;而不是位于/usr/local/ssl/lib/的更新的1.0.1版本的OpenSSL。

更好的是,省略-L并指定完整的库路径。

  • /usr/local/ssl/lib/libssl.a
  • /usr/local/ssl/lib/libcrypto.a

这样您就不必担心-LDYLD_LIBRARY_PATH。事情按预期工作。