I have created an app targeted for ios 4.1 with base SDK ios 5.0 and tested it with 3G(ios 4.3.3) 3GS(5.1) 3GS(5.0) iPad(5.1). My App has behaved well on all these devices. However, when apple has finaly accepted the app, and i have downloaded it on the same devices, the behaviour has changed. The problem is that the pages which are displayed are oversized, but if i move them, they properly start fitting the screen.
Has any of you came across similar situation when the app after publishing changed its behaviour?
And most important. How am i supoosed to reproduce this bug when the same app run from mac on real devices performs excellent?
I may add that base SDK was set to latest(5.0) but app was archived with XCode 4.2 which doesnt support ios 5.1.
Be kind to me, this is my first question :)
EDIT:
After hotpaw's helpful hint, i have checked that the problem was the release build. I can reproduce the bug on the device after changing target in run conf. from debug to release.
What is interesting, and frustrating, I cannot solve the issue, however, I have tested my application in release mode on xcode 4.3 and it is working perfectly. I have not changed anything, but it works. It can't pack the build( see problem Xcode 4.3.1 - Packaging operation failed), so i am stuck with xcode 4.2
For a while i have suspected that the bug is caused by the compiler when compiling for thumb, and the solution would be to add -mno-thumb to other c flags. But i fail to force that flag. See : iOS5 Xcode4.2 floating-point byte align error?
When I compare the compilation log, i can see that xcode 4.3 compiles with -arch armv6 when xcode 4.2 with -arch armv6. But it is the same device which I connect to the computer. I haven't spotted other differences, but they may exist. I can paste the compilation log for sample file if it would help.
This can happen if you test only Debug Builds, and then submit a Release Build to the App store. For final test, you need to force Xcode to test with a Release build (perhaps by editing the default schemes), and then submit this build with absolutely no changes to the Build settings, other than code signing.
You might also want to final test your Release build by Ad Hoc installation via iTunes on a freshly reset device from which all previous builds of the app have been deleted. See Apple's directions for doing this.
The problem was with the buggy compiler!
I couldn't notice the difference after applying -mno-thumb to my project, because the library which i used ( Three20) was set to compile only for armv6 which caused the problem and not my project. After adding -mno-thumb to all the projects of Three20 the bug has vanished!
I am going to notice the Three20 team about the issue.
Related
This problem has been driving us nuts for some time. We have applications, all built with Titanium (I'm mentioning this because I'm not 100% sure that the problem doesn't come from there). The applications are up on the store, we updated them a few times since the every launch.
Right now, they supports armv6 and armv7.
For the next update, we want to add support for the iphone 5, which means that we have to drop support for armv6. Which is absolutly fine. We also don't mind setting the minimum OS version to 4.3.
So we changed the build settings in xcode to armv7 armv7s, set the minimum os to 4.3, added the retina screens and so one, builded the app. We left everything else as it were. When we try to validate the app, we get this message :
this bundle does not support one or more of the devices that were supported in the previous bundle for this app
With a link to the apple manual page : http://developer.apple.com/library/ios/#qa/qa1623/_index.html
Which told us that the error might be because :
When you see this error message, you have changed the "Targeted Device Family" build setting (which modifies the UIDeviceFamily info.plist key.)"
But we did not.
Also, a few line below (in Targeting the latest iOS):
For example, if your app is no longer built with armv6, you should not add armv7 to your UIRequiredDeviceCapabilities. This may cause Xcode or iTunes Connect to erroneously reject your update.
Of course, we did not do that.
We even tried to make to change the app version to the next major one, as someone stated it solved it.
Has anyone a clue on how we remove armv6 support for good ? The only solution we found would be to delete the application and recreate it with only armv7 this time. This, of course, would not be acceptable as we would lose comments, ratings and so on.
Did you remove armv6 from both the 'Architectures' and the 'Valid Architectures' setting?
Ok I manage to get it to work and now I'm wondering what went wrong when we tried the first times. Here is what I finaly did (nothing more):
took the current version in Titanium
Cleaned it up
set the version in Titanium to the next major one (2.0 in our case)
reseted environment to use xcode 4.5 (it was already the case, but I was willing to be on the safe side)
builded the package through publish, with the SDK set to 6.0
The build process confirmed that this was ok ([INFO] Minimum iOS version: 4.3 linked iOS Version 6.0)
Once done, validated the package in xcode and uploaded it
And here are all the things I did not do this time:
Changed anything in the info.plist
Changed anything in the build architectures
actually anything in xcode except validate and upload
I've been trying to get my app - built in Xcode 4.2 in Snow Leopard, using ARC, targeting iOS 4.0 and up - to install on a 3G, with no luck. I've tried every solution I can find (like this thorough one here: Is it possible to target older iOS versions when using Xcode 4.2 and iOS 5 SDK?) and while I've been able to get the app to run on the phone via Xcode, when I share the app and try to install it through iTunes, I keep getting the same error telling me the app was not installed because it is not compatible with this iPhone. My client is using a 3G so this is a pretty big problem.
I've set the architectures / valid architectures to support armv6 as well as armv7 in my build settings and I've deleted the line in info.plist about the required device capabilities with armv7 (I also experimented with adding armv6 instead of deleting the line, which made no difference). I also added the -mno-thumb to Other C Flags in case that was the issue. Even though I know for a fact that it works on a 3G, iTunes refuses to install it. Is there something I'm missing?
Check the OS version for you iPhone 3G. if it is running less than 4.0 you might need to have older sdk. Besides I guess ARC is not supported in earlier versions of iOS.
OK, I'm just dumb - I skipped a step and wasn't actually re-archiving the app, I just kept sharing the same original archive over and over again. Re-archived and now it works fine.
Thanks for all your help, everybody! Next time I ask a question I'll try to rule out my own lack of attention first...:P
I'm developing an app which is iOS 4 compatible, so my deployment target is set to iOS 4.0.
Whenever I drop a UINavigationController onto a UITabBar, I get these two warnings:
warning: Attribute Unavailable: Defines Presentation Context is not available prior to Xcode 4.2.
warning: Attribute Unavailable: Defines Presentation Context on iOS versions prior to 5.0.
The UINavigationController functions as expected, in fact, the entire app runs perfectly. But these two warnings are driving me nuts!
Also, the moment I delete the UINavigationController the warnings disappear.
Just uncheck the "Defines Context" checkbox in the attributes inspector. (Double-click on MainWindow.xib, select the navigation controller, then go to View->Utilities->Attributes Inspector.) That'll get rid of the warnings.
You are getting these warnings because you are using iOS 5.0 SDK features with a 4.x deployment target.
All, if not, most of the new 5.0 hotness, including ARC and Storyboards, is completely backwards compatible with iOS 4.x (I don't remember if 4.0 or 4.3 is the lowest supported version, check the docs), it will work as intended, but Xcode is going to warn you anyways.
You should be able to disable that warning if it really bothers you, but I wouldn't. That said, Apple does not currently accept applications built/archived with the Xcode 4.2 beta for submission to the App Store. This means you need to use Xcode 4.0/4.1 in a production environment.
Before we go any further, you should know that Xcode 4.2/iOS 5 is beta software, it is under NDA (you agreed to this when you joined the Apple developer program) and cannot be discussed in the public domain. This means you won't be able get much help from places in the public eye, like StackOverflow, as good as it can be. But, since I'm here and this is a very high level question, I can help :)
In the future, if you have iOS beta questions or issues, you should hit up the Apple Developer Beta Forums (an excellent resource, always search before you post), or #iphonedev on irc.freenode.net for not-beta stuff (I'll be there, say hi!)
If you're developing an application for release on the App Store:
You need to be developing with Xcode 4.0 or 4.1, Apple will not accept applications built/archived with 4.2. (I know I repeated myself, but people seem to miss this often)
And, although 4.2b7 supports developing for older frameworks better than previous Xcode betas have (by allowing you to install previous versions of the simulator), you will still find yourself accidentally using 5.0 SDK functions all over the place, as the code completion/interface builder very aggressively favors all of the new hotness. This is because the beta is for trying new things, not stable application development.
This means you need to switch back to using Xcode 4.0/4.1 for production, if you don't have it installed, or you overwrote the stable version with the beta, do not try to install 4.0/4.1 on top of the 4.2 beta, weird things will happen and both versions will start acting really weird and and Xcode will crash at least twice as often.
The best thing to do in this situation, is to follow the below steps. Make sure you don't skip anything, otherwise you'll have to restart the whole process.
Make sure you have your code committed and pushed up,
uninstalling Xcode like this temporarily removes git. (This was an
issue for me at work once)
Download the installers for Xcode 4.0/.1, and 4.2 if you intend to keep experimenting. (if you already
have both downloaded, this whole process won't take more than 5
minutes on an SSD)
Uninstall the Xcode beta from the command line using this command:
sudo <Xcode>/Library/uninstall-devtools --mode=all (more info here)
Restart your computer (this is important, do not skip it!!!)
Install the most recent non-beta version of Xcode and resume development.
If you want to use both versions of Xcode (4.0/4.1 and 4.2):
You must install the beta AFTER 4.0/4.1 is installed, otherwise you will be overwriting new things with old things, and this will give you many, many obscure headaches. I also recommend restarting between installations.
You need to install 4.2 after 4.0/4.1, and to a different folder (I use /Xcode4beta/, don't put it within the folder that contains 4.0/4.1, either). I've found I learn about the new hotness best if I keep separate iOS5 branches of my work, and update what I can when I have some free time.
If you have the iOS5 beta installed on your phone, and Xcode 4.0/4.1 won't let you build to your phone:
This is because Xcode needs to grab the debug symbols from the phone before it can be used for devleopment, but only the Xcode beta can do this for an iOS5 beta device, so follow these steps:
Make sure your phone is plugged in and turned on, and that your provisioning profile/certificates all check out.
Close the project in Xcode 4.0/4.1.
Open the project back up in Xcode 4.2, and check organizer. You should either already have a green dot next to your phone (assuming all of your provisioning is working), or it should be gathering the debug symbols. Let this finish, and then build your project. It doesn't need to be a successful build, nor do you have to install the application to the phone, sometimes you don't even need to build, Xcode can be a fickle mistress.
Close the project in Xcode 4.2.
Open the project back up in Xcode 4.0, you should now be able to build and install to your phone as you normally would.
Xcode 4.0/4.1 should now be able to use your device for development until you restart the computer.
Resolution is here:
How can I fix "Freeform Size simulated metrics are not available prior to Xcode 4.2" warnings?
You just need to change the development version of your xib file to Xcode 4.2 (default is Xcode 4.1)
View Controller and Navigation Controller setting or options name ( attributes inspector )
Define Context ( Checked ) unchecked.
I'm developing an app which is iOS 4 compatible, so my deployment target is set to iOS 4.0.
Whenever I drop a UINavigationController onto a UITabBar, I get these two warnings:
warning: Attribute Unavailable: Defines Presentation Context is not available prior to Xcode 4.2.
warning: Attribute Unavailable: Defines Presentation Context on iOS versions prior to 5.0.
The UINavigationController functions as expected, in fact, the entire app runs perfectly. But these two warnings are driving me nuts!
Also, the moment I delete the UINavigationController the warnings disappear.
Just uncheck the "Defines Context" checkbox in the attributes inspector. (Double-click on MainWindow.xib, select the navigation controller, then go to View->Utilities->Attributes Inspector.) That'll get rid of the warnings.
You are getting these warnings because you are using iOS 5.0 SDK features with a 4.x deployment target.
All, if not, most of the new 5.0 hotness, including ARC and Storyboards, is completely backwards compatible with iOS 4.x (I don't remember if 4.0 or 4.3 is the lowest supported version, check the docs), it will work as intended, but Xcode is going to warn you anyways.
You should be able to disable that warning if it really bothers you, but I wouldn't. That said, Apple does not currently accept applications built/archived with the Xcode 4.2 beta for submission to the App Store. This means you need to use Xcode 4.0/4.1 in a production environment.
Before we go any further, you should know that Xcode 4.2/iOS 5 is beta software, it is under NDA (you agreed to this when you joined the Apple developer program) and cannot be discussed in the public domain. This means you won't be able get much help from places in the public eye, like StackOverflow, as good as it can be. But, since I'm here and this is a very high level question, I can help :)
In the future, if you have iOS beta questions or issues, you should hit up the Apple Developer Beta Forums (an excellent resource, always search before you post), or #iphonedev on irc.freenode.net for not-beta stuff (I'll be there, say hi!)
If you're developing an application for release on the App Store:
You need to be developing with Xcode 4.0 or 4.1, Apple will not accept applications built/archived with 4.2. (I know I repeated myself, but people seem to miss this often)
And, although 4.2b7 supports developing for older frameworks better than previous Xcode betas have (by allowing you to install previous versions of the simulator), you will still find yourself accidentally using 5.0 SDK functions all over the place, as the code completion/interface builder very aggressively favors all of the new hotness. This is because the beta is for trying new things, not stable application development.
This means you need to switch back to using Xcode 4.0/4.1 for production, if you don't have it installed, or you overwrote the stable version with the beta, do not try to install 4.0/4.1 on top of the 4.2 beta, weird things will happen and both versions will start acting really weird and and Xcode will crash at least twice as often.
The best thing to do in this situation, is to follow the below steps. Make sure you don't skip anything, otherwise you'll have to restart the whole process.
Make sure you have your code committed and pushed up,
uninstalling Xcode like this temporarily removes git. (This was an
issue for me at work once)
Download the installers for Xcode 4.0/.1, and 4.2 if you intend to keep experimenting. (if you already
have both downloaded, this whole process won't take more than 5
minutes on an SSD)
Uninstall the Xcode beta from the command line using this command:
sudo <Xcode>/Library/uninstall-devtools --mode=all (more info here)
Restart your computer (this is important, do not skip it!!!)
Install the most recent non-beta version of Xcode and resume development.
If you want to use both versions of Xcode (4.0/4.1 and 4.2):
You must install the beta AFTER 4.0/4.1 is installed, otherwise you will be overwriting new things with old things, and this will give you many, many obscure headaches. I also recommend restarting between installations.
You need to install 4.2 after 4.0/4.1, and to a different folder (I use /Xcode4beta/, don't put it within the folder that contains 4.0/4.1, either). I've found I learn about the new hotness best if I keep separate iOS5 branches of my work, and update what I can when I have some free time.
If you have the iOS5 beta installed on your phone, and Xcode 4.0/4.1 won't let you build to your phone:
This is because Xcode needs to grab the debug symbols from the phone before it can be used for devleopment, but only the Xcode beta can do this for an iOS5 beta device, so follow these steps:
Make sure your phone is plugged in and turned on, and that your provisioning profile/certificates all check out.
Close the project in Xcode 4.0/4.1.
Open the project back up in Xcode 4.2, and check organizer. You should either already have a green dot next to your phone (assuming all of your provisioning is working), or it should be gathering the debug symbols. Let this finish, and then build your project. It doesn't need to be a successful build, nor do you have to install the application to the phone, sometimes you don't even need to build, Xcode can be a fickle mistress.
Close the project in Xcode 4.2.
Open the project back up in Xcode 4.0, you should now be able to build and install to your phone as you normally would.
Xcode 4.0/4.1 should now be able to use your device for development until you restart the computer.
Resolution is here:
How can I fix "Freeform Size simulated metrics are not available prior to Xcode 4.2" warnings?
You just need to change the development version of your xib file to Xcode 4.2 (default is Xcode 4.1)
View Controller and Navigation Controller setting or options name ( attributes inspector )
Define Context ( Checked ) unchecked.
I recently upgraded XCode to run iOS 4.2 from iOS 3.2. However, now, when I try to run my iPad app, it appears as an iPhone app in the simulator! It appears as the smaller box with the option to expand 2x. Does anyone know why this would be so?
In addition, although the application builds and runs (albeit incorrectly), XCode still says that the Base SDK is missing. I have gone into the Build Info for the target and the project and set the following:
Base SDK: Latest iOS (currently set to iOS 4.2)
Targeted Device Family: iPad
iOS Deployment Target: iOS 3.2
Edit Thanks a lot for the comments; now there is no longer a Base SDK missing, but unfortunately, the app still runs as an iPhone app...
When I load a UISplitViewController, I get an exception 'UISplitViewController is only supported when running under UIUserInterfaceIdiomPad'.
This all seems very strange to me. Any help is greatly appreciated.
Thanks
The installed app could be broken.
What happens when you delete the app from the Simulator and do a clean build and run?
The Simulator could be broken.
What happens when you create a new different iPad app from an Xcode template?
You configuration could be broken, or you could have different settings for different targets and builds than you want, or the wrong plist or plist keys, or the wrong xib. If the new template app works, compare these one by one.
I eventually was able to fix this problem. I attempted all the methods outlined by the other answerers, but none of them worked. However, when I upgraded to XCode 4, the problem fixed itself.
I honestly don't know what changes to my app were made by this upgrade, and I am still baffled at why the project was not compiling before. I suppose upgrading your environment is one (somewhat unsatisfying) way to fix this sort of bug....
Check that you have set the appropriate settings for the current build target as well as the base project. So from the project menu:
Edit Project Settings
Edit Active Target blah
I have often forgotten to check the settings for the current target and had a similar experience.