Apple帮助创作

时间:2013-04-04 14:23:44

标签: objective-c xcode

我跟随this guide向公众发送一些Apple帮助。我工作的应用程序已经内置了多年的帮助,但它突然停止工作,并且没有对应用程序plist或任何帮助文件进行任何更改。我们假设Apple改变了一些东西,所以我确保它符合Apple要求的规格。当我说"没有工作"我的意思是我们使用NSHelpManager的链接会打开帮助查看器,但会返回找不到的页面。

要检查的清单:

  1. 页面顶部有一个名称正确的锚
  2. 文件夹结构是之前链接的文章的副本
  3. 我们正在重新索引帮助页面
  4. 我们确实清除了所有缓存
  5. 以下是我们用来打开帮助页面的代码:

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

    在这种情况下,我们在顶部有一个<a name="mypage"></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中工作,但它们必定是不真实的。)

    想法?

    编辑(文件夹结构):

    这是在整个Cocoa项目的子目录中名为&#39; help&#39;的MyProj.help文件夹中。

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

    在文件夹中正如预期的那样,&#c;&#39;里面有一堆CSS文件,&#39; pgs&#39;有HTML页面和&#39; gfx&#39;有图像文件。

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

好吧,这个很混乱,但它与Xcode中的文件夹结构设置有关。这里有一些值得了解的事情:

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

如果您遵守上述规则,事情应该可以正常进行。在ML中似乎创建一个.help文件夹会从此处打破,所以基本上不要遵循Apple指南。

答案 2 :(得分:1)

我在这里添加此回复是因为我找到了一种非常愚蠢的方法来解决这个问题。通过使用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文件,以打开hiutil创建的文件,更改文件并使用NSArchiver进行回写到一个文件,但我的锚点仍然不会像我想的那样工作。

我根据Apple未公开的#34; Eagle&#34;克隆了TextEdit的帮助手册。帮助引擎(/Library/Documentation/Resources/Eagle/index.html),它生成所有Apple应用程序现在使用的漂亮帮助书。但是因为我使用的是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 Help screenshot

如果有人像我这样与老鹰挣扎,我希望这对你有帮助!

答案 3 :(得分:0)

我遇到了同样的问题(主持人没有在我的应用程序帮助手册中工作)并在其他Apple应用程序的帮助书中做了一些探讨,特别是Safari。我在Safari应用程序的Safari.help包中的Info.plist中找到了这个有趣的条目:

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

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