Обработка типов файлов впервые появилась в iPhone OS 3.2 и отличается от уже существующих пользовательских схем URL. Вы можете зарегистрировать свое приложение для обработки определенных типов документов, и любое приложение, использующее контроллер документов, может передать обработку этих документов в ваше собственное приложение.
Например, приложение Molecules (для которого доступен исходный код) обрабатывает типы файлов .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 см. В Справочнике по унифицированным идентификаторам типов 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
}
-application:didFinishLaunchingWithOptions:
в приложении делегат вызывается только в том случае, если ваше приложение не было фоновым, когда оно открыто для обработки файла.- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
также на iOS 4+В дополнение к отличному ответу Брэда, я обнаружил, что (по крайней мере на iOS 4.2.1) при открытии пользовательских файлов из приложения «Почта» ваше приложение не запускается и не уведомляется, если вложение было открыто ранее. Появляется всплывающее окно «открыть с помощью…», но ничего не происходит.
Это, кажется, исправлено путем (пере) перемещения файла из папки «Входящие». Безопасный подход, по-видимому, заключается в том, чтобы (пере) переместить файл при его открытии (в
-(BOOL)application:openURL:sourceApplication:annotation:
), а также пройти через каталог Documents / Inbox, удалив все элементы, например, вapplicationDidBecomeActive:
. Этот последний универсальный запрос может понадобиться для того, чтобы снова привести приложение в чистое состояние, если предыдущий импорт вызывает сбой или прерывается.источник
-(BOOL)application:openURL:sourceApplication:annotation:
всегда вызывается, даже для вложений, которые уже были открыты. Каждый раз, когда вложение открывается, к имени файла добавляется суффикс, который увеличивается до уникального - test.text, test-1.txt, test-2.txt и т. Д.БОЛЬШОЕ ПРЕДУПРЕЖДЕНИЕ: Убедитесь, что ОДИН СТОЛЕНТНЫЙ ПРОЦЕНТ уверен, что ваш добавочный номер еще не привязан к какому-либо типу пантомимы.
В основном, мы использовали расширение «.icz» для наших пользовательских файлов, и Safari просто никогда не позволил бы вам открыть их, говоря: «Safari не может открыть этот файл». независимо от того, что мы сделали или попробовали с UT выше.
В конце концов я понял, что есть некоторые функции UT * C, которые вы можете использовать для изучения различных вещей, и в то время как .icz дает правильный ответ (наше приложение):
В приложении загрузился сверху, просто сделайте это ...
и поместите break после этой строки и посмотрите, что такое UTI и ur - в нашем случае это был наш идентификатор, как мы и хотели), а пакетный url (ur) указывал на папку нашего приложения.
Но MIME-тип, который Dropbox возвращает нам для нашей ссылки, которую вы можете проверить, выполнив, например,
Content-Type - это то, что мы хотим. Dropbox утверждает, что это текстовая / календарная запись. Отлично. Но в моем случае я уже пробовал помещать текст / календарь в типы пантомимы моего приложения, и он все еще не работает. Вместо этого, когда я пытаюсь получить UTI и пакетный URL для типа mimetype text / calendar,
Я вижу "com.apple.ical.ics" в качестве UTI и "... / MobileCoreTypes.bundle /" в качестве URL пакета. Не наше приложение, а Apple. Поэтому я пытаюсь поместить com.apple.ical.ics в LSItemContentTypes вместе с моим собственным, и в UTConformsTo при экспорте, но не могу.
В общем, если Apple думает, что в какой-то момент они захотят обработать некоторую форму типа файла (которая может быть создана через 10 лет после того, как ваше приложение будет работать, учтите), вам придется изменить расширение, потому что они просто не позволят вам обрабатывать тип файла.
источник
Чтобы иметь дело с файлами любого типа для моего собственного приложения, я использую эту конфигурацию для CFBundleDocumentTypes:
источник