Подтвердить что ты не робот

Можно ли отправить хэш-тег в файл 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 и загрузить его как строку, но я думаю, что должен быть лучший способ!

4b9b3361

Ответ 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)


}