2010-01-04 35 views
29

Tôi đang gửi Thông báo đẩy tới ứng dụng iPhone của mình và tôi muốn một bộ hướng dẫn khác để thực thi tùy thuộc vào việc ứng dụng đã được khởi chạy hay chưa. Tôi mới phát triển iPhone, và trong khi tôi nghi ngờ UIApplication hoặc lớp AppDelegate của dự án của tôi có giải pháp, tôi đã không tìm thấy câu trả lời hay. Có cách nào dễ dàng để kiểm tra điều này không?Làm cách nào để biết ứng dụng iPhone của tôi có đang chạy khi nhận được Thông báo đẩy không?

Trả lời

18

Các UIApplication đại biểu có phương pháp

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

mà bạn cần phải thực hiện. Điều này nhận được thông báo khi ứng dụng đang chạy.

Nếu ứng dụng của bạn hiện không chạy và thông báo nhận được sau đó ứng dụng của bạn có thể được tung ra với

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

với các chi tiết thông báo tổ chức trong từ điển launchOptions. nếu từ điển là 0 thì người dùng khai thác biểu tượng ứng dụng như bình thường.

2

Các tài liệu của Apple cho thông báo đẩy giải thích điều này:

Tuy nhiên, có hai tình huống mà applicationDidFinishLaunching: không phải là một trang web thực hiện phù hợp:

  • ứng dụng đang chạy khi thông báo đến.
  • Tải trọng thông báo chứa dữ liệu tùy chỉnh mà ứng dụng có thể sử dụng.

Trong trường hợp đầu tiên, nơi ứng dụng đang chạy khi hệ điều hành iPhone nhận được thông báo từ xa, bạn nên triển khai ứng dụng: didReceiveRemoteNotification: phương thức UIApplicationDelegate nếu bạn muốn tải xuống dữ liệu ngay lập tức. Sau khi tải xuống, hãy đảm bảo xóa huy hiệu khỏi biểu tượng ứng dụng. (Nếu ứng dụng của bạn thường xuyên kiểm tra với nhà cung cấp của mình để có dữ liệu mới, việc triển khai phương pháp này có thể không cần thiết.)

Điều này có nghĩa là nếu ứng dụng của bạn đang chạy, ứng dụng của bạn đang chạy.

76

Đây là cách thích hợp hơn để xử lý trạng thái hoạt động/không hoạt động của ứng dụng.

- (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: được gọi khi ứng dụng đang chạy, vâng, nhưng khi nó được treo, các iOS chăm sóc đưa lên huy hiệu, vv Nếu ứng dụng là ở mặt trước, hệ điều hành không có gì và chỉ gọi số didReceiveRemoteNotification: của bạn.

6

Nếu bạn đang đi để kiểm tra applicationState trên iOS ít hơn 4, bạn sẽ cần phải kiểm tra xem applicationState được hỗ trợ:

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

Tùy thuộc vào những gì bạn có nghĩa là bằng cách "ra mắt", bạn đang tìm kiếm một trong hai :

  • câu trả lời của Kevin ở trên (phân biệt giữa phóng hay không phóng)
  • hay này (phân biệt giữa đình chỉ hoặc hoạt động, nhưng đã đưa ra):

Sử dụng cờ được đặt đúng khi ứng dụng hoạt động và sai khi ứng dụng không hoạt động.

Flag (trong tập tin tiêu đề [h]):

BOOL applicationIsActive; 

Mã (trong tập tin thực hiện [.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 
    } 

này hoạt động bởi vì khi ứng dụng bị đình chỉ, các Hệ điều hành gọi "applicationDidReceiveRemoteNotification" trước khi nó gọi "applicationDidBecomeActive" trong quá trình "wake-up".

Câu trả lời "hoàn chỉnh" thực sự là câu trả lời của Kevin cộng với câu trả lời này.

Hy vọng điều này sẽ hữu ích.

+0

Đây là một gd. Cảm ơn –

Các vấn đề liên quan