iphone version compatibility scanner
Ok I've been developing iphone-apps for over a year now, but there's this one thing which still really sucks.
Let's say I want to make my app compatible with iOS 3.0 I set my sdk to the newest version available and set my deployment target to 3.0
But what happens, if you by accident call a function available only in ... 3.1.x or later? Right, it simply crashes.
There are no warnings or indicators telling you, that a function is only available in later iOS-Version. And since the Emulator doesn't support versions < 4.0 it's impossible to test if the application really works. You can't even buy a new device since they already have a newer iOS installed. And even if you have an older device it's sometimes almost impossible to check each and every part of your code.
And I really need to support older versions since I know that my customers (around 2/3) still use 3.x v开发者_如何转开发ersions.
Isn't there ANY code-analyzer or something that scans the availability of all functions called within the app?
In one case the app crashed because I called
+ (id)sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending
which i a convenience method of alloc +
- (id)initWithKey:(NSString *)key ascending:(BOOL)ascending;
(Plus it's autoreleased) But sortDescriptorWithKey is only avaible in 4.0 @_@
same question here. The only thing I figured out to set the Base SDK
of Project AND Target to 3.0. Then the compiler will check if you call some not existing methods.
But the question for a scanner still exist because the method above throws me some errors when using the ASI HTTP framework. So my procedure is to
- change the SDK's to 3.0
- go through errors which underlie my own code
- change the methods to be 3.0 compatible
- set the project's
Base SDK
back to latest SDK
you probably have to install a SDK 3.0 from previous XCode version. And there is no need to set the target Base SDK
back to latest version. I have once set it to 3.0 and get no errors from ASI HTTP.
//EDIT: download links for XCode 3.2.1: Snow Leopard and Leopard
Try to check by calling respondsToSelector method
if([your_obj respondsToSelector:@selector(sortDescriptorWithKey:ascending:)]){
// call sortDescriptorWithKey
}
else
{
// call another method
}
You will receive warnings while compiling but not crashes in run time.
Try using the guidelines established in the Apple's Framework/Weak-linking guide. for functions that you can't ask the objects like in @Andriy's answer.
精彩评论