gpt4 book ai didi

带有自签名 SSL 证书的 iOS MKTileOverlay

转载 作者:太空宇宙 更新时间:2023-11-03 14:53:29 24 4
gpt4 key购买 nike

我操作自己的 map 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???
}

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

最佳答案

我是这样解决的:

- (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];
}
}

关于带有自签名 SSL 证书的 iOS MKTileOverlay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32127652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com