我最近将构建系统更新为macOS 10.15和Xcode 11.3.1,但是当我尝试编译我的程序之一时,出现“期望的平台名称,例如'macos'”错误,并且构建停止。我已经确定只有在使用WebKit构建该问题时才会发生-如果我注释掉该代码,则该软件将正确构建并运行(当然,除了显示HTML的能力之外)。我想知道问题是否可能出在我使用的WebViews中(不推荐使用),所以我改为将代码更新为WKWebView,但问题仍然存在。当然,由于出现此错误,所以我不知道是否已正确更新到WKWebView-它不会运行,并且这部分代码也不会显示任何其他错误。
HTMLViewController.h:
#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>
#import "ReadEML.h"
@interface HTMLViewController : NSViewController //<WebPolicyDelegate>
{
NSSize dpi;
}
@property (assign) IBOutlet WKWebView *mailContentView;
- (WKWebView*)contentView;
- (void)displayContentFromReader:(id)emlReader;
- (void)setFormattingOn:(bool)formatting;
- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
@end
HTMLViewController.m
#import "HTMLViewController.h"
#import "Webtools.h"
#import "Stringtools.h"
@interface HTMLViewController ()
@end
@implementation HTMLViewController
- (void)awakeFromNib {
CGDirectDisplayID displayID = [_mailContentView.window.screen.deviceDescription[@"NSScreenNumber"] unsignedIntValue];
CGSize size = CGDisplayScreenSize(displayID);
CGDisplayModeRef mode = CGDisplayCopyDisplayMode(displayID);
dpi.width = CGDisplayModeGetWidth(mode) * 25.4 / size.width;
dpi.height = CGDisplayModeGetHeight(mode) * 25.4 / size.height;
CGDisplayModeRelease(mode);
float scaling = [AppDelegate.sharedAppdelegate getPreferenceForKey:@"DefaultZoom"]?[[AppDelegate.sharedAppdelegate getPreferenceForKey:@"DefaultZoom"] intValue]:100;
[_mailContentView.webFrame.frameView.documentView scaleUnitSquareToSize:NSMakeSize(dpi.width / (dpi.width / (scaling / 100.0)), dpi.height / (dpi.height / (scaling / 100.0)))];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
return self;
}
- (WKWebView*)contentView {
return _mailContentView;
}
- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if (navigationAction.request.URL) {
decisionHandler(WKNavigationActionPolicyCancel);
[NSWorkspace.sharedWorkspace openURL:navigationAction.request.URL];
} else {
decisionHandler(WKNavigationActionPolicyAllow);
}
}
- (void)displayContentFromReader:(id)dataCollector {
@autoreleasepool {
NSString* pathStem = getTempCacheDirectory();
NSURL* rootURL = [NSURL URLWithString:[pathStem stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURL* ReadRootURL = [NSURL fileURLWithPath:[pathStem stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[_mailContentView.webFrame loadHTMLString:[dataCollector getContent:@"RawHTML"] baseURL:ReadRootURL];
}
}
@end
我的直觉告诉我,这个特殊问题不在我的代码中-有人可以暗示还会发生什么吗?就像我说的那样,如果我不导入.h文件,而是删除了代码中所有对其用法的引用,则代码可以毫无问题地进行编译。
它也可以在macOS 10.14上毫无问题地进行编译。
我很困惑!
这可能会帮助某些人解决这个特定的问题-我找到了一个适合我的解决方案,但是我对此感到不满意,因为它感觉很hacky。
只需在头文件中添加以下定义,代码就可以毫无困难地进行编译。我仍然很想了解Apple为什么更改了此设置,无论是故意还是错误,以及“正确”的解决方案应该是什么。
#define TARGET_OS_MACCATALYST 1