【问题标题】:iOS MKTileOverlay with self signed SSL certificate带有自签名 SSL 证书的 iOS MKTileOverlay
【发布时间】:2015-08-20 20:22:02
【问题描述】:

我为地图操作自己的 tileserver。该服务器可通过带有自签名证书的 HTTPS 访问。有没有机会使用MKTileOverlay

static NSString * const template = @"https://tile.myserverwithselfsignedcertificate.org/{z}/{x}/{y}.png";

MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
overlay.canReplaceMapContent = YES;

[self.mapView addOverlay:overlay
                   level:MKOverlayLevelAboveLabels];

带有自签名证书。不幸的是,我在 XCode 日志窗口中收到证书无效的错误消息。

对于直接 NSURLConnection 请求,我可以使用所描述的解决方案,例如这里:http://www.cocoanetics.com/2010/12/nsurlconnection-with-self-signed-certificates/

但这不适用于我自定义的 MKTileOverlay 类。

有人知道这是否可行吗?

2015 年 8 月 21 日编辑

我相信我必须将 MKTileOverlay 覆盖为这样的:

- (void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData *data, NSError *error))result
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[self URLForTilePath:path]
                                                 cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20];
    connectionApi = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

}

- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
    [myData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)conn
{
    // myData includes now the required tile,
    // but how to pass it back to the result
    // block of the loadTileAtPath method???
}

有人知道如何解决这个问题吗?

【问题讨论】:

  • 如果您使用的是 HTTPS,则 URL 将以 https:// 开头。
  • 你是对的。我只是从另一个来源复制并粘贴了这段代码行。当然我用 HTTPS 试过了。
  • 如果 MKTileOverlay 内部使用了 NSURLRequest,你可以试试this answer提供的解决方案
  • 这与使用 HTTP 没有区别,Apple 可能会拒绝您的二进制文件...

标签: ios ssl mktileoverlay


【解决方案1】:

我能够解决它:

- (void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData *data, NSError *error))result
{
        NSURLRequest *request = [NSURLRequest requestWithURL:[self URLForTilePath:path]
                                                 cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20];
        if (!tileDict)
            tileDict = [[NSMutableDictionary alloc] initWithCapacity:100];

        NSURLConnection *connectionApi = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
        NSURL *myURL = [[connectionApi currentRequest] URL];

        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        __block id tileNotification;
        tileNotification = [center addObserverForName:[NSString stringWithFormat:@"receivedTileFromInternet-%@", myURL]
                                                  object:nil
                                                   queue:nil
                                              usingBlock:^(NSNotification *notification)
                               {
                                   NSURL *myURL = [notification.userInfo objectForKey:@"tileUrl"];

                                   if ([tileDict objectForKey:myURL])
                                   {
                                       [[NSNotificationCenter defaultCenter] removeObserver:tileNotification];
                                       NSData *data = [tileDict objectForKey:myURL];

                                       result(data, nil);
                                   }
                               } ];
    }
}


- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
    NSURL *myURL = [[conn currentRequest] URL];

    if (![tileDict objectForKey:myURL])
    {
        NSMutableData *singleTile = [[NSMutableData alloc] initWithData:data];
        [tileDict setObject:singleTile forKey:myURL];
    }
    else
    {
        [[tileDict objectForKey:myURL] appendData:data];
    }
}

- (void)connectionDidFinishLoading:(NSURLConnection *)conn
{
    NSURL *myURL = [[conn currentRequest] URL];
    if (![tileDict objectForKey:myURL])
    {
        NSLog(@"Tile leer???");
    }
    else
    {
        NSDictionary* userInfo = [NSDictionary dictionaryWithObjectsAndKeys:myURL, @"tileUrl", nil];
        NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
        [nc postNotificationName:[NSString stringWithFormat:@"receivedTileFromInternet-%@", myURL] object:self userInfo:userInfo];
    }
}

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 2010-09-12
    • 2013-09-15
    • 2014-05-05
    • 1970-01-01
    • 2016-06-06
    • 2019-04-26
    • 2015-03-06
    相关资源
    最近更新 更多