首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用URL启动应用程序,但未调用OpenUrl

使用URL启动应用程序,但未调用OpenUrl
EN

Stack Overflow用户
提问于 2015-10-09 17:33:24
回答 9查看 34.4K关注 0票数 26

我已经实现了一个URL方案,并使用它通过调用方法将数据传递给我的应用程序。整个代码如下所示

代码语言:javascript
复制
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    // Check the calling application Bundle ID
    if ([[url scheme] isEqualToString:@"yuvitime"])
    {
        NSLog(@"URL scheme:%@", [url scheme]);
        NSString * yuvitimeRequestValue = [url query];
        NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil];
        NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter];
        [notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor];

        return YES;
    }
    else
        return NO;
}

如果我的应用程序在后台,一切都会正常工作。当您单击URL时,应用程序将返回到前台,并且URL将按照上述函数中的编码进行处理。

但是,如果应用程序被终止(应用程序尚未启动),通过单击URL,它只启动应用程序,而不调用上面显示的处理函数。

在搜索之后,我设法得到的最好结果是

application:WillFinishLaunchingWithOptions:当请求打开URL时,此方法的返回结果与application:didFinishLaunchingWithOptions:方法的返回结果相结合,以确定是否应处理URL。如果任一方法返回NO,则系统不会调用application:openURL:options__:方法。如果不实现其中一个方法,则只考虑已实现方法的返回值。

- application:didFinishLaunchingWithOptions:此方法表示处理launchOptions字典中任何键的最后机会。如果您没有评估application:willFinishLaunchingWithOptions:方法中的键,则应该在此方法中查看它们并提供适当的响应。非应用程序代理的对象可以通过观察名为UIApplicationDidFinishLaunchingNotification的通知并访问该通知的launchOptions字典来访问相同的userInfo字典值。该通知在此方法返回后不久发送。此方法的返回结果与application:willFinishLaunchingWithOptions:方法的返回结果相结合,以确定是否应处理URL。如果任一方法返回NO,则不处理该URL。如果不实现其中一个方法,则只考虑已实现方法的返回值。

尽管有这样的解释,我仍然不知道怎么做,我在网上也找不到其他具体的东西。

谢谢

问候

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2016-02-10 21:03:44

我同意Kaloyan的观点,"handleOpenURL“从来不会在应用程序启动时调用。因此您必须在didFinishLaunchingWithOptions中检查"launchOptions“中的URL。

然而,

我采用了与苹果QuickActions (3DTouch)的example code相同的解决方案。我将启动时的URL保存在一个变量中,并在applicationDidBecomeActive:中处理它。

代码语言:javascript
复制
@interface MyAppDelegate ()
@property (nonatomic, strong) NSURL *launchedURL;
@end

@implementation MyAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.launchedURL = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
    ...
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (self.launchedURL) {
        [self openLink:self.launchedURL];
        self.launchedURL = nil;
    }
}

- (BOOL)  application:(UIApplication *)application
          openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
       annotation:(id)annotation
{
    NSURL *openUrl = url;

    if (!openUrl)
    {
        return NO;
    }
    return [self openLink:openUrl];
}

- (BOOL)openLink:(NSURL *)urlLink
{
    ...
}

@end
票数 29
EN

Stack Overflow用户

发布于 2020-02-02 07:30:51

我在iOS 13上的一个应用程序上遇到了同样的问题,即使正确实现了- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options方法,它也从未被调用过。

在iOS13中,调用SceneDelegates而不是AppDelegate方法。一旦我实现了

代码语言:javascript
复制
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts

在场景代理上,如果应用程序已经在内存中,它将工作。但是,对于冷启动,我必须实现回调

代码语言:javascript
复制
-(void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions

也是。

在实现时

代码语言:javascript
复制
-(void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions

请记住处理应用程序不是从URL启动的情况。

这里有一个有用的参考:https://forums.developer.apple.com/thread/124132

票数 11
EN

Stack Overflow用户

发布于 2016-02-15 17:53:11

我相信现在有一个更好的答案,

  • application:handleOpenURL:
  • application:openURL:sourceApplication:annotation:

在iOS9中都被弃用。苹果公司的建议是:

改用application:openURL:options:

application:openURL:options:与旧版本的行为不同,因为它将在应用程序处于后台或将启动的情况下执行。

因此,您只需要处理其中的URL打开。如下所示:

代码语言:javascript
复制
- (BOOL)application:(UIApplication *)app
        openURL:(NSURL *)url
        options:(NSDictionary<NSString *,id> *)options {

    // Check the calling application Bundle ID
    if ([[url scheme] isEqualToString:@"yuvitime"])
    {
        NSLog(@"URL scheme:%@", [url scheme]);
        NSString * yuvitimeRequestValue = [url query];
        NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil];
        NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter];
        [notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor];

        return YES;
    }
    else
        return NO;
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33034771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档