2011-08-24 13 views
29

Khi nhận được một UILocalNotificationXác định nếu UILocalNotification bắn với ứng dụng trong foreground hoặc background

  1. Phương pháp application:DidReceiveLocalNotification được gọi khi ứng dụng trong Foreground.
  2. Khi ứng dụng ở dưới nền, ứng dụng sẽ mở ứng dụng và sau đó gọi application:DidReceiveLocalNotification.

Làm cách nào để xác định một trong những trường hợp này đang diễn ra? Tôi muốn đối xử với họ một cách khác biệt.

Nếu ứng dụng ở dưới nền, sau đó người dùng cho biết họ muốn xem sự kiện. Vì vậy, trong application:DidReceiveLocalNotification Tôi không muốn hỏi lại họ, tôi chỉ muốn đưa họ đến sự kiện.

Nhưng nếu ứng dụng nằm trong Foreground khi thông báo kích hoạt và gọi application:DidReceiveLocalNotification, tôi muốn hỏi người dùng xem họ có muốn xem sự kiện hay không.

Về bản chất tôi sẽ có:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 

if (appLauncedFromBackground) 
    // go to event 
else 
    // ask if user wants to view event 

} 

Tôi đã nghĩ đến việc viết một giá trị bool cho một NSUserDefault bên applicationWillEnterForeground:application và sau đó đọc và đặt nó bên application:DidReceiveLocalNotification. Nhưng tôi nghĩ nếu có một cách để kiểm tra, đó sẽ là một con đường tốt hơn nhiều.

Cảm ơn, Mark

EDIT * ** * ** * ** * ** * ** * ** * ** * ** * ** * **

Cảm ơn xuzhe nhưng điều đó sẽ không hoạt động trong tình huống này. Dưới đây là chi tiết hơn một chút có thể giải thích tại sao nó không hoạt động và có thể giúp ai đó trả lời câu hỏi này cho tôi:

Tôi đang đặt ở đây là sự kiện như sự kiện lịch được lên kế hoạch kích hoạt tại người dùng được chọn vì vậy khi lên lịch thông báo, tôi sẽ không biết người dùng sẽ làm gì khi thông báo kích hoạt. Tôi đang sử dụng userInfo của thông báo để lưu trữ dữ liệu về sự kiện được lên lịch nhưng đặt giá trị như inBackground như được đề xuất sẽ không hoạt động.

Tôi biết đó sẽ là một trong hai tình huống nếu người dùng quyết định họ muốn "xem" sự kiện. (tất cả điều này sẽ cho rằng ứng dụng ở chế độ nền hoặc tiền cảnh và KHÔNG thoát).

1 - Nếu nó kích hoạt trong khi ứng dụng không được sử dụng & & ứng dụng ở chế độ nền và không thoát, iOS sẽ thông báo cho người dùng rằng sự kiện đã xảy ra và cung cấp tùy chọn để chuyển sang ứng dụng có trách nhiệm (là của tôi trong trường hợp này). Tại thời điểm đó giả sử người dùng nói "có đưa tôi đến ứng dụng tuyệt vời này" nó sẽ mở ứng dụng từ nền và gọi ứng dụng: DidReceiveLocalNotification nơi tôi có thể nhận được tất cả thông báo userInfo.

2 - Người dùng, tình cờ, xảy ra trong ứng dụng của tôi khi sự kiện được lên lịch diễn ra. Tại thời điểm đó, ứng dụng: Phương thức DidReceiveLocalNotification được gọi lại, nơi tôi có thể nhận được tất cả thông báo userInfo.

Nhưng đó là vào thời điểm này mà tôi muốn biết trong hai kịch bản chỉ diễn ra 1 hoặc 2.

Hope chi tiết bổ sung này về việc sử dụng của tôi về UILocalNotification sẽ giúp trong việc trả lời câu hỏi này. Cảm ơn trước - dấu ấn

END EDIT * ** * ** * ** * ** * ** * ** * ** * ** * ***

Trả lời

46

Có lẽ cách dễ nhất là khi ứng dụng của bạn ở trên Foreground, không gửi LocalNotification nhưng chỉ đưa người dùng của bạn đến sự kiện.

Nhưng nếu bạn khăng khăng làm điều đó bằng cách sử dụng LocalNotification, đây là cách dễ dàng để phát hiện trạng thái ứng dụng của bạn khi UILocalNotification được kích hoạt.

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 
    //[super application:application didReceiveLocalNotification:notification]; // In most case, you don't need this line 
    UIApplicationState state = [application applicationState]; 
    if (state == UIApplicationStateInactive) { 
     // Application was in the background when notification was delivered. 
    } else { 

    } 
} 
+2

Tôi đã chỉnh sửa câu hỏi để giúp giải thích rõ hơn. Và cảm ơn, @ xuzhe nhưng điều này sẽ không làm việc cho tôi. Tôi không thiết lập LocalNotification, nó là một UILocalNotification đã được lên kế hoạch để khởi động vào một số ngày. Do đó, tôi không thể xác định người dùng sẽ làm gì vào thời điểm đó. –

+0

Đã chỉnh sửa lại câu trả lời. Bạn có thể dễ dàng kiểm tra trạng thái của ứng dụng bằng cách sử dụng thuộc tính UIApplicationState. – xuzhe

+0

Rất đẹp. Đã khắc phục sự cố tôi đã có trong một thời gian. –

1

Đây là những gì tôi được bổ sung vào cơ thể của các chức năng này ... application didFinishLaunchingWithOptions:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
UILocalNotification *localNotif = 
[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 
if (localNotif) { //launched from notification 
    [userDefaults setBool:YES forKey:@"deactivate in-app notification"]; 
    [userDefaults synchronize]; 
} 
else{ 
    [userDefaults setBool:NO forKey:@"deactivate in-app notification"]; 
    [userDefaults synchronize]; 
} 

Trong applicationDidEnterBackground:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
[userDefaults setBool:YES forKey:@"deactivate in-app notification"]; 
[userDefaults synchronize]; 

Trong applicationWillEnterForeground:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
[userDefaults setBool:YES forKey:@"deactivate in-app notification"]; 
[userDefaults synchronize]; 

applicationDidBecomeActive:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
[userDefaults setBool:NO forKey:@"deactivate in-app notification"]; 
[userDefaults synchronize]; 

didReceiveLocalNotification:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
if(![userDefaults boolForKey:@"deactivate in-app notification"]){ 
    UIAlertView* alert= [[UIAlertView alloc]initWithTitle:@"My App" message:notif.alertBody delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 

    NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
    [userDefaults setBool:NO forKey:@"deactivate in-app notification"]; 
    [userDefaults synchronize]; 
} 

Bây giờ hai thông báo đã mất hết (đặc biệt là một trong những xuất hiện khi ứng dụng ở chế độ nền và bạn mở nó từ thông báo cảnh báo.

1

Trong didReceiveLocalNotification bạn có thể kiểm tra trạng thái ứng dụng:

[UIApplication shareApplication].applicationState

Nếu đó là bằng UIApplicationStateInactive bạn biết rằng ứng dụng là ở chế độ nền và người dùng mở nó với các thông báo cảnh báo địa phương.

nếu đó là UIApplicationStateActive bạn có thể muốn hiển thị cảnh báo của riêng bạn cho người dùng.

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