Сделать внешние ссылки в ChildBrowser открытыми с помощью safari?
В настоящее время я использую ChildBrowser в phoneapp, чтобы открыть веб-сайт. Тем не менее, я хотел бы открыть все внешние ссылки этого сайта, чтобы открыть в Safari.
У меня нет контроля над источником этого сайта.
Насколько я понимаю, мне нужно изменить ChildBrowser, чтобы открывать все ссылки, начинающиеся с "http" в Safari.
Я не могу точно прочитать Objective-C, но я считаю, что приведенный ниже код имеет значение.
- (void)loadURL:(NSString*)url
{
NSLog(@"Opening Url : %@",url);
if( [url hasSuffix:@".png" ] ||
[url hasSuffix:@".jpg" ] ||
[url hasSuffix:@".jpeg" ] ||
[url hasSuffix:@".bmp" ] ||
[url hasSuffix:@".gif" ] )
{
[ imageURL release ];
imageURL = [url copy];
isImage = YES;
NSString* htmlText = @"<html><body style='background-color:#333;margin:0px;padding:0px;'><img style='min-height:200px;margin:0px;padding:0px;width:100%;height:auto;' alt='' src='IMGSRC'/></body></html>";
htmlText = [ htmlText stringByReplacingOccurrencesOfString:@"IMGSRC" withString:url ];
[webView loadHTMLString:htmlText baseURL:[NSURL URLWithString:@""]];
}
else if ( [url hasPrefix:@"http" ])
{
//I have added in this else if.
}
else
{
imageURL = @"";
isImage = NO;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
[webView loadRequest:request];
}
webView.hidden = NO;
}
Любой совет?
1 ответ
Я нашел самый простой способ сделать это, если вы знаете имя Хода Домена, которое вы изначально будете запрашивать с childBrowser, и не планируете запрашивать какие-либо другие Домены, тогда вы можете записать это событие прямо в ChildBrowserViewController.m файл.
- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSURL *url = [request URL];
NSString* domain = [url host];
// Intercept the external http requests and forward to Safari.app
// Otherwise forward to the PhoneGap WebView
if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"] || [[url scheme] isEqualToString:@"www"]) {
if ( [domain isEqualToString:@"YOURDOMAIN.NAME] ) {
return YES;
} else {
[[UIApplication sharedApplication] openURL:url];
return NO;
}
} else {
return YES;// [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
}
}
Это отловит все запросы, сделанные childBrowser, и если они соответствуют стандартному соглашению URL (предшествующему HTTP, HTTPS или WWW), и они не являются именем вашего хоста домена, которое вы задали заранее, то это заставит их открыться в Safari. Затем, когда пользователь вернется в ваше приложение, он все равно будет на предыдущей странице, где он нажимал на ссылку.
Я часами возился с этим, пока не придумал.
Если вам нужно иметь возможность открывать более одного хоста домена с помощью childBrowser, но при этом каждый из них должен открывать все внешние ссылки, ведущие от этого текущего домена в Safari, я бы предложил следующее.
Добавьте следующее в ChildBrowserViewController.h
BOOL scaleEnabled;
BOOL isImage;
NSString* originalURL; <- THIS RIGHT HERE
NSString* imageURL;
И это
@property(retain) NSString* imageURL;
@property(retain) NSString* originalURL; <- THIS RIGHT HERE
@property(assign) BOOL isImage;
Затем добавьте следующее в ChildBrowserViewController.m
@synthesize imageURL;
@originalURL; <- THIS RIGHT HERE
@synthesize supportedOrientations;
@synthesize isImage;
И добавить следующее
- (void)loadURL:(NSString*)url
{
originalURL = url; <- THIS RIGHT HERE
NSLog(@"Opening Url : %@",url);
А затем в методе, который я разместил выше, измените следующее
NSURL *url = [request URL];
NSString* domain = [url host];
NSURL *oURL = [NSURL URLWithString: originalURL]; <- THIS RIGHT HERE
NSString* oDomain = [oURL host]; <- THIS RIGHT HERE
// Intercept the external http requests and forward to Safari.app
// Otherwise forward to the PhoneGap WebView
if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"] || [[url scheme] isEqualToString:@"www"]) {
if ( [domain isEqualToString:oDomain] ) { <- THIS RIGHT HERE
return YES;
} else {
Я не тестировал эту вторую часть, но она должна работать нормально.
Удачи.