如何解决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)
这是场景2
对不起,它只允许我发布链接
我尝试了几种不同的方法来解决这个问题 - 我可以使用 UIApplicationWillEnterForegroundNotification 来解决它,并手动执行 ViewWillAppear 通常所做的操作(这会导致视图被格式化更正,但该 ViewController 调用的任何 viewController 仍然有问题,并且不会调用 ViewWillAppear 之类的方法,并且视图显示正确。
想不出要包含的任何其他信息。我确信这是我没有做的非常简单的事情,但我不知道
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。