2012-02-20 11 views
15

Istnieje aplikacja na iPhone'a "Another Mail Client", która powinna być w stanie otworzyć dowolny plik, aby wysłać go jako załącznik. Dlatego chcę powiązać tę aplikację z dowolnym plikiem z dowolnym rozszerzeniem.Jak powiązać aplikację na telefon iPhone z typem _every_?

Zgodnie z dokumentacją, powinniśmy zadeklarować obsługę plików z root-em typu UTI: public.data - każdy plik powinien należeć do tego typu. Działa, ale wcale nie. W takim przypadku nasza aplikacja nie będzie mogła otworzyć żadnego pliku, ale tylko te, które zostały już zarejestrowane w systemie. Na przykład, jeśli w dowolnej aplikacji (np. Dropbox) spróbujemy "otworzyć w ..." pliku o nieznanym rozszerzeniu (file.unknowntype) za pomocą UIDocumentInteractionController, to odpowiedź będzie negatywna, pomimo faktu, że już mamy zarejestrował naszą aplikację i obsługuje root UTI-type public.data. Ale jeśli zainstalujesz inną aplikację, która obsługuje pliki z rozszerzeniem (* .unknowntype), nasza aplikacja będzie również mogła otworzyć te pliki i pojawi się na liście aplikacji "otwórz w ...".

UPD: @Gabriel To CFBundleDocumentTypes częścią mojego Info.plist pliku:

<key>CFBundleDocumentTypes</key> 
<array> 
    <dict> 
     <key>CFBundleTypeName</key> 
     <string>MyMail</string> 
     <key>LSItemContentTypes</key> 
     <array> 
      <string>public.data</string> 
     </array> 
     <key>CFBundleTypeRole</key> 
     <string>Viewer</string> 
     <key>LSHandlerRank</key> 
     <string>Default</string> 
     <key>CFBundleTypeIconFiles</key> 
     <array> 
      <string>Icon29.png</string> 
      ... 
      <string>Icon114.png</string> 
     </array> 
    </dict> 
</array> 
+0

Proszę, pokaż nam część CFBundleDocumentTypes twojego pliku info.plist. – Gabriel

Odpowiedz

2

Zrobiłem aplikację z następującej konfiguracji

<key>CFBundleDocumentTypes</key> 
<array> 
    <dict> 
     <key>CFBundleTypeIconFiles</key> 
     <array/> 
     <key>CFBundleTypeName</key> 
     <string>name</string> 
     <key>LSItemContentTypes</key> 
     <array> 
      <string>public.data</string> 
     </array> 
    </dict> 
</array> 

Kiedy próbuję otworzyć a .pdf z Safari, ta aplikacja pojawia się na liście "otwórz w ...". Czy możesz zrobić przykładową aplikację i spróbować?

UPD:

Wydaje się roszczenia „public.data” (próbował również public.item, public.content) oznacza plik, który należy ustawić „wszystkie znane ZUM systemu”, a nie dowolny plik. Będziesz w stanie obsłużyć numer 99% of files, który użytkownicy chcą wysyłać pocztą e-mail, ale nie wszystkie. Innym sposobem byłoby wyeksportowanie UTI, które uważasz za ważne, ale które nie są domyślnie w systemowych UTI.

+0

System obsługuje domyślnie format PDF, więc jest OK. Spróbuj otworzyć plik z nieznanym rozszerzeniem (np. * .unknowntype). – ddnv

0

Przyjacielu, dobrze przeczytałem twoje pytanie przed wysłaniem odpowiedzi. Dałam kolejną myśl, że będziesz miał zestaw już znanych "dowolnych typów" plików do rejestracji zbiorczej. Jednak chcesz dynamicznie dostosowywać swoją aplikację do rejestrowania dowolnego typu pliku przydzielonego do aplikacji w przyszłości i sprawić, że będzie można ją dołączyć. Z tego co wiem, nie możesz sprawić, że aplikacja będzie obsługiwać wszystkie nieznane typy plików. Pozwól mi wyjaśnić, co się dzieje,

  1. Załóżmy, zrób APP1 aplikacja to nie wie o .xyz rozszerzenia pliku i zainstalować go na iPhone.

  2. Ale później opracowuję kolejną aplikację APP2, która zawiera powyższy kod i rejestruję typ .XYZ z APP2 w dowolnym telefonie iPhone, który instaluje.

  3. Tak, powiedzmy, że instaluję APP2 na Twoim iPhonie, mając APP1. A kiedy uruchomi się moja aplikacja, rozszerzenie .XYZ (znane z wyprzedzeniem APP2) zostanie zarejestrowane w telefonie iPhone.

To jest powód, dla którego teraz aplikacja APP1 może używać tego pliku .XYZ w zaskakujący sposób.

Podsumowując, przed uruchomieniem aplikacji trzeba znać określony typ rozszerzeń.

Jednak istnieje możliwość rozwiązania tego problemu.

Rozwiązanie:

  1. Zdecyduj maksymalną liczbę znaków, które mają wspierać w extenstion. Powiedzmy, że 4.

  2. Teraz możesz wykonać małą rutynę Brute-Force, aby uruchomić ją w swojej aplikacji, aby utworzyć wszystkie możliwe kombinacje znaków i zarejestrować je wszystkie. Powinno to uczynić dowolny plik z rozszerzeniem do 4 znaków dołączanych do poczty.

Mam nadzieję, że powinienem załatwić sprawę.

Powodzenia!

+0

Czy na pewno chcesz polecić brutalne wymuszenie 4 postaci? To spowoduje 456976 rejestracji! To prawie 96 MB danych plist według przykładu z [fspirit's answer] (http://stackoverflow.com/a/9432862/1608468)! – tomsmeding

0

Pomysł na badania ...

Jeśli instalacja innej aplikacji „poprawek” problemu spróbuj sprawdzając inne aplikacje Info.plist plik, aby zobaczyć, czy jest on rejestracji lub eksportowania jakieś ciekawe UTI s lub podobny ustawienia.

Wygląda na to, że Twoja aplikacja może wykonywać tylko połowę zlecenia, a inna aplikacja kończy brakujące ustawienia.

Można sprawdzić zawartość w pliku apps ipa z iTunes kopiując go, zmiana nazwy ipa do zip wyodrębnianie zawartości, a następnie Show Package Contents od wewnątrz aplikacji.

Powiązane problemy