我跟随this guide向公众发送一些Apple帮助。我工作的应用程序已经内置了多年的帮助,但它突然停止工作,并且没有对应用程序plist或任何帮助文件进行任何更改。我们假设Apple改变了一些东西,所以我确保它符合Apple要求的规格。当我说"没有工作"我的意思是我们使用NSHelpManager
的链接会打开帮助查看器,但会返回找不到的页面。
要检查的清单:
以下是我们用来打开帮助页面的代码:
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;有图像文件。
答案 0 :(得分:5)
当向系统注册HelpBook时,沙盒影响HelpViewer目录搜索的方式似乎是一个错误(如this bug report中所述),这完全解释了为什么它出现在10.7和10.8上,但是不是10.6和更早。即使是Apple的NSAlertTest也会受到影响。不幸的是,由于错误报告在本文发布时尚未解决,因此没有可行的解决方案,但我运行的少数测试已确认NSHelpManager完全忽略了我机器上的沙盒帮助plist。
答案 1 :(得分:2)
好吧,这个很混乱,但它与Xcode中的文件夹结构设置有关。这里有一些值得了解的事情:
如果您遵守上述规则,事情应该可以正常进行。在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标记。
然后我触及了这个愚蠢的想法:它做了很多工作,但如果你为每个锚创建一个单独的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,它可以工作!
如果有人像我这样与老鹰挣扎,我希望这对你有帮助!
答案 3 :(得分:0)
我遇到了同样的问题(主持人没有在我的应用程序帮助手册中工作)并在其他Apple应用程序的帮助书中做了一些探讨,特别是Safari。我在Safari应用程序的Safari.help包中的Info.plist中找到了这个有趣的条目:
<key>HPDBookIndexPath</key>
<string>search.helpindex</string>
我将其更改为与我应用的帮助包中的.helpindex文件的名称相匹配,并且锚点开始工作。