Можно ли отправить хэш-тег в файл url в UIWebView?
Я хочу загрузить html-страницу из файла и добавить к ней хэш-тег. Возможно ли это?
Я пробовал
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];
NSURL *fileUrl = [NSURL fileURLWithPath:[filePath stringByAppendingFormat:@"#hashtag"]];
[self.webView loadRequest:[NSURLRequest requestWithURL:fileUrl]];
NSLog(@"fileUrl = %@, reachable? %d", fileUrl, [fileUrl checkResourceIsReachableAndReturnError:nil]);
но он пытается найти файл someFile.html%23hashtag
, который не может быть найден. Есть ли способ добавить хэш после создания объекта NSURL
?
Я также попытался загрузить файл в строку и с помощью loadHTMLString
:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];
NSString *fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:fileContents baseURL:[NSURL URLWithString:@"http://someFile.html#hashtag"]];
Здесь хэш-тег работает, но мои ссылки javascript внутри html не работают. Следующим вопросом по этому подходу было бы то, как я могу ссылаться на файлы javascript из html, загружаемого в виде строки в UIWebView, т.е. Что такое базовый url?
Взлом, который я могу придумать, - просто поместить все мои файлы javascript в строку html и загрузить его как строку, но я думаю, что должен быть лучший способ!
Ответы
Ответ 1
Я не пробовал это, но как насчет загрузки файла обычно без хэштега и реализации UIWebViewDelegate с чем-то вроде этого?
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[webView stringByEvaluatingJavaScriptFromString:@"window.location.href = '#hashtag';"];
}
Литература:
Ответ 2
Что касается вопроса% 23, я не думаю, что решение Скотта Койлера заменить хорошо.
Следующие решения выглядят лучше, я просто скопировал их из здесь
NSURL *baseUrl = [NSURL fileURLWithPath:stringUrl];
NSURL *fullURL = [NSURL URLWithString:@"#jumpto" relativeToURL:baseUrl];
Немного не по теме, я обнаружил, что Safari на iOS 6.0, 6.1 ведет себя по-другому, чем на iOS 5.1 и других настольных браузерах (включая Safari для OSX) относительно URL-адреса URL-адреса с якорем. Для одного из моих конкретных документов, будь то в UIWebview или мобильном Safari на iOS 6.0 или 6.1, при первом загрузке страница не прокручивается в нужную позицию, перезагрузка ее исправит. Возможно, это связано с тем, что часть html создается javascript динамически. Любые идеи?
Ответ 3
Вот как я это делаю в своем коде. Я добавляю хэш-метку к NSString, затем я превращаю ее в NSURL, используя файлURLWithPath. Затем я заменяю все экземпляры% 23 обратно на #. Все объяснено в коде ниже, но дайте мне знать, если у вас есть какие-либо вопросы.
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];
NSString *filePathWithHash = [NSString stringWithFormat:@"%@#yourDesiredHashTagHere",filePath];
NSURL *theURL = [NSURL fileURLWithPath:filePathWithHash];
//NSURL turns the # into %23 when using fileURLWIthPath. So we need to change it back:
NSString *finalURLString = [[NSString stringWithFormat:@"%@",theURL] stringByReplacingOccurrencesOfString:@"%23" withString:@"#"];
//Then we need to change it back to an NSURL
NSURL *finalURL = [NSURL URLWithString:finalURLString];
//And finally we load this in the webView
[theWebView loadRequest:[NSURLRequest requestWithURL:finalURL]];
Ответ 4
Вы должны перехватить NSURLRequest
, перевести его на NSMutableURLRequest
, а затем изменить URL следующим образом. Все это произойдет в shouldStartLoadWithRequest
. Убедитесь, что вы установили делегат UIWebView.
- (void) viewDidLoad
{
self.webView.delegate = self;
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
//Make sure the request is mutable
if(![request isKindOfClass:[NSMutableURLRequest class]])
[NSException raise:@"Need to change the request, but can't" format:@""];
NSMutableURLRequest* mutableRequest = (NSMutableURLRequest*)request;
NSString* newUrl = [NSString stringWithFormat:@"%@#hashtag", [[request URL] absoluteString]];
[mutableRequest setURL:[NSURL URLWithString:newUrl]];
return YES;
}
Я не сталкивался с такими случаями, когда запрос не изменялся, но кто знает.
Или вы можете установить хеш в исходном URL-адресе (например, вы делали), а затем заменить первое вхождение %23
на #
в shouldStartLoadWithRequest
.
Ответ 5
Добавление к ответу @xiang. Ниже быстрой версии, если вы работаете с локальными html файлами в своем приложении:
let urlString = "relative/path/to/your/index.html"
let anchorString = "#your-anchor"
let baseURL:NSURL? = NSBundle.mainBundle().URLForResource(urlString, withExtension: nil, subdirectory: nil)
if let url:NSURL? = NSURL(string: anchorString, relativeToURL: baseURL) {
// Do something with your URL
}
Ответ 6
Я думаю, вам нужно добавить хэш после создания URL-адреса файла
Работает ли он, если вы меняете
NSURL *fileUrl = [NSURL fileURLWithPath:[filePath stringByAppendingFormat:@"#hashtag"]];
к чему-то вроде:
NSString *urlString = [[NSURL fileURLWithPath:filePath] absoluteString];
NSURL *fileUrl = [NSURL URLWithString:[urlString stringByAppendingString:@"#hashtag"]];
Ответ 7
В Swift (с WKWebView):
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let baseURL = Bundle.main.url(forResource: "myFile", withExtension: "html") {
//Load the main page and allow access to its directory
webView.loadFileURL(baseURL, allowingReadAccessTo: baseURL.deletingLastPathComponent())
}
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
let anchor = "#myanchor"
//Use javascript to jump to the location
webView.evaluateJavaScript("location.href = '" + anchor + "'", completionHandler: nil)
}