2012-10-07 18 views
8

iOSアプリケーションの排他的なUTIタイプを作成/エクスポートしようとしています(InstagramがUTI com.instagram.exclusivegramを排他的に処理する方法とよく似ています)。排他的iOS UTI

基本的に、com.photoapp.photoは、写真を撮るために登録された任意のアプリで写真を開くことができるようにするには、アプリが使用できるものにします(Instagramのcom.instagram.photoに似ています)。次に、com.photoapp.exclusiveを私のアプリケーションでのみ開くことができるようにします(com.instagram.exclusivegramに似ています)。

com.photoapp.exclusiveを使用していても、UIDocumentControllerはPhotoAppまたはDropBoxのいずれかで開くように要求します。ここでPhotoAppだけにする必要があります。

私はUTIと私が開封能力をチェックするために使用しているサンプルアプリケーションを登録する私のアプリを持っています。私は例のアプリで使用しているコードは以下の通りです:できるだけ早く、次のようなUTIを指定するよう

<key>UTExportedTypeDeclarations</key> 
<array> 
    <dict> 
     <key>UTTypeDescription</key> 
     <string>Exclusive PhotoApp Photo</string> 
     <key>UTTypeConformsTo</key> 
     <array> 
      <string>com.photoapp.photo</string> 
     </array> 
     <key>UTTypeIdentifier</key> 
     <string>com.photoapp.exclusive</string> 
     <key>UTTypeTagSpecification</key> 
     <dict> 
      <key>public.filename-extension</key> 
      <string>pae</string> 
     </dict> 
    </dict> 
    <dict> 
     <key>UTTypeTagSpecification</key> 
     <dict> 
      <key>public.filename-extension</key> 
      <string>pa</string> 
     </dict> 
     <key>UTTypeIdentifier</key> 
     <string>com.photoapp.photo</string> 
     <key>UTTypeDescription</key> 
     <string>PhotoApp Photo</string> 
     <key>UTTypeConformsTo</key> 
     <array> 
      <string>public.png</string> 
      <string>public.jpeg</string> 
     </array> 
    </dict> 
</array> 
<key>UIFileSharingEnabled</key> 
<true/> 
<key>CFBundleDocumentTypes</key> 
<array> 
    <dict> 
     <key>LSItemContentTypes</key> 
     <array> 
      <string>com.photoapp.exclusive</string> 
      <string>com.photoapp.photo</string> 
     </array> 
     <key>CFBundleTypeName</key> 
     <string>Photo</string> 
     <key>LSHandlerRank</key> 
     <string>Default</string> 
    </dict> 
</array> 
+1

ファイル形式が 'public.png'や' public.jpeg'などに準拠するように指定するとすぐに、これらのUTIファイルを開くことができるように指定したすべてのアプリケーションで開くことができます。 'UTTypeConformsTo'配列を削除すると、問題が解決されます。 – Greg

+1

つまり、 'com.photoapp.exclusive'が' com.photoapp.photo'に準拠していると指定しないでください。 'com.photoapp.photo'のままにしておき、' com.photoapp.exclusive'に準拠しないようにしてください。 – Greg

+0

ありがとう!私はあなたの答えを受け入れることができるようにコメントしたいですか? – joshholat

答えて

5

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"photoapp://"]]) { 
     NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"derp.png"], 1.0); 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *fullPathToFile = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"photoapp.pae"]; 
     [imageData writeToFile:fullPathToFile atomically:NO]; 

     interactionController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"file://%@", fullPathToFile]]]; 
     interactionController.UTI = @"com.photoapp.exclusive"; 
     interactionController.delegate = self; 

     [interactionController presentOpenInMenuFromRect:self.view.frame inView:self.view animated:YES]; 
    } 

そして、ここでは、私は私のアプリのための私のplistファイルに持っているものですpublic.pngまたはpublic.jpegの場合、これらのタイプのファイルを開くことができることを指定するすべてのアプリケーションは、ファイルを開くことができます。そのため、UTIのcom.photoapp.exclusive UTIでタイプの適合性を一切指定していない場合、それをサポートするアプリケーションは表示されません。