gpt4 book ai didi

ios - 使用自定义 URL 方案的 UIWebView 加载失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:44 30 4
gpt4 key购买 nike

我有一个 UIWebView 正在我的应用程序中处理 OAuth 身份验证流程。 OAuth 服务使用的回调 URL 指向我在我的应用程序中设置的自定义 URL 方案,我们称它为 mycustomurlscheme

因此,一旦用户身份验证成功,OAuth 服务会将他们重定向到 URL mycustomurlscheme://oauth/success?oauth_token=xxxxxxxxxxxxxxxxxxxxx&oauth_verifier=xxxxxxxxxxxxxxxxxxxxxxx。当 UIWebView 请求此 URL 时,应用程序会正常运行;即,我的应用程序委托(delegate)中的 application:openURL:sourceApplication:annotation: 方法被调用,我关闭 UIWebView 并继续使用该应用程序。

但是,我在 UIWebView 中记录加载失败(使用 webView:didFailLoadWithError:),当上述过程发生时,我在控制台中看到以下内容:

Error Domain=WebKitErrorDomain Code=102 "Frame load interrupted" UserInfo=0xa1a4810 {NSErrorFailingURLKey=mycustomurlscheme://oauth/success?oauth_token= xxxxxxxxxxxxxxxxxxxx&oauth_verifier=xxxxxxxxxxxxxxxxxxxx, NSErrorFailingURLStringKey=mycustomurlscheme://oauth/success?oauth_token= xxxxxxxxxxxxxxxxxxxx&oauth_verifier=xxxxxxxxxxxxxxxxxxxx, NSLocalizedDescription=Frame load interrupted}

我尝试实现下面的UIWebViewDelegate方法,以为拦截请求就可以避免报错,结果还是报错:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request
navigationType:(UIWebViewNavigationType)navigationType
{
if ([request.URL.scheme isEqualToString:@"mycustomurlscheme"]) {
[[UIApplication sharedApplication] openURL:request.URL];
return NO;
} else {
return YES;
}
}

然后此代码会导致我的应用委托(delegate)中的以下代码运行:

- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
NSNotification *notification = [NSNotification notificationWithName:kDSApplicationLaunchedWithURLNotification object:nil userInfo:@{kApplicationLaunchOptionsURLKey: url}];
[[NSNotificationCenter defaultCenter] postNotification:notification];

return YES;
}

此通知由以下 block 获取,该 block 在授权后继续加载和启动应用:

self.applicationLaunchNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kDSApplicationLaunchedWithURLNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) {
NSURL *url = [notification.userInfo valueForKey:kApplicationLaunchOptionsURLKey];
currentRequestToken.verifier = [DSAPIParametersFromQueryString([url query]) valueForKey:@"oauth_verifier"];

[[DSAPIManager sharedManager] acquireAccessTokenWithRequestToken:currentRequestToken success:^(DSAPIOAuth1Token * accessToken) {
[self finishLogin];
} failure:^(NSError *error) {
[self removeAsObserver];
[self showAlert:NSLocalizedString(@"Could not authorize the app. Please try again later.", nil)];
}];
}];

finishLoginremoveAsObserver 方法如下所示:

- (void)finishLogin
{
[self removeAsObserver];
[self.navigationController dismissViewControllerAnimated:YES completion:^{
[self performSegueWithIdentifier:@"PostLoginSegue" sender:self];
}];
}

- (void)removeAsObserver
{
if (self.applicationLaunchNotificationObserver) {
[[NSNotificationCenter defaultCenter] removeObserver:self.applicationLaunchNotificationObserver];
self.applicationLaunchNotificationObserver = nil;
}
}

忽略此错误消息是否安全?有人知道为什么会这样吗?我的直觉是 UIWebView 认为 URL 有一个无效的方案,但手机知道它没问题。如果是这种情况,是否有任何方法可以告诉 UIWebView(或 WebKit 引擎)此方案有效?

最佳答案

这里的错误实际上是 Frame load interrupted 与 url scheme 无关。使用自定义 url 方案是完全可能的,并且不会产生任何错误。我的许多应用程序中都有它们,并且从未遇到过问题。

我相信你的问题是因为 [webView stoploading]; 从技术上讲,当你 return NO 时它会停止加载,所以 [webView stopLoading]; 只是导致进程中断。删除此行并让它继续 return NO 看看会发生什么我 99.9% 确定这是原因。

所以你的代码看起来像

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{
if ([request.URL.scheme isEqualToString:@"mycustomurlscheme"]) {
// Dismiss the view controller, continue loading the app, etc.
return NO;
}

return YES; // No need for the else statement if this is the only thing to happen if it fails the if statement.
}

更新

基于唐评论删除 [webView stopLoading]; 没有解决你的问题。如果是这种情况,并且您将其放入 if 语句中,我怀疑发生了其他事情。您是否共享了所有代码?使用此 //关闭 View Controller ,继续加载应用程序,等等。 在您的代码中,我怀疑您没有共享所有内容,在这种情况下我们无能为力。

关于ios - 使用自定义 URL 方案的 UIWebView 加载失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20427009/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com