CoreText CopyFontsForRequest收到mig IPC错误

时间:2014-09-27 08:18:36

标签: objective-c xcode macos cocoa core-text

我一直致力于一个大项目(无论如何都没有显示任何实际代码),我注意到日志中会出现以下消息:

CoreText CopyFontsForRequest received mig IPC error (FFFFFFFFFFFFFECC) from font server

WebView加载完成后会立即弹出错误。我有点相信这是一个小小的滞后背后的罪魁祸首。

为什么会这样?我该怎么做才能解决这个问题?


P.S。尝试the suggested solution here检查它是否是系统特定的,但它不起作用。


更多详情:

  • 使用Appearance Maker项目中的AMEditorAppearance.car NSAppearance 文件时出现错误。禁用它(=不加载全部)会使错误消失。

  • 我并不关心错误信息,除了它会产生一些奇怪的字体问题。例如。带有输入fiels的NSAlert面板显示出明显的闪烁,字体/文本似乎相当混乱,我不确定我能准确描述的方式。 (如果有帮助,我可以发布视频)

3 个答案:

答案 0 :(得分:3)

这可能与系统字体冲突有关,可以轻松修复:

  1. 打开字体书
  2. 选择所有字体
  3. 转到文件菜单并选择“验证字体”
  4. 解决所有字体冲突(删除小邮件)。
  5. 来源:Andreas Wacker

答案 1 :(得分:2)

这是因为使用姓氏参数调用NSFont fontWithFamily:引起的,该参数在Chromium的渲染器过程中在系统上不可用。当Chromium的沙箱处于活动状态时,此调用会触发您正在观察的CoreText错误。

在将CSS字体系列名与本地安装的系统字体匹配时会发生这种情况。

可能你正在研究一个Chromium派生的项目。更多信息可以在Chromium Bug 452849找到。

答案 2 :(得分:2)

@ Abrax5回答非常好。我只想添加我对此问题的体验,并且无法将其纳入评论:

据我所知,只有在首次尝试使用不可用的字体名称初始化NSFont时,才会引发此错误。 NSFont初始化程序可以使用,并且会在这种情况下返回nil,此时您有机会对其执行某些操作。

您可以使用以下方法检查给定名称的字体是否可用:

NSFontDescriptor(fontAttributes: [NSFontNameAttribute: "<font name>"]).matchingFontDescriptorWithMandatoryKeys([NSFontNameAttribute]) != nil

不幸的是,这也引发了错误!以下方法没有,但已弃用:

let fontDescr = NSFontDescriptor(fontAttributes: [NSFontNameAttribute: "<font name>"])
let isAvailable = NSFontManager.sharedFontManager().availableFontNamesMatchingFontDescriptor(fontDescr)?.count ?? 0 > 0

因此,我发现在没有引发错误的情况下检查给定名称字体的可用性的唯一方法如下:

public extension NSFont {

    private static let availableFonts = (NSFontManager.sharedFontManager().availableFonts as? [String]).map { Set($0) }

    public class func available(fontName: String) -> Bool {
        return NSFont.availableFonts?.contains(fontName) ?? false
    }
}

例如:

NSFont.available("Georgia")  //--> true
NSFont.available("WTF?")     //--> false

(我可能对那里的可选常量非常谨慎,如果您如此倾向,可以使用[AnyObject]转换返回的as! [String] ...)

请注意,为了提高效率,在应用再次启动之前不会更新,即在应用运行期间安装的任何字体都不会匹配。如果这对您的特定应用程序来说是一个重要问题,只需将常量转换为计算属性:

public extension NSFont {

    private static var allAvailable: Set<String>? {
        return (NSFontManager.sharedFontManager().availableFonts as? [String]).map { Set($0) }
    }

    private static let allAvailableAtStart = allAvailable

    public class func available(fontName: String) -> Bool {
        return NSFont.allAvailable?.contains(fontName) ?? false
    }

    public class func availableAtStart(fontName: String) -> Bool {
        return NSFont.allAvailableAtStart?.contains(fontName) ?? false
    }
}

在我的计算机上available(:)需要0.006s。当然,availableAtStart(:)除了第一次通话外几乎没有时间......