我实施了本地通知,并希望在点击通知时打开网址。以下是应该执行此操作的代码:
- didFinishLaunchingWithOptions
UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if(notification != nil){
NSDictionary *userInfo = notification.userInfo;
NSURL *siteURL = [NSURL URLWithString:[userInfo objectForKey:@"linkToOpen"]];
dispatch_async(dispatch_get_main_queue(), ^{
if ([[UIApplication sharedApplication] canOpenURL:siteURL]){
[[UIApplication sharedApplication] openURL:siteURL];
}
});
和didReceiveLocalNotification:
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
dispatch_async(dispatch_get_main_queue(), ^{
NSDictionary *userInfo = notification.userInfo;
NSURL *siteURL = [NSURL URLWithString:[userInfo objectForKey:@"linkToOpen"]];
NSLog(@"try to open url:%@", siteURL.absoluteString);
if([[UIApplication sharedApplication] canOpenURL:siteURL]){
[[UIApplication sharedApplication] openURL:siteURL];
}
});
当应用程序处于后台或在点击通知时未运行时,将调用didFinishLaunchingWithOptions中的代码并且一切正常。即使应用程序附加到xCode调试器并且在前台它正在工作(经过一些延迟),但如果应用程序位于前台而未附加到调试器,则应用程序将进入后台而不是打开URL。 我不知道发生了什么,因为没有调试器信息我没有获得应用程序状态的任何信息。网址始终相同,因此不会出现问题。我无法理解为什么它在调试会话时工作,而不是正常工作,即使它是在同一设备上的相同调试版本。非常感谢每一个想法!
答案 0 :(得分:0)
尝试为应用程序启动时添加简短的deley。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
NSDictionary *userInfo = notification.userInfo;
NSURL *siteURL = [NSURL URLWithString:[userInfo objectForKey:@"linkToOpen"]];
NSLog(@"try to open url:%@", siteURL.absoluteString);
if([[UIApplication sharedApplication] canOpenURL:siteURL]){
[[UIApplication sharedApplication] openURL:siteURL];
}
})