2013-01-23 38 views
6

Tôi đang làm việc trên ứng dụng iOS cho phép xuất dữ liệu của mình bằng cách gửi email một tệp. Ứng dụng đăng ký loại tệp dưới dạng tệp có phần mở rộng 'sainputs' (điều này để ứng dụng cũng có thể mở tệp từ email hoặc dropbox để nhập các giá trị - điều này hoạt động tốt). Tôi đang cố gắng thêm khả năng gửi tệp cho bất kỳ ứng dụng nào khác có thể mở các loại tệp linh tinh khác. Dropbox là một ví dụ hay - nó được cho là có thể mở bất kỳ loại tệp nào.iOS: lỗi khi gửi tệp ứng dụng cụ thể tới Dropbox bằng cách sử dụng UIDocumentInteractionController

Tôi hiện đang cố gắng điều này bằng cách hiển thị UIDocumentInteractionController được khởi tạo với URL của tệp. Khi nó được hiển thị, ứng dụng Dropbox xuất hiện như một trong những lựa chọn có sẵn để mở tệp, như mong đợi.

Tuy nhiên, khi tôi bấm vào biểu tượng Dropbox, không có gì xảy ra và trong giao diện điều khiển tôi thấy văn bản sau đây:

LaunchServices: Invalid LSOpenOperation request - No applications found to open document 

Trong file plist của ứng dụng đó đăng ký một loại tài liệu có UTI com.mycompany.myapp. sainputs, và nó đăng ký một loại UTI đã xuất có mã định danh com.mycompany.myapp.sainputs, với phần mở rộng tên tệp công khai 'sainputs' và MIME-type myapp/input.

Sau đây là các trích đoạn có liên quan từ các tập tin plist:

<key>CFBundleDocumentTypes</key> 
    <array> 
     <dict> 
      <key>CFBundleTypeName</key> 
      <string>My App's File Type</string> 
      <key>LSHandlerRank</key> 
      <string>Owner</string> 
      <key>LSItemContentTypes</key> 
      <array> 
       <string>com.mycompany.myapp.sainputs</string> 
      </array> 
     </dict> 
     <array> 
. 
. 
. 
<key>UTExportedTypeDeclarations</key> 
    <array> 
     <dict> 
      <key>UTTypeConformsTo</key> 
      <array/> 
      <key>UTTypeDescription</key> 
      <string>My App's File Type</string> 
      <key>UTTypeIdentifier</key> 
      <string>com.mycompany.myapp.sainputs</string> 
      <key>UTTypeTagSpecification</key> 
      <dict> 
       <key>public.filename-extension</key> 
       <string>sainputs</string> 
       <key>public.mime-type</key> 
       <string>steuerapp/inputs</string> 
      </dict> 
     </dict> 
     <array> 

tôi đã cố gắng thay đổi MIME-type để 'application/octet-stream' trong file plist. Nó không tạo ra sự khác biệt.

Mọi lời khuyên/ý tưởng sẽ được đánh giá cao.

+2

Cung cấp giá trị cho khóa 'UTTypeConformsTo'. Có lẽ 'public.data' sẽ hoạt động. – rmaddy

+0

Cảm ơn bạn rmaddy! Điều đó đã làm các trick! Vui lòng đăng câu trả lời này làm câu trả lời, vì vậy tôi có thể đánh dấu câu trả lời đó là câu trả lời chính xác. – bgh

Trả lời

5

Khi @maddy đề xuất và @bgh xác nhận, điều này giải quyết được vấn đề. Tôi chỉ chạy vào cùng một vấn đề.

Bên cạnh việc xác định Loại phổ quát tùy chỉnh, bạn cũng có thể gợi ý rằng loại này là 'loại phụ' của loại chung hơn. Ví dụ. bằng cách xác định một cách rõ ràng UTI 'public.data' trong UTTypeConformsTo chủ chốt như sau:

<dict> 
    <key>UTTypeConformsTo</key> 
     <array> 
     <string>public.data</string> 
     </array> 
    <key>UTTypeDescription</key> 
     <string>My App's File Type</string> 
    <key>UTTypeIdentifier</key> 
     <string>com.mycompany.myapp.sainputs</string> 
    <key>UTTypeTagSpecification</key> 
     <dict> 
     <key>public.filename-extension</key> 
      <string>sainputs</string> 
     <key>public.mime-type</key> 
      <string>steuerapp/inputs</string> 
     </dict> 
</dict> 

Sau đó bạn có thể chỉ định uti tùy chỉnh của bạn như là một cuộc tranh cãi trong UIDocumentInteractionController:

UIDocumentInteractionController *documentController = ...; 
documentController.UTI = @"com.mycompany.myapp.sainputs"; 

Apples documentation about this can be found here.

0

Trong trường hợp điều này xảy ra với người khác:

tôi không thể trả lời câu hỏi của Klaas vì tôi đã có một ứng dụng khác trên devi ce (phiên bản "ánh sáng") cũng khai báo cùng một UTI, với cài đặt không chính xác. Bạn cần thêm "public.data" vào mọi ứng dụng tuyên bố loại trước khi nó có thể hoạt động.

Để đảm bảo, tôi khuyên bạn nên gỡ lỗi chỉ với một ứng dụng được cài đặt, sau đó thêm một ứng dụng khác và xem liệu mọi thứ vẫn hoạt động.

Các vấn đề liên quan