Jak powiązać typy plików z aplikacją iPhone?

W temacie kojarzenia aplikacji na iPhone ' a z typami plików.

W to pouczające pytanie dowiedziałem się, że aplikacje mogą być powiązane z niestandardowymi protokołami URL.

To było prawie rok temu i od tego czasu Apple wprowadziło "obsługę dokumentów", która idzie o krok dalej i pozwala aplikacjom kojarzyć się z typami plików. W dokumentacji wiele mówi się o tym, jak skonfigurować aplikację, aby uruchamiała inne odpowiednie aplikacje, gdy napotka nieznaną Typ pliku. Oznacza to, że skojarzenie nie działa po wyjęciu z pudełka dla żadnej aplikacji, podobnie jak protokół rejestracji adresu URL.

To prowadzi mnie do pytania: czy aplikacje systemowe takie jak Safari lub Mail zaimplementowały ten system do wyboru powiązanych aplikacji, czy też nic nie zrobią, jak wcześniej?

Author: Community, 2010-05-05

3 answers

Obsługa typów plików jest nowa w systemie iPhone OS 3.2 i różni się od istniejących już niestandardowych schematów URL. Możesz zarejestrować swoją aplikację w celu obsługi określonych typów dokumentów, a każda aplikacja korzystająca z kontrolera dokumentów może przekazać przetwarzanie tych dokumentów Twojej własnej aplikacji.

Na przykład moja aplikacja (dla której dostępny jest kod źródłowy) obsługujepdb i .pdb.typy plików gz, jeśli otrzymano je za pośrednictwem poczty e-mail lub w innym obsługiwanym podanie.

Aby zarejestrować wsparcie, musisz mieć coś takiego jak poniżej w swoich informacjach.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>

Dostarczane są dwa obrazy, które będą używane jako ikony dla obsługiwanych typów W Mail i innych aplikacjach mogących wyświetlać dokumenty. Klucz LSItemContentTypes umożliwia udostępnienie tablicy Uniform Type Identifiers (UTi), którą aplikacja może otworzyć. Lista identyfikatorów UTi zdefiniowanych przez system znajduje się w dokumencie Uniform Type Identifiers Reference firmy Apple. Jeszcze więcej szczegółów na UTIs można znaleźć w Uniform Type Identifiers Overview firmy Apple Uniform Type Identifiers Overview. Przewodniki te znajdują się w Mac developer center, ponieważ ta funkcja została przeniesiona na drugą stronę komputera Mac.

Jeden z UTI użyty w powyższym przykładzie był zdefiniowany systemowo, ale drugi był UTI specyficznym dla aplikacji. UTI specyficzne dla aplikacji będzie musiało zostać wyeksportowane, aby inne aplikacje w systemie mogły być o tym poinformowane. Aby to zrobić, możesz dodać sekcję do swoich informacji.plist jak po:

<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>

Ten konkretny przykład eksportuje com.sunsetlakesoftware.molecules.pdb UTI z .rozszerzenie pliku pdb, odpowiadające typowi MIME chemical/x-pdb.

Dzięki temu aplikacja będzie mogła obsługiwać dokumenty dołączone do wiadomości e-mail lub z innych aplikacji w systemie. W aplikacji Mail możesz stuknąć i przytrzymać, aby wyświetlić listę aplikacji, które mogą otworzyć dany załącznik.

Gdy załącznik zostanie otwarty, aplikacja zostanie uruchomiona i będziesz musiał obsłużyć przetwarzanie tego pliku w metodzie delegata aplikacji -application:didFinishLaunchingWithOptions:. Wygląda na to, że pliki załadowane w ten sposób z poczty są kopiowane do katalogu dokumentów aplikacji w podkatalogu odpowiadającym skrzynce pocztowej, do której dotarły. Możesz uzyskać adres URL tego pliku w metodzie delegat aplikacji, używając kodu w następujący sposób:

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

Zauważ, że jest to to samo podejście, którego użyliśmy do obsługi niestandardowych schematów URL. Adresy URL plików można oddzielić od innych według używając kodu jak poniżej:

if ([url isFileURL])
{
    // Handle file being passed in
}
else
{
    // Handle custom URL scheme
}
 397
Author: Brad Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-05 05:15:21

Oprócz doskonałej odpowiedzi Brada, dowiedziałem się, że (przynajmniej na iOS 4.2.1) podczas otwierania niestandardowych plików z aplikacji Mail, Twoja aplikacja nie jest uruchamiana lub powiadamiana, jeśli załącznik został otwarty wcześniej. Pojawia się okienko" Otwórz z...", ale nic nie robi.

To wydaje się być naprawione przez (ponowne)przeniesienie pliku z katalogu skrzynki odbiorczej. Bezpiecznym podejściem wydaje się być zarówno (ponowne) przenoszenie pliku podczas jego otwierania (w -(BOOL)application:openURL:sourceApplication:annotation:), jak i przechodzenie przez katalog Documents/ Inbox, usuwanie wszystkie pozycje, np. w applicationDidBecomeActive:. Ten ostatni catch-all może być potrzebny, aby aplikacja była ponownie w stanie czystym, na wypadek, gdyby poprzedni import spowodował awarię lub został przerwany.

 23
Author: mvds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-14 03:08:54

Duże Ostrzeżenie: upewnij się w stu procentach, że Twoje rozszerzenie nie jest już powiązane z jakimś typem mime.

Użyliśmy rozszerzenia".icz 'dla naszych niestandardowych plików dla, w zasadzie, nigdy, a Safari po prostu nigdy nie pozwoli Ci otworzyć je mówiąc" Safari nie może otworzyć tego pliku."bez względu na to, co zrobiliśmy lub próbowaliśmy z UT rzeczy powyżej.

W końcu zdałem sobie sprawę, że istnieją pewne funkcje UT * C, których możesz używać do odkrywania różnych rzeczy i podczas .icz daje właściwą odpowiedź (nasza app): {]}

W aplikacji załadować na górze, po prostu to zrobić...

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

I umieścić break po tej linii i zobaczyć, co to są UTI i ur-w naszym przypadku był to nasz identyfikator, jak chcieliśmy), a URL pakietu (ur) wskazywał na folder naszej aplikacji.

Ale typ MIME, który Dropbox daje nam z powrotem dla naszego linku, który możesz sprawdzić wykonując np.

$ 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

Typ treści jest tym, czego chcemy. Dropbox twierdzi, że jest to wpis tekstowy/kalendarzowy. Świetnie. Ale w moim przypadku, już próbowałem umieścić tekst/kalendarz do typów MIME mojej aplikacji, i nadal nie działa. Zamiast tego, gdy próbuję uzyskać adres URL UTI i bundle dla typu MIME text / calendar,

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

CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

Widzę " com.jabłko.ical.ics " jako UTI i ".../ MobileCoreTypes.bundle / " jako adres URL pakietu. Nie nasza aplikacja, ale Apple. Więc staram się umieścić com.jabłko.ical.ics do LSItemContentTypes obok moich własnych, i do Utcformsto w eksporcie, ale nie go.

Więc zasadniczo, jeśli Apple myśli, że chcą w pewnym momencie obsłużyć jakąś formę typu pliku (który może zostać utworzony 10 lat po uruchomieniu aplikacji, pamiętaj o tym), będziesz musiał zmienić rozszerzenie, ponieważ po prostu nie pozwolą Ci obsłużyć typu pliku.

 16
Author: Kalle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-24 20:56:37