微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IOS OpenURL 奇怪的行为

如何解决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 information would normally come here
    
    return YES;
}

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

Scenario 1

这是场景2

Scenario 2

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。