In my Xcode project, i added a bunch of images to use. I need to change out the images so i removed them from the project and deleted them from the folder structure. They should be gone, right?
No. when i launch the program, the images are still being used. I did a search on my computer for the file name and only found it in the code
(i used a constants file and put the file names into strings:
NSString * const PRESET_LIGHT_GRAY = #"preset-rect-16.png";
NSString * const PRESET_ASH_GRAY = #"preset-rect-17.png";
and this is the only place on my mac that i find the file name).
there is no file on my mac named "preset-rect-16.png" yet Xcode is still using the image.
where is Xcode getting the images? are they stored somewhere else in the project? are they saved in the simulator somewhere?
/puzzled
Go here. Xcode -> Preferences -> Locations -> Derived Data
Wherever your Derived Data Folder is, delete Build for this Project and then run again. Resetting the Simulator is also recommended.
The images may still be referenced in your target build phases under copy bundle resources. If so delete the references there as well.
Related
I've been using SpriteKit for a while in iOS; now I'm developing an app for the Mac.
I've setup a texture atlas as usual:
Enable texture atlas generation for both the Project and the Target (I started from the "Document Based Application" template, not "SpriteKit Game". It has different build settings).
Drag all the individual texture image files into a folder,
Rename the folder to "Something.atlas",
Add the folder to the project,
At runtime, create the atlas by name (i.e., [SKTextureAtlas atlasNamed:#"Something"];).
Obtain individual "textures" by name (i.e., [_atlas textureNamed:#"MyTexture"];) and create SKSpriteNode instances with them.
I am preloading the atlas asynchronously, but the completion handler never gets called (see comments):
_atlas = [SKTextureAtlas atlasNamed:#"Something"];
if (!_atlas) {
NSLog(#"Error: Failed to create atlas!");
// This line doesn't execute, so atlas is not nil.
}
[_atlas preloadWithCompletionHandler:^(void){
// This block doesn't get executed either,
// so atlas loading somehow fails...
NSLog(#"Atlas Loaded!");
[self createSprites];
}];
When I check the package contents of the build product (e.g., MyApp.app), in the resources subdirectory I can see the atlas folder ("Something.atlasc"), but it only contains a .plist file with no entries, and the image resources are nowhere to be found... So what gives?
Actually, it wasn't the workspace after all. The same workspace/project, when copied to the Desktop, builds fine.
The cause seems to be that, one of the intermediate directories in the path to the project folder had a name in japanese characters. I tested as follows:
Change folder name to english -> clean build folder -> build -> OK
Change folder name back to japanese -> clean build folder -> build -> Atlas broken
Change folder name back to english -> clean build folder -> build -> OK
...(you see the pattern)...
I wonder why and how this only affects the export of texture atlases, and nothing else.
Hope this experience helps someone else in the future...
I will update the bug report at Apple as well.
UPDATE: According to Apple, the issue has been solved as of iOS 8 beta 2 (Build 12A4297e). I haven't had an opportunity to check (the project I was working at was a prototype that didn't take off, and I settled for the name change solution). In any case, iOS 8 is final now.
I have an app that started life for iOS 5 and has been updated ever since. For iOS 7 I have switched over to using an Asset Catalog for all the resources, which is nice and appears to work well. However, when I try to submit to Apple I get validation errors:
Invalid Image Path - No image found at the path referenced under key 'CFBundleIconFiles': 'Icon#2x.png'
I get the same error for the other icons, too. These icons do appear in the Asset Catalog and the names -- right down to the case -- match exactly as far as I can tell. The Asset Catalog is in the "Copy Bundle Resources" and all the resources appear in the right place when I run the app on both my iPhone and iPad (in iOS 7) and in the Simulator for iOS 6.
I have updated the app to use the minimum deployment target of iOS 6.
So, how do I successfully submit my update to Apple? Do I need the references in the Info.plist? Are there any other settings that I should check? Is the warning spurious and something that I should ignore (after raising a Radar)?
When an asset catalog is compiled for iOS 6 and lower, the images are put in the root of the app bundle, as if you were just copying them the old way. When this happens, Apple names the images according to the asset name, rather than the filename, which means we can still use +[UIImage imageNamed:] to get the assets on iOS 6 and lower.
This is true for the App Icon asset, when we have the following icons set in our asset catalog:
They become compiled like so:
As iOS 6 is still iOS 6, these files must be referenced in the Info.plist, otherwise the existing system wouldn't work. Looking in the compiled Info.plist for this test app, you see that Xcode has added CFBundleIconFiles for us and so we don't need to.
I have uploaded the test project I used to github.com/danielctull-tests/AssetTest.
Okay, so here is what I ended up doing. I'm not 100% sure it's correct but I thought that it was worth sharing.
I removed CFBundleIconFile, which I don't think is used in iOS 6 and above
I used the asset name rather than the icon filename in CFBundleIconFiles
I'm not clear what the proper names are so, for the sake of clarity: by icon filename I mean the name visible in the Attribute Inspector of the Asset Catalog when the icon is selected; and by asset name I mean AppIcon, which refers to seven actual icons in my case.
This both passes Apple's validation step and appears to look okay. I don't currently have an iOS 6 device but it displays correctly in the Simulator.
I had also a lot of Problems on this matter - I was constantly getting the error with the missing CFBundleIconName and that my Icons where not found. So here is my story, maybe it will be of help for somebody. By the way, I am using Visual Studio with Xamarin.
Add an Asset Catalogue to your Project with AppIcons (the actual name of the asset is not important but just that it is for the application icons). Add all of the necessary icon sizes. For the 'App Store' icon I have added an icon without a # in the name as someone in the forums suggested, but I am not sure, if it is 100% necessary. For generating the different icon sizes there are a lot of Websites and tools that can do that for you and you just need to provide the 1024x1024 one. They will generate the rest.
In the Info.plist under 'Visual Assets' and then 'App Icons' set the source to the asset that you have just created.
Now check your Info.plist. Do not open it with an external Editor, because all of your changes will be overwritten once you build your project. Do the following - right mouse click on the Info.plist in the Solution Explorer then select Open With -> Generic PList Editor.
Check that you have the following entries:
-Property = CFBundleIconName, Type = String. Value = Assets.xcassets/AppIcons.appiconset
-Property = XSAppIconAssets, Type = String. Value = Assets.xcassets/AppIcons.appiconset
Note that Visual Studio automatically adds, when it adds something altogether, 'Resources/Assets.xcassets/AppIcons.appiconset' as the Value. But in my case the Asset Catalog was created outside of the Resources folder and therefore, my icons where not found. So, check where your assets folder was created.
CFBundleIconFiles was not needed, because Apple uses the Asset Catalog instead now.
I hope that I was of some help :)
I tried to change the name of my xcode project, (which uses the cocos2d framework), but for some reason my main files folder (the one that contains all the .h and .mm files) wouldn't change the name. so then i manually clicked under "MyProj TARGETS -> Build Settings" and manually changed the fields:
Info.plist File
Header Search Paths
User Header Search Paths
Prefix Header
to be using "MyProj/" instead of "PrevName/" (the previous name i had named the project) but now i'm getting these two strange warnings:
Warning: Multiple build commands for output file /Users/me/Library/Developer/Xcode/DerivedData/MyProj-fzlkaghtvjzkgkenbpejhzwvxsft/Build/Products/Debug-iphonesimulator/MyProj.app/CMakeLists.txt
Warning: The Copy Bundle Resources build phase contains this target's Info.plist file 'MyProj/Resources/Info.plist'.
you'll see that this is also mentioned under: http://www.cocos2d-iphone.org/forum/topic/33245 but no one has answered this part
and i tried to look under Xcode warning: "Multiple build commands for output file" to see under "Build Phases -> Copy Bundle Resource"... and indeed, there were 2 CMakeLists.txt files. one is:
MyProj/libs/Box2D
and the other is:
MyProj/libs/kazmath/src
which one do i need? or do i need both, since i think xcode used to be compiling with both??
i should mention that my project seems to be running okay right now if i leave the warnings in. but i don't like warnings that i don't understand, and i know that i could just swap my source/assets to a new project to get rid of the warning, but i'd like to know for future reference how to properly rename everything in a xcode project.
Thanks
Oh wow... I had no idea the traffic on stackoverflow is so low these days...(or at least for xcode & iOS dev) sighs
Anyways, I think I figured out a fix.
I read apple developer guilde for the second Warning
For the first Warning, I looked at another file that I had created, and I compared my project's settings to the other project's settings. (such a simple solution, duh, why didn't I think of this >_<) and it turns out, under Copy Bundle Resources, you're only supposed to have:
Your .png files and other resources used in code (but NOT your plist file, for the very reason given in the link above)
iTunesArtwork
ChangeLog
Actually, i'm not sure if you even need #2 or #3. I'll give an upvote to whoever experiments with it. So.... the solution is to simply remove all those other CMakeLists and cmakes and all that junk, including plist :)
When I build my iPhone Project in XCode, I'm getting the following warning.
[WARN]Warning: Multiple build commands for output file /Users/SilentCoder/Library/Developer/Xcode/DerivedData/myProject-csfqcpziyuvhbiatwwjtkkmwbxwv/Build/Products/Debug-iphonesimulator/myProject.app/car.png
I don't understand what does that mean. I have made targets for both iPhone and iPad for my project.
It's likely that you have specified the resource to be copied to your bundle/resources twice.
(check your copy resource build phases)
Works for me.
Check the list of resources in Project - Target - Build Phases - Copy Bundle Resources Section and remove the resources references.
I create my own first framework following [http://www.raywenderlich.com/65964/create-a-framework-for-ios] (How to Create a Framework for iOS), appearing the same warning.
And I have no extra resources but two source code files (.h and .m).
Lastly, I found that the .h file appears in two place, one is Copy Files, the other is Copy Header, and I delete latter one, the warning disappeared
NB: you get the exact same error message in a slightly different situation: if a header file appears twice in Xcode's internal list of header-files to export.
If the affected file has a .h suffix, then ... instead of removing from the "Copy Bundle Resources" phase, you need to remove from the "Copy Headers" phase.
(NB: this ought to be impossible, and XCode SHOULD NOT allow it to happen, but Xcode's handling of header files is terrible (and doesn't adhere to the standards :( ), so it's quite easy to end up with this "duplicated commands for the same header file" problem)
Why am I getting
cocos2d: CCFileUtils: Warning HD file not found: META-hd.png
If I definitely have META-hd.png file in my project?
What I am doing is running my .tmx tilemap. The map uses a tileset that searches for "META.png" (without -hd suffix since I am expecting cocos2d to automatically put it on).
I've found the problem. I only do have -hd versions of my files. But I don't have "non-hd" versions. And for some reason, CCFileUtils will throw me errors when I don't have both types in my project.
Verify that the image is part of the app's target. If it was included as part of a group, and say there was a duplicate on file 10 of 25, the copy stops and files 1-9 are NOT tagged as part of the target. You have to go back and sweep the floor by hand.
In Xcode 4 show the assistant editor, and click the resource in the navigator. The target membership will be shown. If your app is not checked, click on that and voilĂ , the file will now be found.
In rare cases, i have had to clean the target and recompile to make this effective.
If I understand correctly you will have to have a -hd version of the tilemap as well: meta.tmx and meta-hd.tmx.
Also be sure that your image file is named META-hd.png and not META-HD.png and both images use the same case: META.png and META-hd.png. The iPhone file system is case sensitive (not the iOS Simulator though).