0

現在、私はまだいくつかのドキュメントとチュートリアルを読んでいNSTimerます。私の現在の理解から、タイマーを呼び出して、それが繰り返されるようにメソッドを与えます。それからアイデアが浮かびました。(他のアプリプロジェクトに取り組んでいます)

私がやろうとしていること

  • 埋め込むUIWebView
  • 現在のURL(絶対文字列)をチェックするメソッドを使用してNSTimer(おそらく0.5秒)を実装します。指定したものでない場合は、URLをリダイレクトします。UIWebViewUIWebView

実装したいコードがあります。その目的は、知識を修正し、UIWebView作業NSTimerを開始する前にその妥当性を確認することです(まだドキュメントを読んでいます。詳細を確認して、もっと試してみたいと思います。それに取り組む前に)

今私にとって紛らわしい部分は、私のメソッドは互換性がありNSTimerますか?メソッドNSTimer内で使用することはもっともらしいでしょうか?UIWebView viewDidLoadアプリが0.5秒ごとにメソッドを継続的に実行するため、メモリの過負荷/クラッシュが発生しますか?

NSTimer:(間違っている場合は訂正してください。ただし、ユーザーがにいる限り永久に実行したいので、UIWebViewこのコードセットのみが必要で、インクルードは含まれませんNSRunLoop

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 2.0
                      target: self
                      selector:@selector(onTick:)
                      userInfo: nil repeats:NO];

-(void)onTick:(NSTimer *)timer {
   //do smth
}

EDIT2- @Robert Ryan、これは私が使用しているコードです(これは私が最初にこれに変更したときにちょうど今動作します)**(range2セクションをブロックした場合、エラードメインエラー-999は停止しました。しかしビューはまだロードされません)

     - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *currentURL = [[request URL] absoluteString];
    NSRange range1= [currentURL rangeOfString:@"news"];
    NSRange range2= [currentURL rangeOfString:@"pdf"];
    if (range1.location == NSNotFound)
    {
        NSURL *url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
        [webView loadRequest:[NSURLRequest requestWithURL:url]];

        return NO; //no to this if its not found.
    }
    if(range2.location==NSNotFound)
    {
        NSURL * url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
        [webView loadRequest:[NSURLRequest requestWithURL:url]];
        return NO; //no to this if its not found
    }

    return YES; //everything else ok

}

EDIT3-NSRange range1とrange2の両方を1つのステートメントに組み合わせると、再び機能します(1時間後も機能することを願っています。xD)

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *currentURL = [[request URL] absoluteString];
    NSRange range1= [currentURL rangeOfString:@"news"];
    NSRange range2= [currentURL rangeOfString:@"pdf"];
    if (range1.location == NSNotFound & range2.location==NSNotFound)
    {
        NSURL *url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
        [webView loadRequest:[NSURLRequest requestWithURL:url]];

        return NO;
    }
return YES;
}
4

2 に答える 2

2

ユーザーが他の URL に移動しないようにしたい場合は、次のコードを追加できます。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([[request.URL absoluteString] isEqualToString:@"http://YourAllowableURL1.com"]) {
        return YES;
    }

    if ([[request.URL absoluteString] isEqualToString:@"http://YourAllowableURL2.com"]) {
        return YES;
    }

    return NO;// user will not be able to go to any other urls
}

許可される URL のリストを指定して、これらの URL に対してのみ YES を返すようにすることもできます。

于 2012-06-27T06:40:13.270 に答える
1

「承認されていない」Web サイトにアクセスしようとしているかどうかを判断するために NSTimer を使用することは、あなたが望むものとはまったく異なります。shouldStartLoadWithRequestURL が受け入れられない場合は、現在のリクエストをキャンセルできます。ただし、URL を変更してリダイレクトを実行することはできません。本当にリダイレクトしたい場合は、おそらく少し遅れてから、まったく新しいリクエストを開始できます。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *currentURL = [[request URL] absoluteString];
    NSRange range = [currentURL rangeOfString:@"imc.jhmi.edu"];

    if (range.location == NSNotFound)
    {
        double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            NSURL *url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
            [webView loadRequest:[NSURLRequest requestWithURL:url]];
        });

        return NO;
    }

    return YES;
}

shouldStartLoadWithRequest実際には待つ必要がないように見えます。実際には新しいリクエストをすぐに開始できますが、前のリクエストが完了する前にそうするのは正しくないようです。しかし、それをしたい場合は、明らかに次のようになります。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *currentURL = [[request URL] absoluteString];
    NSRange range = [currentURL rangeOfString:@"imc.jhmi.edu"];

    if (range.location == NSNotFound)
    {
        NSURL *url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
        [webView loadRequest:[NSURLRequest requestWithURL:url]];

        return NO;
    }

    return YES;
}

個人的には、私はユーザーをまったくリダイレ​​クトしませんが、せいぜい、このサイトにとどまる必要があることを伝える UIAlertView をポップアップ表示するだけですが、これはあなた次第です。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSLog(@"%s %@", __FUNCTION__, request);

    NSString *currentURL = [[request URL] absoluteString];
    NSRange range = [currentURL rangeOfString:@"imc.jhmi.edu"];

    if (range.location == NSNotFound)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"This app only follows links within the www.imc.jhmi.edu site." 
                                                        message:nil 
                                                       delegate:nil 
                                              cancelButtonTitle:@"Ok" 
                                              otherButtonTitles:nil];
        [alert show];
        // [alert release]; // use in non-ARC
        return NO;
    }

    return YES;
}
于 2012-06-27T13:28:04.620 に答える