我正在为网站开发本机应用程序。该应用程序基本上是网站的包装器,它实现了推送通知等功能。单击推送通知时,将使用以下代码转到相应的页面:
- (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;
}
当应用程序进入后台并恢复后,活动会更改,以确保在用户使用应用程序时推送通知到达时不会触发活动。 URL被正确解析,因为如果我在浏览器中手动粘贴完全相同的URL,我会转到正确的页面。
我100%确定委托已设置,因为UIWebView: ShouldStartLoadWithRequest
方法被调用:
- (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;
}
}
在那里缓存网页版本有一些逻辑。我介绍了断点,它到达return YES
部分,并调用其中的日志。但是,在同一个委托中,不会调用didStartLoad
和didFailLoadWithError
,它们只包含NSLog。
在最初的应用程序启动时,这确实有效,并且它已经措辞了一段时间,我使用断点长时间步进,所以这似乎是一些时间问题。希望不必使用任何像计时器这样的hacky解决方案,我希望周围的人都有类似问题的经验,或者有任何其他宝贵的意见。