AFNetworking 原作者都无法解决的问题: 如何使用i

一网打尽方案探究

2.四个须求部分重写AFN源码的方法.

  • AFNetworking 原作者都无法解决的问题: 如何使用ip直接访问https网站?。在Info.plist中增进NSAppTransportSecurity类型Dictionary,在NSAppTransportSecurity下拉长NSAllowsArbitraryLoads类型Boolean,值设为YES.这一个自然是用来化解iOS9下,允许HTTP央求访谈网络的,当然成效持续这几个.具体原因感兴趣的活动google.

  • 给 AFU景逸SUVLConnectionOperation 类加多新属性:

/** 可信任的域名,用于支持通过ip访问此域名下的https链接.
 Trusted domain, this domain for support via IP access HTTPS links.
 */
@property(nonatomic, strong) NSMutableArray * trustHostnames;
  • 给 AFUENVISIONLConnectionOperation 完毕的代办方法: - (void)connection:(NSU科雷傲LConnection )connection
    AFNetworking 原作者都无法解决的问题: 如何使用ip直接访问https网站?。willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge
    AFNetworking 原作者都无法解决的问题: 如何使用ip直接访问https网站?。 )challenge 增加增多可信的域名的连带逻辑代码:
- (void)connection:(NSURLConnection *)connection
willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if (self.authenticationChallenge) {
        self.authenticationChallenge(connection, challenge);
        return;
    }

    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;

        /* 添加可信任的域名,以支持:直接使用ip访问特定https服务器.
         Add trusted domain name to support: direct use of IP access specific HTTPS server.*/
        for (NSString * trustHostname  in [self trustHostnames]) {
            serverTrust = AFChangeHostForTrust(serverTrust, trustHostname);
        }

    ....
  • 参考Apple官方文书档案,完成自定义的丰富可靠域名的函数: AFChangeHostForTrust
static inline SecTrustRef AFChangeHostForTrust(SecTrustRef trust, NSString * trustHostname)
{
    if ( ! trustHostname || [trustHostname isEqualToString:@""]) {
        return trust;
    }

    CFMutableArrayRef newTrustPolicies = CFArrayCreateMutable(
                                                              kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);

    SecPolicyRef sslPolicy = SecPolicyCreateSSL(true, (CFStringRef)trustHostname);

    CFArrayAppendValue(newTrustPolicies, sslPolicy);


#ifdef MAC_BACKWARDS_COMPATIBILITY
    /* This technique works in OS X (v10.5 and later) */

    SecTrustSetPolicies(trust, newTrustPolicies);
    CFRelease(oldTrustPolicies);

    return trust;
#else
    /* This technique works in iOS 2 and later, or
     OS X v10.7 and later */

    CFMutableArrayRef certificates = CFArrayCreateMutable(
                                                          kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);

    /* Copy the certificates from the original trust object */
    CFIndex count = SecTrustGetCertificateCount(trust);
    CFIndex i=0;
    for (i = 0; i < count; i++) {
        SecCertificateRef item = SecTrustGetCertificateAtIndex(trust, i);
        CFArrayAppendValue(certificates, item);
    }

    /* Create a new trust object */
    SecTrustRef newtrust = NULL;
    if (SecTrustCreateWithCertificates(certificates, newTrustPolicies, &newtrust) != errSecSuccess) {
        /* Probably a good spot to log something. */

        return NULL;
    }

    return newtrust;
#endif
}
  • 使用AOP方法,重写 AFURLConnectionOperation 的trustHostnames属性:
    /* 使用AOP方式,指定可信任的域名, 以支持:直接使用ip访问特定https服务器.*/
    [AFURLConnectionOperation aspect_hookSelector:@selector(trustHostnames) withOptions:AspectPositionInstead usingBlock: ^(id<AspectInfo> info){
        __autoreleasing NSArray * trustHostnames = @[@"www.example.com"];

        NSInvocation *invocation = info.originalInvocation;
        [invocation setReturnValue:&trustHostnames];
    }error:NULL];

那边用到的是一个 iOS AOP库,不熟习的点这里: .

背景

前不久App仿佛有报那多少个是DNS不可能剖析,尝试化解此难题.搜聚到的素材少之甚少,以致连AFN原来的著小编都认清那恐怕是二个无解的标题,参见: ,然而最终依然靠着stackoverflow上的一丁点提示,顺利找到并聚集成了几个可用的应用方案.大喜,与君分享!

1. 最直白的艺术是允许无效的SSL证书,生产情形不建议接纳;

标题陈述

经过IP间接待上访谈网址,能够缓慢解决DNS要挟难题.DNS劫持,能够透过更动计算机的host文件模拟.如果是HTTP诉求,使用ip地址间接访问接口,协作header中Host字段带上原本的域名新闻就可以;倘若是 https要求,会很麻烦,须要 Overriding TLS Chain Validation Correctly;curl 中有二个 -resolve 方法能够兑现采纳钦赐ip访谈https网址,iOS中集成curl库应该也可以,不过改造太大,未认证;对于服务器IP通常变的景象,恐怕需求采纳httpDNS服务,参见:.

本文由威尼斯游戏网站发布于威尼斯游戏网站,转载请注明出处:AFNetworking 原作者都无法解决的问题: 如何使用i

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。