在 iOS 中使用不兼容类型'void'的表达式初始化'BOOL'(又名"签名字符")此错误是什么?



我正在将部署目标从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

相关内容

最新更新