Ios 使用通知从URL方案启动时更新应用程序的UI

Ios 使用通知从URL方案启动时更新应用程序的UI,ios,objective-c,url-scheme,ios-app-extension,nsnotification,Ios,Objective C,Url Scheme,Ios App Extension,Nsnotification,我已经实现了一个通知中心扩展,它提供了一个按钮来启动包含它的应用程序。根据小部件的状态,按下此按钮时,我希望导航到应用程序中两个不同位置之一。我能够获得这种行为,当应用程序在内存中时,它工作得很好,但是,如果应用程序必须在第一次按下此按钮时启动,它不会导航到正确的位置 我知道发生这种情况的原因。当我解析URL以确定在应用程序委托中的位置时,我会发布一个通知并在userInfo字典中提供信息。我在视图控制器中订阅此通知,该视图控制器需要根据userInfo字典中的信息更新其UI。问题是,我在视图中

我已经实现了一个通知中心扩展,它提供了一个按钮来启动包含它的应用程序。根据小部件的状态,按下此按钮时,我希望导航到应用程序中两个不同位置之一。我能够获得这种行为,当应用程序在内存中时,它工作得很好,但是,如果应用程序必须在第一次按下此按钮时启动,它不会导航到正确的位置

我知道发生这种情况的原因。当我解析URL以确定在应用程序委托中的位置时,我会发布一个通知并在
userInfo
字典中提供信息。我在视图控制器中订阅此通知,该视图控制器需要根据
userInfo
字典中的信息更新其UI。问题是,我在
视图中订阅此通知将出现
。此通知是在首次启动应用程序时在此视图控制器上调用
viewwillbeen
之前发布的,因此UI不会更新,其行为方式与从主屏幕启动应用程序一样

我的问题是,是否有一种不同的方法可以让代码在生命周期的早期订阅此通知,或者有更好的方法来响应从URL方案启动

一些简化代码:

//AppDelegate.m:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([[url scheme] isEqualToString:@"app name"]) {
        if ([[url resourceSpecifier] isEqualToString:@"//tab1"]) {
            [[NSNotificationCenter defaultCenter] postNotificationName:DidLaunchWithURLScheme object:nil userInfo:@{@"info": @"first"}];
        } else if ([[url query] isEqualToString:@"//tab2"]) {
            [[NSNotificationCenter defaultCenter] postNotificationName:DidLaunchWithURLScheme object:nil userInfo:@{@"info": @"second"}];
        }

        return YES;
    }

    return NO;
}

//viewWillAppear in View Controller:
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didLaunchAppWithURLInfo:)
                                             name:DidLaunchWithURLScheme
                                           object:nil];

- (void)didLaunchAppWithURLInfo:(NSNotification *)notification {
    //does get called if app was already in memory
    //does not get called if app was fresh launched

    //do something here like select a different tab based on the userInfo
}

您是否尝试过
viewDidLoad
application:openURLsourceApplication:annotation:
viewDidLoad
之前也被调用。