What files to keep under version control on iPhone projects? - iphone

I found this previous question about Cocoa projects, but I wanted to know if it's the same for iPhone projects.

As far as I know, the same responses there apply to iPhone development as well. In my projects, the only files I keep under SVN's control are the source files, any resources (images, .XIBs, audio, etc.), and the .xcodeproj file.

It may be a good idea to version control provisioning profiles. Especially for an ad-hoc beta test profile, you'll need to update it every time you add a new beta tester, and having a history of that seems like a good idea.

Actually there is something I would say you should version control that you would normally not - the final application bundle and dsym file, both under build. However, you only need to archive these when you release either an ad-hoc or distribution build for the store - so I'd leave build in the ignore file, but have somewhere you can copy these files to check them in for a distribution and tag them along with the source.
You'll probably want to compress the app bundle before placing it in this save directory
You need these two files in order to be able to symbolicate crash logs sent to you by either beta testers, or users of the app from the app store. A meaningful stack trace of a crash is priceless!

If you're planning on updating the app over time in addition to project sources and media you may also want to put the following under version control:
Signing certificates for app (and/or mobileprovision files).
The final version of the binary app (zipped) submitted to Appstore.
Binary.dSYM file for each revision (for post-release crash symbolicating).
Screenshots/icons/text file of description for app as submitted to Appstore.
Before beta releases you may also want to put mobileprovision files as well as a snapshot of the device list from the Developer portal for that version just so you can go back in time and figure out who got what release. If you're really hardcore you can also keep emails submitted by beta testers so you can keep it all in one place and go back and double-check against bug reports.

Yes. I use the exact same .gitignore file for iPhone OS projects as I do for Mac OS projects.

Related

iOS Archive released to iTunes does not work the same as the project

I have an issue that has me completely perplexed. I built a simple openGL game in iOS ( 4.2.1 xCode ) and tested it on my device and all was fine.
I then archived it and submitted it to Apple. They approved and released it.
When I download it ( onto the same device ) or anyone else does ( onto variety of the latest devices ) much of the game play is missing. Its as if the archive did not capture all the settings from the project.
I can only conclude that at the archive stage something happened to the build.
Does anyone know how i can test run the actual archive on my device ( without submitting it ) so that I can get to the bottom of what is different ?
Thank you very much anyone who reads this.
When you are about to release a game to appstore, you'd better make a distribution AD-HOC build and give the ipa to some friends of yours. Of course, don't forget to mark their devices when making distribution ad-hoc profile. So once you have this .ipa, delete your development build from device and install .ipa via itunes. Then you'll see it the way as it is downloaded for the appstore.
Furthermore, you say that some scenes/resources are missing: this could be for the reason that when you added the resources/files to your projects you did't enable "copy files to project directory" and "add to target" so the build was incomplete.
OKay, once you assured your ad-hoc ipa is working fine, make the same distribution profile, but only for apptore. Build the app and submit to appstore!
Hopefully this will help, bye!
In my experience, when this kind of thing happens it's because something that was included in early dev builds is no longer there, but is still in the binary on the device. (Dev builds are incremental, so some files deleted from or changed in a project can sometimes persist.) You could try the following:
Delete the app from your device
Delete the derived data folder in the organizer
Clean all build targets
This may reveal the problem. It's hard to say without more info about what "much of the gameplay is missing" means.

iPhone app Update Vs new version

Let's say I have an existing IOS app live on Appstore which is version 1.0
Now I make some changes to the app and want to submit back.
Are there 2 separate ways to submit ?
Like can I still keep the version as 1.0 and just submit the app OR
I need to create a new version 1.1 and then submit it ?
What are the differences in the process?
Also from the customer end, how does this work for new/existing users ?
I have just discovered something about version upgrades and the App Store. Just now, I'm suffering issues and users crashes because of a behavior of iOS system that I can't figure before. And, very important, iTunes, AppStore and iOS have modified some upgrading and installing rules in last versions. Now, it works this way:
- When user install a new version, all the files in the bundle are downloaded and copied in the previous existing bundle, but OLD FILES OR COMPONENTS ARE NOT DELETED (or not all are deleted). So, the final bundle IS NOT equal to the bundle of a fresh installation of the new version.
- For example, if a xib/nib file is localized to different languages for the new version, the updated bundle will include both versions: the one in the root folder and the other one in each localized folder. The system, obviously, will use the first one and only a fresh installation will show localizations for that file.
One of my apps shows that issue with MainWindow.xib and as there are some modifications in references and classes, the updated apps crash each time you try to run as it is using a obsolet object. I have built a new version changing the name of the xib/nib files that have been localized. As MainWindow is one of them, I have to modify the reference in info.plist of course.
OK, knowing that, you can build a new version with complete different components in the bundle that, if files of previous version does exist, the app then offers the user the option of using them. That is, two versions of the app in a single icon and bundle. Not very difficult to do.
BUT, the very weird thing is that I think that new iOS version and iTunes don't allow downgrades. I have tried to do it but didn't get it done. That is, if you install a version, for example 1.2, it is impossible AFAIK to install latter v1.1 on the device nor in iTunes->"Applications". So, the double version bundle will live until a reinstallation of the app.
You need to create a new version number, which makes sense since this is a new version of your app. This will then appear as an update for your customers. I don't think you can upload a new binary with the same version without removing the old one from the store.
You add a new version in iTunes connect, then update the version number in Xcode to match and create a new archive. It's pretty straightforward.
You must always increase the version number of any update to your app.
Users will see a badge on the App Store icon on the device, and in iTunes on their PC. Going into the updates section, it will list your app along with the list of changes you've provided, and a button to install the update. They can also update all apps at once.
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:#"CFBundleVersion"];
NSLog(#"version is%#",version);
You do not have to open version numbers to submit any longer. Open up Xcode, go to Window - Organizer - Archives and Distribute an app you have created successfully.

Windows 7 iTunes does not accept the adhoc ipa file

I am in beta testing stage for an application.
Some of my beta testers use Windows 7 and run iTunes within.
Some of them are just fine but a few observe some rather strange behavior.
That is: Neither the *.ipa nor the *.mobileprivision file can be dragged and dropped into the Apps section of the Mediathek within iTunes. (Doing so the icon indicates that the object cannot be dropped within iTunes)
We tried File/Add to Mediathek ... and that does not work either. No error message but the app does not show up and when adding the mobileprovision file for a second and third time no message comes up that asks whether to overwite the existing mobileprovision file.
I tried google and the search within stackoverflow but did not find anything that matches my problem.
Any suggestion is highly appreciated!
Probably not a direct answer to your question - but a workaround:
Have you tried http://testflightapp.com? Lets you send beta builds to your testers over the air without them having to go through iTunes. And it's free.
No affiliation - just a satisfied user.
Agree with Abizem. Testflight is a good, painless way of sending out builds. If you absolutely have to use the mobileprovision and .app route, just copy the mobileprovision file and do a sync. Check if that is getting added to the device (the UDID in the mobileprovision might be incorrect)
Note: the .app file will appear as a folder on a Windows system. The entire folder needs to be dragged in this case.
If all of your testers use iOS 4 you can drop the two files on your file server and let them open the website from there iOS device. It is really simple and they don't even need a PC for testing:
http://buzzworks.de/blog/announcing-developer-framework-hockey

iphone app upgrade and moved xibs/nibs leads to stale resources

I have an unlocalized shipping app which has foo.xib in the main project directory. In preparation for localization, I moved this to en.lproj/foo.xib. Now, when I build my app and install on my test device, it ends up using the stale old foo.nib which must be there from before (the installation process must not remove old files in the app's bundle). Deleting the app from the test device and re-installing fixes it -- but I don't want my existing customers to have to do that.
Some of these are coming from calls to UIViewController's -initWithNibName:bundle method (to which I'm currently passing nil for the nibBundle). I can probably create an NSBundle instance here which points at the correct localized directory. The others are specified in Info.plist or in the "NIB Name" section in interface builder and I don't see a way to specify a bundle for those.
It might just be easier to rename all my xibs to (e.g.) en.lproj/newfoo.xib, then I presume it will find the correct nib at runtime. (And I'll have to remember to never again use the old "foo.xib" name in a new version.) Is there a more clever solution here though? (Other than going back in time and starting with en.lproj directories from the beginning ;-)
Thanks!
-Mike
Answering my own question in case anyone else runs into this issue. It appears that this is an artifact of the Xcode build-publish cycle, and it isn't a problem when user's upgrade via the App Store. I went ahead and published my update and no one has noticed problems that would result from stale resources.
As a speedup to development, it appears that Xcode only copies over resources that it detects have changed when you build and install to the simulator or a test device. (To prevent a game with 500MB of resources from having to be re-copied each and every time you build and test.) When you (re)move a resource from a project though, it does not detect this and (re)move the old copy. I will file a bug with Apple about it.
However, the App store does appear to do a clean install with each upgrade (copying over the user's documents directory) so this is not a problem from the App Store. I'm not sure if it is a problem when emailing beta testers an .ipa file or not.
I'm having the same issue. The problem is that the phone keeps a cache of the nibs. Somehow thus cache needs to be cleared for you to see the new localized nibs. I also don't want my users to have to delete the app since it stores data.
I just had the same issue but found a solution which works, even with Xcode's deployment quirkiness: Prevent UIViewController loading stale XIB from app bundle

creating a free version of an app, but having the app separate on debug device

I was just making a free version of one of my apps. I copied the folder, renamed the project, and changed the icon file, loading screen, interface, and code. BUT YET it still replaces a build on my phone.
1)how do I stop this from happening (i want both the free and paid version on my phone)
2) if you can fix this, will a customer who has the paid, and downloads the free, will that replace it on their phone?
I really need to know these, as I have the app ready to go, and would like to get it before the end of the week.
cheers
Sam
You need to have a different app bundle identifier. I think that's your problem.
Long answer:
Go into your projectname-info.plist file and change the CFBundleIdentifier.
I'd recommend something like:
com.mycompany.mycoolapp for the app store
com.mycompany.mycoolapp-beta for the beta version
You should actually be able to set up the "Debug" build configuration to use a different info.plist file configured with a different CFBundleIdentifier and a different icon filename. That way you'll automaticlly get the beta ID and icon, etc for the Debug build and the real id/icon for the full one.
This should allow users to install and use both the production and test versions of the apps at the same time without confusion.
You might also find this IPA target template helpful if you're doing ad-hoc distribution to Windows users for testing:
http://devblog.appmagination.com/2010/01/target-template-for-building-iphone-ipa.html