Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling the appropriate setStatusBarHidden per iOS version

Today my app approved, but I got emails from users says it crash. I figured out that

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];

Is the problem, Because users have firmware 3.1.x this API is not working and app crash.

So I have replace it with

    if ([[[UIDevice currentDevice] systemVersion] floatValue]>=3.2)
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];
    else 
        [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];

My questions...

Is what I did the best solution?

Why XCODE did not warn me that SetStatusBarHidden withAnimation is not in 3.0 while I set my Traget OS firmware 3.0?

Do I have to check on every API to see if it is working with my Target OS?

Thank you

like image 480
iTarek Avatar asked Jun 12 '10 10:06

iTarek


3 Answers

I'd recommend you to use the following snipplet of code instead of checking against the version of the os, rather check if a selector is currently available.

if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden: withAnimation:)])
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
else 
    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
like image 52
samsam Avatar answered Nov 10 '22 14:11

samsam


Use only

[[UIApplication sharedApplication] setStatusBarHidden:YES];

instead of

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];

It works with no warning

like image 24
shah Avatar answered Nov 10 '22 15:11

shah


Unfortunately, if you are compiling with the 4.0 SDK using the simulator, the above solutions will give you a warning, which by default is treated as an error:

warning: 'setStatusBarHidden:animated:' is deprecated (declared at /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIApplication.h:267)

So you can either set 'Treat warnings as errors' to false in the build settings, or you can use macros to conditionally include the correct code. I have my base SDK set to Device 4.0, my target os is 3.1, and am using this macro:

#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
#if __IPHONE_OS_VERSION_MIN_REQUIRED > 30100
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:YES];
#else
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
#endif
#endif

Note that setStatusBarHidden:withAnimation came available in 3.2.

like image 1
Julian Avatar answered Nov 10 '22 16:11

Julian