Web サイト用のネイティブ アプリケーションを開発しています。アプリケーションは基本的に、Web サイトのラッパーであり、プッシュ通知などを実装します。プッシュ通知がクリックされると、次のコードを使用して適切なページに移動します。
- (NSString *)handlePush:(NSDictionary *)notification
{
if ([[notification objectForKey:@"aps"] objectForKey:@"badge"]) {
int badgeNum = [[[notification objectForKey:@"aps"] objectForKey:@"badge"] integerValue];
NSLog(@"Badge: %i, got from %@", badgeNum, [[notification objectForKey:@"aps"] objectForKey:@"badge"]);
[UIApplication sharedApplication].applicationIconBadgeNumber = badgeNum;
}
if (!active) {
NSLog(@"Got noti while not active, going to that chat!");
NSString *hash;
if ((hash = [notification objectForKey:@"h"])) {
NSLog(@"Hash: %@", [hash stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]);
return [NSString stringWithFormat:@"#%@", hash];
}
return @"";
}
return nil;
}
アプリケーションがバックグラウンドに入ったときと再開後に Active が変更され、ユーザーがアプリを使用しているときにプッシュ通知が届いたときにトリガーされないようにします。ブラウザにまったく同じ URL を手動で貼り付けると、正しいページに移動するため、URL は適切に解析されます。
UIWebView: ShouldStartLoadWithRequest
メソッドが呼び出されると、デリゲートが設定されていることは 100% 確信しています。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *url = [[request URL] absoluteString];
NSLog(@"shouldStartLoadWithRequest called with url %@", url);
if ([url hasPrefix:BASE_URL]) {
NSLog(@"Yea, i'll load this one for ya");
// remove any get-params / hash suffix
NSRange r = [url rangeOfString:@"?"];
if (r.location == NSNotFound)
r = [url rangeOfString:@"#"];
if (r.location != NSNotFound)
url = [url substringToIndex:r.location];
if (![url isEqualToString:[defaults valueForKey:@"baseUrl"]]) {
NSLog(@"setting new baseUrl %@", url);
[defaults setValue:url forKey:@"baseUrl"];
[defaults synchronize];
}
NSLog(@"Should go and load it now...");
return YES;
}
}
そこに Web ページのバージョンをキャッシュするためのロジックがいくつかあります。ブレークポイントでステップスルーすると、パーツに到達しreturn YES
、そこにあるログが呼び出されます。ただし、同じデリゲートでは、純粋に NSLog を含む と は呼び出されませんdidStartLoad
。didFailLoadWithError
アプリケーションの最初の起動時に、これは機能し、ブレークポイントを使用して長い間ステップスルーしたことも一度述べられているため、タイミングの問題のようです。タイマーのようなハッキーなソリューションを使用する必要がないことを願って、ここにいる誰かが同様の問題を経験したか、他の貴重な意見を持っていることを望んでいました.