这是什么错误在iOS中使用不兼容类型'void'的表达式初始化'BOOL'(又名'signed char')?

时间:2018-04-20 11:21:05

标签: ios objective-c

我正在将部署目标从iOS 8更改为iOS 10,并且显示错误,例如正在初始化'BOOL'(又名'signed char'),其表达式为'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吗?

究竟是什么错误,如何解决此错误?

提前致谢

2 个答案:

答案 0 :(得分:1)

您正在呼叫的方法具有以下签名:

- (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/

答案 1 :(得分:0)

方法

- (void)openURL:(NSURL *)url 
        options:(NSDictionary<NSString *,id> *)options 
completionHandler:(void (^)(BOOL success))completion;

不返回值,它返回void,这不算什么。