UIApplication單例
[UIApplication sharedApplication];你的app單例對象
int main(int argc, char *argv[])
{
@autoreleasepool {
//UIApplicationMain函數會為你的app創建一個全局的UIApplication單例對象.
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplication應用級方法
- 設置應用程序圖標右上角的紅色提醒數字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
代碼實現:
UIApplication *app = [UIApplication sharedApplication];
app.applicationIconBadgeNumber = 10;
// 創建通知對象
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
// 注冊用戶通知
[app registerUserNotificationSettings:setting];
- 設置聯網指示器的可見性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
代碼實現:
app.networkActivityIndicatorVisible= YES;
- 管理狀態欄
從iOS7開始,系統提供了2種管理狀態欄的方式
a.(推薦)通過UIViewController管理(每一個UIViewController都可以擁有自己不同的狀態欄)在iOS7中,默認情況下,狀態欄都是由UIViewController管理的,UIViewController實現下列方法就可以輕松管理狀態欄的可見性和樣式
狀態欄的樣式 - (UIStatusBarStyle)preferredStatusBarStyle;
狀態欄的可見性 -(BOOL)prefersStatusBarHidden;
#pragma mark-設置狀態欄的樣式
-(UIStatusBarStyle)preferredStatusBarStyle
{
//設置為白色
//return UIStatusBarStyleLightContent;
//默認為黑色
return UIStatusBarStyleDefault;
}
#pragma mark-設置狀態欄是否隱藏(否)
-(BOOL)prefersStatusBarHidden
{
return NO;
}
注意:UINavigationController下的childViewController若要控制狀態欄,需寫一個UINavigationController的子類,重寫childViewControllerForStatusBarStyle方法。
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
b.通過UIApplication管理(一個應用程序的狀態欄都由它統一管理)如果想利用UIApplication來管理狀態欄,首先得修改Info.plist的設置,添加選中行,并設置為NO即可,這篇文章中有詳細介紹iOS中用application 來管理電池欄狀態

代碼:
//通過sharedApplication獲取該程序的UIApplication對象
UIApplication *app=[UIApplication sharedApplication];
//設置狀態欄的樣式
//app.statusBarStyle=UIStatusBarStyleDefault;//默認(黑色)
//設置為白色+動畫效果
[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
//設置狀態欄是否隱藏
app.statusBarHidden=YES;
//設置狀態欄是否隱藏+動畫效果
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
- openURL:方法
UIApplication有個功能十分強大的openURL:方法
- (BOOL)openURL:(NSURL*)url;
openURL:方法的部分功能有
UIApplication *app = [UIApplicationsharedApplication];
打電話 [app openURL:[NSURLURLWithString:@"tel://110"]];
發短信 [app openURL:[NSURLURLWithString:@"sms://10086"]];
發郵件 [app openURL:[NSURLURLWithString:@"mailto://xxcc@fox.com"]];
打開一個網頁資源 [app openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
打開其他app程序 openURL方法,可以打開其他APP。
- 判斷程序運行狀態
//判斷程序運行狀態
/*
UIApplicationStateActive,
UIApplicationStateInactive,
UIApplicationStateBackground
*/
UIApplication *app = [UIApplication sharedApplication];
if(app.applicationState ==UIApplicationStateInactive){
NSLog(@"程序在運行狀態");
}
- 阻止屏幕變暗進入休眠狀態
//阻止屏幕變暗,慎重使用本功能,因為非常耗電。
UIApplication *app = [UIApplication sharedApplication];
app.idleTimerDisabled =YES;
UIApplication Delegate
當app收到干擾,例如程序運行中來電等,就會產生一些系統事件,這時UIApplicaiton會通知它的代理delegate對象,讓delegate代理來處理這些系統事件。
delegate可以處理的時間包括
1.應用程序的生命周期事件(如程序啟動和關閉)
2.系統事件(如來電)
3.內存警告(用處較多)
AppDelegate監聽UIApplication生命周期
// AppDelegate:監聽應用程序的生命周期
// 以下方法就是應用程序的生命周期方法
// 應用程序啟動完成的時候就會調用AppDelegate的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"%s",__func__);
return YES;
}
// 當應用程序失去焦點的時候調用
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"%s",__func__);
}
// 當應用程序進入后臺的時候調用
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"%s",__func__);
// 保存一些信息
}
// 當應用程序進入前臺的時候調用
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"%s",__func__);
}
// 當應用程序完全獲取焦點的時候調用
// 只有當應用程序完全獲取焦點的時候,才能夠與用戶交互
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"%s",__func__);
}
// 當應用程序關閉的時候
- (void)applicationWillTerminate:(UIApplication *)application {
}
//收到內存警告時調用
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
}
AppDelegate獲取DeviceToken
DeviceToken用于上傳給服務器,服務器向蘋果APNs發起推送服務。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//去除編譯警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wdeprecated-declarations"
//注冊遠程通知
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerForRemoteNotifications)])
{
UIUserNotificationType types = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
UIRemoteNotificationType types = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
}
#pragma clang diagnostic pop
return YES;
}
//需要注冊遠程通知才會回調該方法。
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"%@",[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @""]);
//上傳給第三方服務器
[[NIMSDK sharedSDK] updateApnsToken:deviceToken];
}
AppDelegate處理其他app打開自己
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
BOOL result = [UMSocialSnsService handleOpenURL:url];
if (result == FALSE) {
if ([url.host isEqualToString:@"safepay"]) {
//跳轉支付寶錢包進行支付,處理支付結果,此處不處理,留給需要處理的地方
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:nil];
}
}
return result;
}
AppDelegate處理點擊通知打開
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler{
}
AppDelegate處理屏幕旋轉
// 強制旋轉
+(void)transtoRotation:(UIDeviceOrientation)deviceOrientation{
// 豎屏點擊按鈕 旋轉到橫屏
UIDevice *device = [UIDevice currentDevice] ;
if (UIDeviceOrientationIsLandscape(deviceOrientation)) {
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
}else{
// 橫屏點擊按鈕, 旋轉到豎屏
if (UIDeviceOrientationIsPortrait(device.orientation) && !UIDeviceOrientationIsPortrait([FMHelper shareHelper].deviceOrientation)) {
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];//這句話是防止手動先把設備置為豎屏,導致下面的語句失效.
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];
}else{
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];
}
}
}
#pragma mark - 屏幕旋轉代理
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if ([FMHelper isAllowRotation]) {
return UIInterfaceOrientationMaskAllButUpsideDown;
} else {
return UIInterfaceOrientationMaskPortrait;
}
}
-(void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation{
NSLog(@"didChangeStatusBarOrientation");
if ([FMHelper shareHelper].didRotationBlock) {
[FMHelper shareHelper].didRotationBlock(self);
}
}
-(void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration{
NSLog(@"willChangeStatusBarOrientation");
[FMHelper setDeviceOrientation:(UIDeviceOrientation)newStatusBarOrientation];
}