启动应用后立即使用openURL时出现延迟

4

我正在尝试在我的应用程序启动时使用其url处理程序启动另一个应用程序。

- (void)applicationDidBecomeActive:(UIApplication *)application
{        
     NSURL *actionURL = [NSURL URLWithString:@"fantastical2://"];
     [[UIApplication sharedApplication] openURL:actionURL];
}

虽然基本上是有效的,但是从我的应用程序出现到实际打开URL大约需要7秒的显著延迟。

为什么会有这个延迟?如何在启动我的应用程序时立即打开URL / app或减少此延迟?


1
尝试使用具有目标的NSTimer。 - Kumar KL
1
太好了,可以了。非常感谢。你能把那个评论加入答案里吗?这样我就可以标记它了。 - Bernd
欢迎...刚刚添加了官方支持... - Kumar KL
我认为最好在这里提问和回答:[https://dev59.com/WmIk5IYBdhLWcg3wWc_T] - Smilin Brian
4个回答

4

您可以使用以下任一示例来解决问题。

使用diapatch_async

dispatch_async(dispatch_get_main_queue(), ^{
    [[UIApplication sharedApplication] openURL:urlString];
});

使用perfomSelector

- (void)applicationDidBecomeActive:(UIApplication *)application
{
  ...

  //hangs for 10 seconds
  //[[UIApplication sharedApplication] openURL:[NSURL URLWithString: url]];

  //Fix: use threads!
  [self performSelector:@selector(redirectToURL:)
      withObject:url afterDelay:0.0];

  ...
}

- (void)redirectToURL:(NSString *)url
{
  [[UIApplication sharedApplication] openURL:[NSURL URLWithString: url]];
}

使用NSThread

- (void)applicationDidBecomeActive:(UIApplication *)application
{
  ...

  //hangs for 10 seconds
  //[[UIApplication sharedApplication] openURL:[NSURL URLWithString: url]];

  //Fix: use threads!
  [NSThread detachNewThreadSelector:@selector(openBrowserInBackground:)
      toTarget:self withObject:url];

  ...
}

- (void)openBrowserInBackground:(NSString *)url
{
  [[UIApplication sharedApplication] openURL:[NSURL URLWithString: url]];
}

1
尝试使用具有目标的NSTimer。
仅供参考:
[NSTimer scheduledTimerWithTimeInterval:7.0
    target:self
    selector:@selector(targetMethod:)
    userInfo:nil
    repeats:NO];


 -(void) targetMethod{
    // Call Here ...
     NSURL *actionURL = [NSURL URLWithString:@"fantastical2://"];
     [[UIApplication sharedApplication] openURL:actionURL];

    //Invalidate the time
    [myTimer invalidate];
    myTimer = nil;
 }

1
我还注意到,即使我想立即调用该方法,时间间隔也不应为0.0。 - Bernd

0
将您的代码添加到- (void)applicationDidFinishLaunching:(UIApplication *)application中,因为在调用applicationDidFinishLaunching之后,- (void)applicationDidBecomeActive:(UIApplication *)application将被调用。

0
尝试在运行在主线程上的块内调用-openURL方法。这将导致它在其他所有内容加载完成后执行:
-(void)applicationDidBecomeActive:(UIApplication *)application {
    dispatch_async(dispatch_get_main_queue(), ^{
        NSURL *actionURL = [NSURL URLWithString:@"fantastical2://"];
        [[UIApplication sharedApplication] openURL:actionURL];
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接