Edit2:
I’ve distilled the problem down to the simplest project I can. Here’s the setup.
I created a new single view app and immediately added a new Action extension target. I created a new icon set in the .xcassets file and added an iPad retina sized icon (I’ve tried filling in all the icons, the results are the same).
I made sure to include Images.xcassets in the Copy Bundle Resources build phase:
And then when running the app in the simulator everything works!
Compiling to device however results in a blank icon:
I thought maybe that means something is wrong with the PNG file I’m using, but everything looks OK here too:
Has anyone encountered similar?
I’ve already visited questions like this looking for an answer and I think I’m doing everything right but I’m still not seeing an icon in the action sheet.
Here’s what I’ve done:
-
Created a working container app that has a working app icon stored in Images.xcassets. Then I created an Action Extension Target as a member of the same project.
-
Added Images.xcassets from my containing app to my extension’s “Copy Bundle Resources” build phase. I know that this worked because I’m able to load images from the .xcassets file using
UIImage.imageNamed(...)
in my extension. -
In the General Tab of the settings for my extension I’ve pointed the “App Icons Source” under “App Icons and Launch Images” to point to Images.xcassets’s resource called “AppIcon”, the same used for my containing app.
-
When that didn’t work I did some further reading and discovered that Action Extensions require an “alpha mask” style image. I created another item in my .xcassets file called “AppIcon-2” and populated it with all sizes of app icon, except as a 1-color + transparency PNG. I pointed “App Icons and Launch Images” of my extension to this new “AppIcon-2”
Still my action extension’s icon is a blank white square. Are there any steps that I’m missing? Is there some very specific format the alpha mask has to be in? (I’m just saving as a .png in photoshop). Is there some very specific name the resource has to have in .xcassets?
I’m also confused by some of the answers (like the one linked above) which seem to imply that the issue is resolved by adding .xcassets to the build phase. Aren’t most app icon’s completely opaque? How does iOS generate an alpha mask from a completely opaque app icon?
Edit: I’m not entirely sure what change made the difference (I’ll try to deduce it and update this post if I figure it out) but I’m now seeing a working icon based on the alpha mask of “AppIcon-2” on the simulator. I hadn’t even thought to check the simulator but it does prove that the icon is being pulled from the correct place. Something about the device is processing the image differently.
6
Answers
You didn’t mention the extension’s
Info.plist
settings, so I assume you didn’t include an entry for the icon file. You’ll need to add a key namedNSExtensionServiceToolbarIconFile
in theNSExtensionAttributes
dictionary. The value is the name of the icon file.At least that’s how it’s supposed to work. In practice it seems that you currently need to have a top-level
CFBundleIconFile
key with the icon’s name. Supposedly that’s only used ifNSExtensionServiceToolbarIconFile
isn’t present, but at least for now it’s necessary. I have both, which is probably not necessary, but I’d prefer to leave the key that’s documented as being correct in place in case it starts working at some point.I had the same problem. What worked for me was to follow Tom Harrington’s answer, but then also make sure the ‘Target Membership’ (right side pane) of the extension icons includes both the extension target AND the app target. (Under Build Phases, it should be listed under Copy Bundle Resources for both targets as well.)
Also, note that your extension icons must have a fully transparent background, NOT solid white. Any white, or any colour other than transparent, will be rendered as solid dark grey.
Hope this helps. Sorry, I wanted to add this as a comment to Tom’s answer, but Stack Overflow wouldn’t let me because of my reputation.
We have the same problem for our Yarnee App. But I figured out that beside Camera Roll, the icons work on other Apps, for example Dropbox, see this screenshot:
It feels a little bit like a bug…
To get this to work with my existing Asset Catalog, I had to add the following to the extension’s Build Settings:
The name of the set in my Assets Catalog is “ExtIcon”. I had tried setting the CFBundleIcon and the NSExtensionServiceToolbarIconFile keys in the info.plist for the extension, but had no luck. This actually seems to make sense since it is the same way that icon sets are linked to the container app, not via info.plist, but via the Build Settings.
EDIT: Apple Fixed this issue in iOS8.1!
———— OLD ———————-
I think at this point, the answer is to submit a bug report to Apple at
https://feedbackassistant.apple.com/
If you can submit your barebones example project, that will help our cause!
Here’s the one that I submitted:
Edit:
They closed it as a duplicate of ID: Ticket ID: 17208813
Progress!
Problem seems to be solved on iOS 8.1.