My app is not showing up in Share Sheet - swift

I integrated share extension in my application. This is my plist file for share extensions.
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<string>TRUEPREDICATE</string>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
I am receiving warning in Xcode that if I use Truepredicate then apple will reject my application. So I tried adding other activation rule as mentioned below
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
But if I remove Truepredicate and add above rules my share extension does not show any more. With truepredicate share extensions works perfectly fine.
Can anyone help me what should I do here?
I had integrated share extensions for music related apps.

There was mistake in My Plist file that's why was facing such issue.
Posting this answer just because may be in future if someone will do such mistake so my answer could help out!
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
This is working perfectly fine!

You have to wrap your new keys such as NSExtensionActivationSupportsWebURLWithMaxCount
inside a dictionary tag.
Put this back in your code:,
NSExtensionActivationRule, this key needs to reference the dictionary of new keys.
I don't write apps for ios, so I'm not sure why <string>TRUEPREDICATE</string> is the default. I just know it allows all data types to be passed implicitly. Data types must be explicitly as shown below.
Example:
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<integer>0</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>0</integer>
<key>NSExtensionActivationSupportsText</key>
<false/>
</dict>
<key>NSExtensionPointName</key>
<string>com.apple.ui-services</string>
<key>NSExtensionPointVersion</key>
<string>1.0</string>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.ui-services</string>

Related

Why can't I register my iOS application to handle the image file type?

I have a problem registering image file types to my application. I tried adding the code below to my plist but nothing happens.
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>Scary Bug Document</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>CFBundleTypeRole</key>
<string>None</string>
<key>LSItemContentTypes</key>
<array>
<string>public.image</string>
</array>
</dict>
</array>
I noticed that I can register for other file types, such as text (changing the public.image to public.text) but it just won't work with images (the "Open In .." menu is not showing my app).
What could be causing this, and how could I fix it?
It is now possible to open images from the mail app in iOS 7, it's just somewhat convoluted:
Tap and hold the image.
Tap on Quick Look so the image goes fullscreen.
Tap the image to show the top toolbar.
Tap the open in button at the top right.
Scroll the list to the left to find your app.
Be sure to set up your bundle document types for the image types you are interested in.
Dimitri Bouniol response that it works in iOS 7 via quick look is correct.
The following additions to my in info.plist below are how I got it to work for my app.
Still have not figured out how to get share in photos or camera roll to work.
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>myapp image</string>
</array>
<key>CFBundleTypeName</key>
<string>public.png</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.png</string>
<string>public.jpeg</string>
</array>
</dict>
</array>
<key>UTImportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.image</string>
</array>
<key>UTTypeIdentifier</key>
<string>public.png</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>com.apple.ostype</key>
<string>PNG</string>
<key>public.filename-extension</key>
<array>
<string>png</string>
</array>
<key>public.mime-type</key>
<string>image/png</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>public.jpeg</string>
<key>UTTypeReferenceURL</key>
<string>http://www.w3.org/Graphics/JPEG/</string>
<key>UTTypeDescription</key>
<string>JPEG image</string>
<key>UTTypeIconFile</key>
<string>public.jpeg.icns</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.image</string>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>com.apple.ostype</key>
<string>JPEG</string>
<key>public.filename-extension</key>
<array>
<string>jpeg</string>
<string>jpg</string>
</array>
<key>public.mime-type</key>
<string>image/jpeg</string>
</dict>
</dict>
</array>
Try:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>Scary Bug Document</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>CFBundleTypeRole</key>
<string>None</string>
<key>LSItemContentTypes</key>
<array>
<string>public.png</string>
<string>public.jpg</string>
</array>
</dict>
</array>
Also, see this other answer on StackOverflow
After doing a bit of research it seems that is not possible to register the app for images.
Thanks for your answers.
public.image is an abstract type, try registering for public.png or public.jpeg etc
Per Apple's documentation, "to add the document type do the following:
Click on the disclosure button for Document Types to open the document types.
In the “Types” section fill in the UTI for the new type.
For the key value type: CFBundleTypeRole.
For the value type: Editor.
For the key value type: LSHandlerRank.
For the value type: Owner."
This works for me using public.image as the UTI.
OS will not allow you to open images in your app. I also tried myself a lot of permutation & combination, and confirmed from a few more posts in Apple Support.

Opening flex application from mail's attachment in iOS

I've read this post which is really helpful. However I'm trying to open attachments in flex application. Is it possible? Any experience about that?
<iPhone>
<InfoAdditions><![CDATA[
<key>UIApplicationExitsOnSuspend</key>
<true/>
<key>UIDeviceFamily</key>
<array>
<string>1</string>
<string>2</string>
</array>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>iconsMobile/app32.png</string>
<string>iconsMobile/app128.png</string>
</array>
<key>CFBundleTypeName</key>
<string>File Type Name</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.filename.ext</string>
<string>com.filename.ext2</string>
<string>org.gnu.gnu-zip-archive</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>File Type Name</string>
<key>UTTypeIdentifier</key>
<string>com.instacoll.mockups.lmp</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>ext</string>
<string>ext1</string>
</array>
<key>public.mime-type</key>
<string>application/octet-stream</string>
</dict>
</dict>
</array>
]]></InfoAdditions>
<requestedDisplayResolution>high</requestedDisplayResolution>
</iPhone>
Add this to application xml and replace the ext to your extension it will work..
i add this with multiple extension support if want use ext1 also else remove that entry.
I don't think you can install an app from an email attachment and Flash isn't installed on the iPhone. So essentially, no, you can't open a Flex app from an email attachment.
Thanks, but I've found what I was looking for here:
http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html#WS901d38e593cd1bac6c9d409a12e26b451be-8000
I had to prepare the proper file descriptor. Works fine.

Xcode 4 Document Types and Exported UTIs

I have an other problem with Xcode 4. I really like the new IDE but there are a few things I didn't get to work yet. One thing is to register Document Types with Xcode 4.
I tried it with the old way through the plist file, but it didn't work. (Means I couldn't open a file with my app) But I don't now how to set it up with the interface of Xcode 4.
My latest try looks like this: (Copied the entry made from Xcode in the info.plist)
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.plain-text</string>
</array>
<key>UTTypeDescription</key>
<string>Configuration File</string>
<key>UTTypeIdentifier</key>
<string>com.myname.projec.iws</string>
</dict>
</array>
and:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>AnIcon-320</string>
</array>
<key>CFBundleTypeName</key>
<string>Config File</string>
<key>LSItemContentTypes</key>
<array>
<string>com.myname.projec.iws</string>
</array>
</dict>
</array>
This does not work. The file in Mail doesn't have the option to open with my app.
Does anyone have a working example with Xcode 4 or a tutorial how to do it. I don't have any further Idea how to get it work.
Sandro
I think the role and the file extension are missing.
If you want to specify a file extension, you need to add UTTypeTagSpecification:
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.text</string>
</array>
<key>UTTypeDescription</key>
<string>my document type</string>
<key>UTTypeIdentifier</key>
<string>com.mycompany.myfiletypename</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>iws</string>
</array>
</dict>
</dict>
For the role, you need to add CFBundleTypeRole:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>My file</string>
<key>CFBundleTypeIconFiles</key>
<array>
<string>document-320.png</string>
<string>document-64.png</string>
</array>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSItemContentTypes</key>
<array>
<string>com.mycompany.myfiletypename</string>
</array>
</dict>
</array>
You can edit the equivalent of your 'com.mycompany.myfiletypename' by setting "Document Types" => "Item 0" => "Document OS Types" => "Item 0".
The default value is "????" which you can change to "com.mycompany.myfiletypename".
I think the other properties speak for themselves.
I just looked at my old .plist file and cut and pasted the keys and values into the new one in Xcode 4 project that had been imported from an Xcode3 version. It apparently "loses" some of the info in the .plist for UTI's when it comes over. However, when I pasted the missing keys/values back in from .plist made with Xcode3, the new values worked AND they appear in the GUI so you can now "browse" the GUI and see what goes where. Kind of reverse engineering the GUI but it works.

How do I register a custom filetype in iOS

I am currently creating a app in which i want to let the user backup their files (plist + m4a). I zip the files and change the extension to a custom one (specifically for my app, say "*.MyBackup"). The user can then either export via email or with iTunes file sharing.
I have already read about CFBundleDocumentTypes but didn't really get what I had to do with them.
The part where i am currently stuck at is how to associate my extension with my app. If the user sends himself an email with the "custom"-zip file he's supposed to be able to open it with my app.
How do I do this and what are "UTExportedTypeDeclarations"?
I hope it's okay if I dump in that part of my projects info.plist without much further explanation. I think it's pretty much self-explanatory.
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>Icon-iPad-doc320.png</string>
<string>Icon-iPad-doc.png</string>
</array>
<key>CFBundleTypeName</key>
<string>MyAppName File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<!-- my app supports files with my custom extension (see UTExportedTypeDeclarations) -->
<string>com.myurl.myapp.myextension</string>
<!-- and csv files. -->
<string>public.comma-separated-values-text</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>MyAppName File</string>
<key>UTTypeIdentifier</key>
<string>com.myurl.myapp.myextension</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>myextension</string>
<key>public.mime-type</key>
<string>application/octet-stream</string>
</dict>
</dict>
</array>
Check out /var/mobile/Library/Preferences/com.apple.LaunchServices.plist.

Associating sqlite3 db to an iPhone app

I'm trying to associate an SQLite3 database file with our app so that it's easy to open backed up database from an email. The following however does not seem to work as Mail still doesn't recognizes the file (on an iPad and iPhone 4):
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.database</string>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>App Database File</string>
<key>UTTypeIdentifier</key>
<string>com.company.App.db</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>db</string>
<key>public.mime-type</key>
<string>application/x-sqlite3</string>
</dict>
</dict>
</array>
<key>CFBundleDocumentTypes</key>
<dict>
<key>CFBundleTypeName</key>
<string>App Database</string>
<key>CFBundleTypeIconFiles</key>
<array>
<string>Icon-Small.png</string>
<string>Icon.png</string>
</array>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>com.company.App.db</string>
</array>
<key>LSHandlerRank</key>
<string>Alternate</string>
</dict>
</dict>
Any idea what I'm doing wrong?
For completeness and possibly my own reference later here is a bit of the further details that got it working for me:
Declaring Document Types your app supports
(eg sqlite3 databases)
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>com.company.sqlite3.database</string>
<key>UTTypeReferenceURL</key>
<string>http://www.company.com/</string>
<key>UTTypeDescription</key>
<string>MyCompany SQLite Database</string>
<key>UTTypeIconFile</key>
<array>
<string>Icon-Small.png</string>
<string>Icon.png</string>
</array>
<key>UTTypeConformsTo</key>
<array>
<string>public.database</string>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>sqlite</string>
</array>
<key>public.mime-type</key>
<array>
<string>application/x-sqlite3</string>
<string>application/octet-stream</string>
</array>
</dict>
</dict>
</array>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>MyCompany SQLite Database</string>
<key>CFBundleTypeIconFiles</key>
<array>
<string>Icon-Small.png</string>
<string>Icon.png</string>
</array>
<key>CFBundleTypeExtensions</key>
<array>
<string>sqlite</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/x-sqlite3</string>
<string>application/octet-stream</string>
</array>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>com.company.sqlite3.database</string>
</array>
<key>NSPersistentStoreTypeKey</key>
<string>SQLite</string>
</dict>
</array>
Copy paste the above XML into your Info.plist file.
Setting the 'Store Type' to 'SQLite' didn't wasn't the killer fix for me.
My previous post here mentioned a rather incorrect way of getting it to work which accepts all files and didn't properly export the type.
Also if your app is emailing off these files as attachments make sure it matches the MIME type you set it to capture. The application/octet-stream is not important it is just that older versions of our app are emailing out the databases with that MIME type.
eg,
[controller addAttachmentData:[NSData dataWithContentsOfFile:dbPath] mimeType:#"application/x-sqlite3" fileName:filename];
I sure hope anyone else that tries to find out how to get their app to support opening sqlite3 database backups finds this helpful.
Okay I've sorted this out. If you instead use 'target's info' panel and add your document type there (and then select 'SQLite' as the type') it just works. Obviously provided you've exported the type as above.
As per Apple's documentation, CFBundleDocumentTypes is an array, not a dict.
You have:
<key>CFBundleDocumentTypes</key>
<dict>
so the <dict> needs to be in an <array> element, like so:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>App Database</string>
<!-- ... -->
</dict>
</array>