Как связать типы файлов с приложением iPhone? - PullRequest
317 голосов
/ 05 мая 2010

Об ассоциации приложения iPhone с типами файлов.

В этом информативном вопросе я узнал, что приложения могут быть связаны с пользовательскими протоколами URL.

Это было почти год назад, и с тех пор Apple представила «Поддержка документов», которая делает шаг вперед и позволяет приложениям связываться с типами файлов. В документации много говорится о том, как настроить приложение для запуска других соответствующих приложений, когда оно встречает неизвестный тип файла. Это означает, что ассоциация не работает "из коробки" ни для какого приложения, как при регистрации протокола URL.

Это приводит меня к вопросу: внедрили ли эту систему системные приложения, такие как Safari или Mail, для выбора связанных приложений, или они ничего не будут делать, как раньше?

Ответы [ 3 ]

401 голосов
/ 06 мая 2010

Обработка типов файлов впервые появилась в iPhone OS 3.2 и отличается от уже существующих пользовательских схем URL. Вы можете зарегистрировать свое приложение для обработки определенных типов документов, и любое приложение, использующее контроллер документов, может передать обработку этих документов в ваше собственное приложение.

Например, мое приложение Молекулы (для которого доступен исходный код) обрабатывает типы файлов .pdb и .pdb.gz, если они получены по электронной почте или в другом поддерживаемом приложении.

Чтобы зарегистрировать поддержку, вам нужно иметь что-то вроде следующего в вашем Info.plist:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeIconFiles</key>
        <array>
            <string>Document-molecules-320.png</string>
            <string>Document-molecules-64.png</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Molecules Structure File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.sunsetlakesoftware.molecules.pdb</string>
            <string>org.gnu.gnu-zip-archive</string>
        </array>
    </dict>
</array>

Предоставляются два изображения, которые будут использоваться в качестве значков для поддерживаемых типов в Почте и других приложениях, способных отображать документы. Клавиша LSItemContentTypes позволяет вам предоставить массив унифицированных идентификаторов типов (UTI), которые может открыть ваше приложение. Список системных UTI см. В справочнике по унифицированным идентификаторам типов Apple . Еще больше подробностей об UTI можно найти в Apple Обзор унифицированных идентификаторов типов . Эти руководства находятся в центре разработчиков Mac, поскольку эта возможность перенесена с Mac.

Один из UTI, использованных в приведенном выше примере, был системным, а другой - UTI для конкретного приложения. Специфичный для приложения UTI необходимо будет экспортировать, чтобы другие приложения в системе могли знать об этом. Для этого вы должны добавить раздел в ваш Info.plist, как показано ниже:

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.plain-text</string>
            <string>public.text</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Molecules Structure File</string>
        <key>UTTypeIdentifier</key>
        <string>com.sunsetlakesoftware.molecules.pdb</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <string>pdb</string>
            <key>public.mime-type</key>
            <string>chemical/x-pdb</string>
        </dict>
    </dict>
</array>

Этот конкретный пример экспортирует com.sunsetlakesoftware.molecules.pdb UTI с расширением файла .pdb, соответствующим типу MIME chemical/x-pdb.

С этим приложением ваше приложение сможет обрабатывать документы, прикрепленные к электронным письмам или из других приложений в системе. В Mail вы можете нажать и удерживать, чтобы открыть список приложений, которые могут открывать определенное вложение.

Когда вложение будет открыто, ваше приложение будет запущено, и вам нужно будет обработать этот файл с помощью метода делегата приложения -application:didFinishLaunchingWithOptions:. Похоже, что файлы, загруженные таким образом из Mail, копируются в каталог документов вашего приложения в подкаталоге, соответствующем тому, в какой ящик электронной почты они пришли. Вы можете получить URL-адрес этого файла в методе делегата приложения, используя следующий код:

NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];

Обратите внимание, что это тот же подход, который мы использовали для обработки пользовательских схем URL. Вы можете отделить URL-адреса файлов от других, используя код, подобный следующему:

if ([url isFileURL])
{
    // Handle file being passed in
}
else
{
    // Handle custom URL scheme
}
24 голосов
/ 26 июня 2011

В дополнение к отличному ответу Брэда, я обнаружил, что (по крайней мере, на iOS 4.2.1) при открытии пользовательских файлов из приложения Mail ваше приложение не запускается и не уведомляется, если вложение было открыто ранее. Появляется всплывающее окно «открыть с помощью…», но оно ничего не делает.

Это, кажется, исправлено (пере) перемещением файла из папки «Входящие». Безопасный подход, по-видимому, состоит в том, чтобы (пере) переместить файл при его открытии (в -(BOOL)application:openURL:sourceApplication:annotation:), а также пройти через каталог Documents / Inbox, удалив все элементы, например, в applicationDidBecomeActive:. Этот последний универсальный запрос может понадобиться для того, чтобы снова привести приложение в чистое состояние, если предыдущий импорт вызывает сбой или прерывается.

17 голосов
/ 24 мая 2013

БОЛЬШОЕ ПРЕДУПРЕЖДЕНИЕ: убедитесь, что на ОДНОМ ПРОЦЕНТЕ ваше расширение не привязано к какому-либо типу MIME.

Мы использовали расширение '.icz' для наших пользовательских файлов, в основном, когда-либо, и Safari простоникогда не позволю вам открыть их, говоря: «Safari не может открыть этот файл».независимо от того, что мы делали или пробовали с UT выше.

В конце концов я понял, что есть некоторые функции UT * C, которые вы можете использовать для изучения различных вещей, и хотя .icz дает правильный ответ (наше приложение):

В приложении загрузилась сверху, просто сделайте это ...

NSString * UTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, 
                                                                   (CFStringRef)@"icz", 
                                                                   NULL);
CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

и поставьте разрыв после этой строки и посмотрите, что такое UTI и ur - в нашем случае это былонаш идентификатор, как мы хотели), а URL-адрес пакета (ur) указывал на папку нашего приложения.

Но MIME-тип, который Dropbox возвращает нам для нашей ссылки, которую вы можете проверить, выполнив, например,

$ curl -D headers THEURLGOESHERE > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 27393  100 27393    0     0  24983      0  0:00:01  0:00:01 --:--:-- 28926
$ cat headers
HTTP/1.1 200 OK
accept-ranges: bytes
cache-control: max-age=0
content-disposition: attachment; filename="123.icz"
Content-Type: text/calendar
Date: Fri, 24 May 2013 17:41:28 GMT
etag: 872926d
pragma: public
Server: nginx
x-dropbox-request-id: 13bd327248d90fde
X-RequestId: bf9adc56934eff0bfb68a01d526eba1f
x-server-response-time: 379
Content-Length: 27393
Connection: keep-alive

Content-Type - это то, что мы хотим.Dropbox утверждает, что это текстовая / календарная запись.Отлично.Но в моем случае я уже пробовал помещать текст / календарь в типы mime моего приложения, и он все еще не работает.Вместо этого, когда я пытаюсь получить UTI и URL-адрес пакета для mimetype текста / календаря,

NSString * UTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,
                                                                   (CFStringRef)@"text/calendar", 
                                                                   NULL);

CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

я вижу "com.apple.ical.ics" как UTI и "... / MobileCoreTypes.bundle / "в качестве URL пакета.Не наше приложение, а Apple.Поэтому я пытаюсь поместить com.apple.ical.ics в LSItemContentTypes вместе с моим собственным, и в UTConformsTo при экспорте, но не могу.

Таким образом, если Apple считает, что в какой-то момент они хотят обработать некоторую форму типа файла (которая может быть создана через 10 лет после того, как ваше приложение работает, учтите), вам придется изменить расширение, потому что они 'Я просто не позволю вам обработать тип файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...