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

标签 ios objective-c url-scheme

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

- (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,它只会启动应用程序而不会调用上面显示的处理函数。

经过搜索,我设法得到的最好的结果是这个

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

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

尽管有解释,但我仍然不知道该怎么做,而且我在网上也找不到其他具体的内容。

谢谢

问候

最佳答案

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

然而

我采用了和苹果一样的方案example code用于 QuickActions (3D Touch)。我将启动时的 URL 保存在一个变量中,并在 applicationDidBecomeActive: 中处理它.

@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

关于ios - 使用 URL 启动应用程序,但未调用 OpenUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33034771/

相关文章:

ios - NSSession 的 dataTaskWithResult 返回 nil

ios - 我应该如何缩放我的物理 body ?

ios - UILabel 阻止显示 UIButton,直到您从调试 View 层次结构继续

ios - Objective-C:将代码注入(inject)委托(delegate)方法

iphone - Objective-C:UIViewController 中出现的键盘隐藏的 UIScroller 和 UItextfields

ios - 我无法施放 initialViewController

ios - 适用于 iOS 的诺基亚 here URL 方案

html - 如何在 iOS 上使用 tel : with * (star, asterisk) 或 # (hash, pound)?

ios - URL 方案和 Facebook 应用程序 5.0

objective-c - 使用 AVFoundation 捕获视频时崩溃