我正在将部署目标从iOS 8更改为iOS 10,它显示错误,例如初始化">BOOL"(又名"符号字符"(,并在行中具有不兼容类型"void"的表达式
- (BOOL)presentAuthorizationWithURL:(NSURL *)URL session:(id<OIDAuthorizationFlowSession>)session {
if (_authorizationFlowInProgress) {
return NO;
}
_authorizationFlowInProgress = YES;
_session = session;
if (@available(iOS 9.0, *)) {
if ([SFSafariViewController class]) {
SFSafariViewController *safariVC =
[[[self class] safariViewControllerFactory] safariViewControllerWithURL:URL];
safariVC.delegate = self;
_safariVC = safariVC;
[_presentingViewController presentViewController:safariVC animated:YES completion:nil];
return YES;
}
} else {
// Fallback on earlier versions
}
BOOL openedSafari = [[UIApplication sharedApplication] openURL:URL];
if (!openedSafari) {
[self cleanUp];
NSError *safariError = [OIDErrorUtilities errorWithCode:OIDErrorCodeSafariOpenError
underlyingError:nil
description:@"Unable to open Safari."];
[session failAuthorizationFlowWithError:safariError];
}
return openedSafari;
}
这是以前的方法,我可以将整个方法更改为 void 吗?
错误到底是什么,如何解决此错误?
提前致谢
您调用的方法具有以下签名:
- (void) openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options
completionHandler:(void (^)(BOOL success))completion;
它返回 void
,因此您不能将其分配给BOOL
变量。 相反,您需要一个completionHandler
块来确定方法完成时要执行的操作。
在 iOS 10 之前,这是调用的方法:
- (BOOL)openURL:(NSURL *)url;
该方法确实返回一个BOOL
,但现在已弃用。
您需要将代码更改为如下所示的内容:
[[UIApplication sharedApplication] openURL:URL options:@{}
completionHandler:^(BOOL success) {
if (success) {
// do whatever you do on success
}
else {
// do whatever you do on failure
}
}];
有关如何处理此更改的更多详细信息,请参阅 https://useyourloaf.com/blog/openurl-deprecated-in-ios10/。
方法
- (void)openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options
completionHandler:(void (^)(BOOL success))completion;
不返回值,它返回什么都不void
。