UIDocumentInteractionController, No File Extension but UTI

Как отправить файл в другое приложение, зная, какой UTI поддерживает приложение? Допустим, у файла нет расширения, но я случайно знаю UTI файла.

Я попробовал следующее:

// target is a NSURL with the location of the extension less file on the system
// knownUTI is a NSString containing the UTI of the file 
    UIDocumentInteractionController* dic = [UIDocumentInteractionController interactionControllerWithURL:target];  
    [dic retain];

    dic.delegate = self;
    dic.UTI = knownUTI; 
    [dic presentOpenInMenuFromRect:CGRectZero inView:superController.view animated:YES]

Он показывает поддерживаемое приложение, однако, если я выбираю его, оно не переключает приложение. Делегат вызывает

- (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application

но

- (void)documentInteractionController:(UIDocumentInteractionController *)controller didEndSendingToApplication:(NSString *)application

никогда не вызывается и приложение не переключается.

Целевое приложение экспортирует свой UTI следующим образом:

    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeIconFiles</key>
            <array/>
            <key>CFBundleTypeName</key>
            <string>Migration DocType</string>
            <key>CFBundleTypeRol</key>
            <string>Shell</string>
            <key>LSHandlerRank</key>
            <string>Owner</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>com.mycomp.customstring</string>
            </array>
        </dict>
    </array>

...

<key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeConformsTo</key>
            <array>
                <string>public.data</string>
            </array>
            <key>UTTypeDescription</key>
            <string>My custom UTI</string>
            <key>UTTypeIdentifier</key>
            <string>com.mycomp.customstring</string>
        </dict>
    </array>

Поскольку это не сработало, я также попробовал добавить пользовательское расширение. Тем не менее, этот способ не сработал. При добавлении пользовательского расширения в файл я передаю DocumentInteractionController и он работает. Однако в списке приложений отображаются все другие приложения, поддерживающие то же расширение файла, независимо от типа UTI, который я предоставляю.

Скажем, я объявляю 2 UTI в двух разных приложениях:

App1 with UTI1: com.mycomp.a  with extension .abc
App2 with UTI2: com.mycomp.b  with extension .abc

При передаче файла DocumentInteractionController и установке UTI на com.mycomp.a он также покажет App2 как возможное приложение, способное обработать файл.

Я определил UTI с расширением следующим образом:

<key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeConformsTo</key>
            <array>
                <string>public.data</string>
            </array>
            <key>UTTypeDescription</key>
            <string>My UTI Type</string>
            <key>UTTypeIdentifier</key>
            <string>com.mycomp.a</string>
            <key>UTTypeTagSpecification</key>
            <dict>
                <key>public.filename-extension</key>
                <string>abc</string>
                <key>public.mime-type</key>
                <string>application/abc</string>
            </dict>
        </dict>
    </array>

Буду очень признателен за помощь, я немного застрял. Итак, снова вопрос: Как мне отправить файл в приложение с известным UTI либо без расширения, либо с тем же расширением, что и другие файлы, которые я не хочу показывать приложениям в качестве выбора в DocumentInteractionController?

Спасибо

7
задан Jan 13 December 2011 в 17:49
поделиться