UTI "com.apple" в произвольном формате - PullRequest
0 голосов
/ 14 июня 2011

У меня есть приложение на основе документа с пользовательским форматом файла, UTI и такими настроенными так:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>extension</string>
        </array>
        <key>CFBundleTypeIconFile</key>
        <string>Icon</string>
        <key>CFBundleTypeName</key>
        <string>Custom Document</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSHandlerRank</key>
        <string>Default</string>
        <key>NSDocumentClass</key>
        <string>MyDocument</string>
    </dict>
</array>

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Custom Document</string>
        <key>UTTypeIconFile</key>
        <string>Icon</string>
        <key>UTTypeIdentifier</key>
        <string>com.mycompany.appname</string>
        <key>UTTypeReferenceURL</key>
        <string></string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>com.apple.ostype</key>
            <string>XXXX</string>
            <key>public.filename-extension</key>
            <array>
                <string>extension</string>
            </array>
        </dict>
    </dict>
</array>
<key>UTImportedTypeDeclarations</key>
<array/>

Что (я полагаю, исходя из того, что я прочитал) является правильным способомсделать это.За исключением случаев, когда я запускаю mdls для любых сохраненных файлов, UTI отображается в виде:

kMDItemContentType             = "com.apple.appname.document"

Это сбивает с толку, поскольку я буквально копировал и вставлял записи из списков примеров приложений, таких как TextEdit, iSpend иЭскиз, все безрезультатно.

Особенно важно, чтобы сохраненные документы имели правильный UTI, поскольку им нужен собственный генератор QuickLook, который опирается на правильный UTI.

Любая помощь очень ценится,Заранее спасибо.

1 Ответ

3 голосов
/ 14 июня 2011

Вы когда-нибудь делали следующее:

1) В какой-то момент тип UTI был com.apple.appname.document, и в то время вы создали пользовательский документ вашего типа в файловой системе.

3) Затем вы изменили настройки UTI в своем приложении.

4) Вы просматриваете информацию для файла, созданного на шаге 1, и этот файл не изменился с момента его создания?

Если это так, попробуйте использовать Терминал для touch рассматриваемого файла, чтобы вызвать его переиндексацию Spotlight, а затем по-другому взглянуть.

В противном случае может также помочь убедиться, что вы удалили все посторонние копии своего приложения и затем перестроили базу данных Launch Services (вы можете использовать для этого утилиту, которую я написал: Перестроить базу данных Launch Services .

В целом информация о вашем Info.plist в порядке, хотя я бы порекомендовал следующее:

  • В вашем UTExportedTypeDeclarations под UTTypeTagSpecification указывайте только OSType (код типа файла), если вы действительно знаете, что делаете. Это означает, что вы, конечно, не используете тип, подобный 'appe', который состоит из строчных букв, так как они зарезервированы для Apple. Я знаю, что вы были обязаны зарегистрировать коды создателей (CFBundleSignature s) в Apple (я сам сделал несколько), хотя я не уверен насчет типов файлов и того, делают ли они это до сих пор или нет. Если вы укажете какой-либо произвольный код типа файла и не будете знать, какие именно коды использовались за последние 30 лет, вы рискуете конфликтовать с существующими определенными типами.

  • Измените тип документа UTI, чтобы он был более специфичным для вашего типа. Что-то вроде com.mycompany.appname.extension.

Затем измените запись документа CFBundleDocumentTypes, удалив запись CFBundleTypeExtensions и добавив LSItemContentTypes, как показано ниже:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>LSItemContentTypes</key>
        <array>
              <string>com.mycompany.appname.extension</string>
        </array>
        <key>CFBundleTypeIconFile</key>
        <string>Icon</string>
        <key>CFBundleTypeName</key>
        <string>Custom Document</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSHandlerRank</key>
        <string>Default</string>
        <key>NSDocumentClass</key>
        <string>MyDocument</string>
    </dict>
</array>

Затем, наконец, убедитесь, что все ключи в вашем Info.plist не переопределяются локализованными версиями в файле InfoPlist.strings, если они у вас есть.

...