Добавление опции "Открыть в..." в приложение iOS

На устройствах iOS почтовое приложение предлагает опцию "Открыть в..." для вложений. Перечисленные приложения зарегистрировали свои CFBundleDocumentTypes в ОС. Что меня интересует, так это то, как мое приложение позволяет пользователям открывать файлы, созданные моим приложением, в других приложениях. Является ли Mail единственным приложением, которое предоставляет эту функцию?

4 ответа

Решение

Ознакомьтесь с разделами " Программирование взаимодействия с документами для iOS": регистрация типов файлов, поддерживаемых вашим приложением.

Пока вы предоставляете свои типы документов в своем Info.plist, другие приложения, которые распознают этот тип документа, будут перечислять ваше приложение в качестве "открытых". Конечно, это предполагает, что ваше приложение создает документы, которые могут открывать другие приложения.

Это отличный урок, который мне помог.

Я добавил поддержку для *.xdxf файлы в моем приложении. Короче говоря, вы должны сделать две вещи. Сначала - добавьте подобные записи в приложение Plist файл:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>XDXF Document</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.alwawee.xdxf</string>
        </array>
    </dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeDescription</key>
        <string>XDXF - XML Dictionary eXchange Format</string>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.text</string>
        </array>
        <key>UTTypeIdentifier</key>
        <string>com.alwawee.xdxf</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <string>xdxf</string>
            <key>public.mime-type</key>
            <string>text/xml</string>
        </dict>
    </dict>
</array>

Здесь вы должны добавить UTExportedTypeDeclarations только если ваш тип файла уникален. Или другими словами не здесь.

Второе - обработать метод делегата в AppDelegate:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{

    if (url != nil && [url isFileURL]) {

        //  xdxf file type handling

        if ([[url pathExtension] isEqualToString:@"xdxf"]) {

            NSLog(@"URL:%@", [url absoluteString]);

        }

    }

    return YES;
}

Чтобы быть видимым в списке "открыть в..." для всех файлов, необходимо добавить это в свой список

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>Open All Files</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSItemContentTypes</key>
        <array>
           <string>public.content</string>
           <string>public.data</string>
        </array>
    </dict>
</array>

Как только ваше приложение отобразится в "open in...", вам нужно загрузить этот файл. Большинство веб-сайтов показывает, чтобы реализовать эту функцию:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool
{
   println("Open URL "+url.path!)
}

Но эта функция, которая хорошо работала в IOS 7, вылетает в IOS 8. Мне пришлось реализовать следующую функцию, чтобы заставить ее работать.

func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool 
{
   println("Open URL "+url.path!)
}

Я успешно добавляю свое приложение в список "Открыть в" следующим образом:

Выберите информацию в YourAppName.target Добавьте новый фильтр типов документов, имя которого - это все, что вам нужно, и тип определяется в https://developer.apple.com/library/ios/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html

Надеюсь, у тебя тоже получится!

Тем не менее, я хочу реализовать функцию "Поделиться", как это делают Facebook или Slack, я не могу сделать это до сих пор... любой может дать мне большую руку:(

Другие вопросы по тегам