2

我正在按照本指南公开一些 Apple 帮助。我工作的应用程序多年来一直内置帮助,但它突然停止工作,并且没有对应用程序 plist 或任何帮助文件进行任何更改。我们假设苹果改变了一些东西,所以我确保它符合苹果要求的规格。当我说“不工作”时,我的意思是我们使用的链接NSHelpManager将打开帮助查看器,但会返回一个未找到的页面。

检查清单的事项:

  1. 页面顶部有一个名称正确的锚点
  2. 文件夹结构是之前链接的那篇文章的副本
  3. 我们正在重新索引帮助页面
  4. 我们确实清除了所有缓存

这是我们用来打开帮助页面的代码:

NSString *locBookName = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleHelpBookName"];
[[NSHelpManager sharedHelpManager] openHelpAnchor:@"mypage" inBook:locBookName];

在这种情况下,我们会有一个<a name="mypage"></a>顶部带有 a 的页面,因此它应该正确链接。我们的脚本如下:

hvfix(清除所有缓存):

rm -rf ~/Library/Caches/com.apple.help*
rm -rf ~/Library/Preferences/com.apple.help*
rm -rf ~/.Trash/*
killall helpd
defaults write com.apple.helpindexer IndexAnchors YES

updatehelpindex.sh(重新生成索引)

#!/bin/sh
hiutil -C -f MyApp.help/Contents/Resources/English.lproj/MyApp.helpindex
MyApp.help/Contents/Resources/English.lproj/

我们进行构建,将文件夹放入 Applications 文件夹以注册应用程序 + 帮助。我们甚至尝试重新启动或注销/登录,但仍然一无所获。我知道这是一个非常繁琐的过程,但我们尝试的任何方法似乎都不起作用。我们想要做的就是使用NSHelpManager来打开一个帮助锚。毫无疑问,这在 10.6+ 中有效,因为许多其他应用程序都这样做(一些报告表明它在 10.7/8 中无效,但它们一定是不真实的)。

想法?

编辑(文件夹结构):

它位于 MyProj.help 文件夹中,该文件夹位于整个 Cocoa 项目的名为“help”的子目录中。

+ Contents
     Info.plist
     + Resources
         + shrd
              (a bunch of image files)
         + English.lproj
               MyProj.helpindex
               index.html
               + css
               + pgs
               + gfx

和预期的一样,在文件夹中,'css' 有一堆 CSS 文件,'pgs' 有 HTML 页面,'gfx' 有图像文件。

4

4 回答 4

5

当 HelpBook 向系统注册时,沙盒会影响 HelpViewer 的目录搜索,这似乎是一个错误(如本错误报告中所述),这完全解释了为什么它出现在 10.7 和 10.8 上,而不是 10.6 和更早版本。甚至 Apple 的NSAlertTest也深受其害。不幸的是,由于截至本文发布时错误报告仍未解决,因此没有可行的解决方案,但我运行的少数测试证实 NSHelpManager 完全忽略了我机器上的沙盒帮助 plist。

于 2013-04-15T22:46:38.507 回答
2

好的,这是一个相当混乱的过山车,但它与您在 Xcode 中的文件夹结构设置有关。以下是一些值得了解的事情:

  • 人们选择把它放在 English.lproj 中。不要这样做,有几个原因。首先,如果您将帮助文件夹拖到文件列表中,它不会在 Xcode 中显示子目录/文件,其次,该文件夹中的内容应该是扁平的,而不是结构化的。
  • 在根目录中创建一个“帮助”文件夹并将您的文件放入其中。如果您想要本地化,您可以将它们放在名为“English.lproj”的子目录中。
  • 不要创建包含所有帮助文件的“.help”文件夹。这似乎破坏了索引。我们不知道为什么。
  • 相反,拥有 /help/Contents/stuff 并将该文件夹拖放到您的项目目录列表中(我的在“资源”组中)。确保它是一个蓝色文件夹,并且您可以看到整个目录(所有 HTML 等)
  • 对其运行帮助索引器以生成 .helpindex 文件
  • 确保您的 plist 条目反映了该文件夹的名称和 index.html 文件中指定的元标记名称

如果您遵循上述规则,事情应该可以正常工作。似乎在 ML 中创建一个 .help 文件夹会破坏从这里开始的事情,所以基本上,不要遵循 Apple 指南。

于 2013-04-16T10:54:19.470 回答
2

我在此处添加此响应是因为我发现了一种非常愚蠢的解决方法。通过使用 Apple 的hiutil命令行工具,我看到所有 Apple 的官方帮助书籍都使用了某种使用重定向器文件的索引:

$ hiutil -Df /Applications/Xcode.app/Contents/Resources/Xcode.help/Contents/Resources/en.lproj/search.helpindex
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
> <plist version="1.0">
> <dict>
>     <key>dev01043b473</key>
>     <array>
>         <string>/redirect.html?topic=dev01043b473</string>
>     </array>
>     <key>dev0125622ec</key>
>     <array>
>         <string>/redirect.html?topic=dev0125622ec</string>
>     </array>
> ...

受此启发,我尝试.searchindex手动生成一个文件,使用它NSUnarchiver来打开由.hiutilNSArchiver

/Library/Documentation/Resources/Eagle/index.html我基于Apple未公开的“Eagle”帮助引擎(但是因为我使用的是 HTML 索引,所以我的锚点会生成纯 HTML 文件,而 Eagle 没有美化这些文件。

Noto help without style screenshot

然后我想到了这个愚蠢的想法:工作量很大,但是如果您为每个锚点创建一个单独的 html 文件,您可以像在 中一样使用元重定向头标签redirect.html,除了您的重定向将是静态的。因此,对于我的editor-prefs.html文件,我创建了一个editor-prefs-anchor.html包含以下内容的文件:

<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Editor Options</title>
    <meta http-equiv="refresh" content="0;url=../index.html?localePath=en.lproj#/editor-prefs" />
</head>

<body>
    <a id="editor-prefs">
</body>

</html>

元重定向标签负责重定向到正确的 Eagle 驱动的 URL,它有效!

Noto帮助截图

如果有人像我一样在 Eagle 中挣扎,我希望这对你有帮助!

于 2017-10-12T15:54:29.710 回答
0

我遇到了同样的问题(锚在我的应用程序的帮助书中不起作用)并在其他 Apple 应用程序的帮助书中进行了一些探索,特别是 Safari。我在 Safari 应用程序的 Safari.help 包的 Info.plist 中发现了这个有趣的条目:

 <key>HPDBookIndexPath</key>
    <string>search.helpindex</string>

我将其更改为与我的应用程序帮助包中的 .helpindex 文件的名称相匹配,并且锚点开始工作。

于 2016-10-23T12:32:12.370 回答