2010-01-04 47 views

回答

18

的UIApplication的代表有您需要實現方法

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

。這會在應用程序運行時收到通知。

如果您的應用程序當前未運行,並收到通知,然後你的應用程序可以與

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

與在launchOptions字典召開的通知細節展開。如果字典是零,那麼用戶正常點擊應用程序圖標。

2

蘋果文檔推送通知解釋了這一點:

但是,有以下兩種情況下的applicationDidFinishLaunching:是不是一個合適的實現網站:當通知到達

  • 應用程序運行。
  • 通知有效載荷包含應用程序可以使用的自定義數據。

在第一種情況下,當iPhone OS收到遠程通知時應用程序正在運行,如果要立即下載數據,則應該實現UIApplicationDelegate的application:didReceiveRemoteNotification:方法。下載後,請務必從應用程序圖標中移除徽章。 (如果你的應用程序經常與它的供應商對新的數據檢查,實施這種方法可能不是必要的。)

這意味着,如果你的應用程序:didReceiveRemoteNotification:委託方法被調用時,你的應用程序正在運行。

76

下面是處理應用程序活動/非活動狀態的更合適的方法。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
     // check for the app state 
     UIApplicationState state = [application applicationState]; 

     if (state == UIApplicationStateActive) { 
      //the app is in the foreground, so here you do your stuff since the OS does not do it for you 
      //navigate the "aps" dictionary looking for "loc-args" and "loc-key", for example, or your personal payload) 
     } 

    application.applicationIconBadgeNumber = 0; 
} 

didReceiveRemoteNotification:應用程序運行時被調用,是的,但是當它被暫停時,iOS負責搭徽章等。如果應用程序是在前臺的,操作系統不執行任何操作,只需撥打你的didReceiveRemoteNotification:即可。

6

如果你要檢查applicationState iOS上小於4,你需要檢查applicationState支持:

if ([application respondsToSelector:@selector(applicationState)]){ 
    // Safe to check applicationState 
    UIApplicationState state = [application applicationState]; 
} 
26

取決於你所說的「推出」什麼,你要麼找:

  • Kevin的回答上述(區分發射之間與否發射)
  • 或該(懸浮或有源的,但已經啓動之間進行區分):

使用在應用程序變爲活動狀態時設置爲true的標誌,並在應用程序不活動時使用false。

標誌(在頭文件[·H]):

BOOL applicationIsActive; 

代碼(在實現文件[.M]):

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    applicationIsActive = YES; 
} 

- (void)applicationWillResignActive:(UIApplication *)application { 
    applicationIsActive = NO; 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    if (applicationIsActive) { 
     // Handle notification in app active state here 
    } 
    else { 
     // Handle notification in app suspended state here 
    } 

此操作,因爲當應用程序暫停時,所述OS在「喚醒」過程中調用「applicationDidBecomeActive」之前調用「applicationDidReceiveRemoteNotification」。

「完整」答案實際上是凱文的答案加上這個答案。

希望這會有所幫助。

+0

這是一個gd之一。謝謝 – 2011-08-30 06:03:19

相關問題