IOS OpenURL 奇怪的行为

问题描述

我有一个已建立的 IOS 应用程序,用目标 C 编写,并且在使用 OpenURL(调用 Strava)时我开始注意到一些奇怪的行为,尽管将应用程序剥离到它的骨架,但我还是不明白(它可能一直在那里,我从来没有注意到)。

该应用使用 TabControllers,第一个选项卡(地图)是大多数用户活动发生的地方

场景一

  • 用户选择另一个选项卡(例如修改路线 - 第二个选项卡),然后返回到地图选项卡
  • 用户选择同步,这会导致对 Strava 的 OpenURL 调用以及对我的应用的回调
  • 用户选择修改路线选项卡,一切都很好(viewWillAppear 等被调用
  • 一切都很好

场景 2

  • 用户在没有首先选择任何其他选项卡的情况下选择同步(因此其他视图控制器或未加载)
  • 这再次导致对 Strava 的 OpenURL 调用以及对我的应用的回调
  • 用户选择另一个选项卡并且它的格式不正确(并且从不调用 ViewWillAppear/ViewWilldisappear 等,我认为这是问题所在)。附上示例图片

TabBarController 以标准方式在 AppDelegate 中设置:

'''

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    imsViewRouteVC      *dispMapVC  = [[imsViewRouteVC alloc]init];
    imsAmendRouteVC     *amendRTVC  = [[imsAmendRouteVC alloc]init];
    imsAmendLogVC       *amendLogVC = [[imsAmendLogVC alloc]initWithStyle:UITableViewStylePlain];
    // etc
    
    _tabBarController = [[imsTabBarController alloc]init];
    imsNavigationController *displayMapNavController = [[imsNavigationController alloc]initWithRootViewController:dispMapVC];
    imsNavigationController *amendRTNavController = [[imsNavigationController alloc]initWithRootViewController:amendRTVC];
    imsNavigationController *amendLogNavController = [[imsNavigationController alloc]initWithRootViewController:amendLogVC];
    // etc
    
    _tabBarController.viewControllers = controllers;
    _tabBarController.modalPresentationStyle = 0;
    
    self.window.rootViewController = _tabBarController;
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    return YES;
}

视图控制器 imsViewRouteVCon 第一个选项卡中的 SyncStrava

'''

- (void) syncStrava
{
    _stravaSchemeURL = [[imsStrava sharedStore]getStravaAuthURLStravaScheme];
    UIApplication *application = [UIApplication sharedApplication];
    
    if ([application canopenURL:_stravaSchemeURL]) {
        NSLog(@"Can open Strava URL - Now opening it");
        [application openURL:[[imsStrava sharedStore]getStravaAuthURLStravaScheme] options:@{} completionHandler:nil];
    } else {
        NSLog(@"Not able to open Strava URL");
        _stravaAuthExecutedSuccessfully = NO;
        _stravaAuthPending = YES;
        
        NSLog(@"AuthURL = %@",[[imsStrava sharedStore]getStravaWebAuthURL]);
        NSLog(@"CallBackURL = %@",[[imsStrava sharedStore]getStravaRedirectURL]);
        _authSession = [[aswebauthenticationsession alloc]
                                  initWithURL:[[imsStrava sharedStore]getStravaWebAuthURL]
                            callbackURLScheme:[[imsStrava sharedStore]getStravaRedirectURLShort]
                            completionHandler:^(NSURL *callbackURL,NSError * _Nullable error) {
            [[imsStrava sharedStore] getAccesstoken:callbackURL];
        }];
        _authSession.presentationContextProvider = self;
        [_authSession start];
    }
}

AppDelegate 中的 OpenURL '''

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationopenURLOptionsKey,id> *)options {
    [self.window.rootViewController beginAppearanceTransition: NO animated: NO]; // Doesnt help
    [self.window.rootViewController endAppearanceTransition];// Doesnt help

//  Get Strava @R_790_4045@ion would normally come here
    
    return YES;
}

这就是选项卡 2 的样子(场景 1)

Scenario 1

这是场景2

Scenario 2

对不起,它只允许我发布链接

我尝试了几种不同的方法解决这个问题 - 我可以使用 UIApplicationWillEnterForegroundNotification 来解决它,并手动执行 ViewWillAppear 通常所做的操作(这会导致视图被格式化更正,但该 ViewController 调用的任何 viewController 仍然有问题,并且不会调用 ViewWillAppear 之类的方法,并且视图显示正确。

想不出要包含的任何其他信息。我确信这是我没有做的非常简单的事情,但我不知道

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)