【问题标题】:How to solve this error 'BIO_new' is deprecated in cocoa?如何解决此错误“BIO_new”在可可中已弃用?
【发布时间】:2013-05-09 12:02:07
【问题描述】:

我是 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;
}

请帮助我。

【问题讨论】:

  • 这是 Mac,不是 MAC。后者根据上下文意味着强制访问控制或媒体访问控制。
  • Apple 弃用 OpenSSL 以支持其 CoreCrypto(我相信它是 CoreCrypto)。苹果开发者留言板上有一个关于它的帖子。我认为讨论在 2012 年左右的 WWDC 开发者大会上落空了。该讨论当时未公开 - 它隐藏在 NDA 之下。

标签: objective-c macos compiler-errors


【解决方案1】:

Apple 弃用的是使用他们的 OpenSSL 标头和他们的 OpenSSL 动态库。原因是 OpenSSL 的接口即使在较小的修订版本中也会以不兼容的方式发生变化,因此很难在不破坏客户端代码的情况下保持最新的错误修复和安全更新。

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

【讨论】:

  • 感谢格雷厄姆·李。我正在使用 OSX 10.8.3。
  • 当然,如果您自己发布 OpenSSL,如果其中一个漏洞影响到您,您将需要发布应用程序更新。
  • @alastair 是的,如果您自己发布 OpenSSL,则可以利用 Apple 未为您提供的更新 :)
【解决方案2】:

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

同样值得注意的是,base64 有很多变体(the Wikipedia article 列出不少于 13 个),这可能会让您对使用其他人的实现保持警惕,除非他们正确记录了他们的行为(IMO 包括 OpenSSL 和 SecTransform未能在他们的文档中完全说明他们的行为)。

【讨论】:

    【解决方案3】:

    如何解决这个错误'BIO_new' is deprecated in cocoa?

    使用位于/usr/include/usr/lib 的Apple 版本的OpenSSL 解决了这个问题。它是一个旧版本 - 0.9.8 - 所以它缺少许多功能。它的损失不会被错过。

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

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

    $ 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。一切都按预期进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      相关资源
      最近更新 更多