应用程序进入后台而不是打开URL

时间:2017-09-08 08:39:48

标签: ios objective-c uilocalnotification openurl

我实施了本地通知,并希望在点击通知时打开网址。以下是应该执行此操作的代码:

- 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。 我不知道发生了什么,因为没有调试器信息我没有获得应用程序状态的任何信息。网址始终相同,因此不会出现问题。我无法理解为什么它在调试会话时工作,而不是正常工作,即使它是在同一设备上的相同调试版本。非常感谢每一个想法!

1 个答案:

答案 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];
    }
})