2015-10-06 20 views
7

Tôi hiển thị thông báo địa phương của tôi như thế này theo định kỳ.Phát hiện người dùng chạm vào thông báo địa phương

UILocalNotification *notification = [[UILocalNotification alloc]init]; 
[notification setAlertBody:@"Test test"]; 
[notification setUserInfo:@{@"test": @"test"}]; 
[[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 

Tôi cần phát hiện lại thông báo đó và tôi định viết ở đây.

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

Luôn gọi chức năng đó cho dù người dùng nhấn vào thông báo hoặc tự động gọi ở nền trước.

Vì vậy, tôi tách riêng bằng cách sử dụng này.

if (application.applicationState == UIApplicationStateActive) 

Khi tôi hiển thị trung tâm thông báo, nó trở thành InActive. Tuy nhiên, nó vẫn gọi didReceiveLocalNotification. Tôi không thể phân biệt liệu người dùng có nhấn vào thông báo từ trung tâm thông báo hay không vì thông báo đăng bài định kỳ của tôi.

Làm cách nào tôi có thể biết rằng tôi nhấn vào thông báo (Hoặc từ trạng thái không hoạt động hoặc Trạng thái nền) trong didReceiveLocalNotification?

+0

Bạn thực sự muốn gì? –

Trả lời

7

Giả sử rằng tôi hiểu vấn đề của bạn một cách chính xác, tôi tình cờ gặp trở ngại tương tự và không thể tìm thấy giải pháp siêu sạch.

Vì vậy, tình hình nơi phương pháp sau đây

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

được gọi và applicationState bằng UIApplicationStateInactive xảy ra trong hai trường hợp:

  1. ứng dụng là ở mặt trước và thông báo vừa bị sa thải
  2. thông báo đã được kích hoạt cách đây một thời gian, trung tâm thông báo bị kéo xuống và người dùng đã nhấn vào thông báo

Một cách để phân biệt hai trường hợp này là để kiểm tra fireDate của thông báo:

notification.fireDate.timeIntervalSinceNow < 0.5 

Nếu biểu hiện này là đúng, nó rất có khả năng là trường hợp đầu tiên xảy ra. Nếu biểu thức là sai, rất có thể trường hợp thứ hai đã xảy ra.

Giải pháp này phụ thuộc vào hệ thống gửi thông báo không chậm trễ và/hoặc người dùng không đủ nhanh để nhấp vào thông báo trong trung tâm thông báo dưới 500ms kể từ khi thông báo được kích hoạt. Tôi không chắc chắn có khả năng xảy ra sự chậm trễ bắn. Tôi đoán nó có thể nếu thiết bị là dưới một số loại xử lý tải.

Tôi hy vọng có giải pháp rõ ràng hơn, hy vọng ai đó sẽ chia sẻ nó.

5

Đầu tiên hết, đọc từ Apple Documentation:

Người dùng vòi nước một nút hành động tùy chỉnh trong một thông báo trên iOS 8. Trong trường hợp này , cuộc gọi iOS hoặc là application:handleActionWithIdentifier:forRemoteNotification:completionHandler: hoặc application:handleActionWithIdentifier:forLocalNotification:completionHandler:. Trong cả hai phương pháp, bạn nhận được số nhận dạng của hành động để bạn có thể xác định nút nào người dùng đã nhấn. Bạn cũng có thể nhận được hoặc đối tượng thông báo cục bộ từ xa để bạn có thể truy xuất bất kỳ thông tin nào bạn cần xử lý hành động.

Người dùng nhấn vào nút mặc định trong cảnh báo hoặc nhấn (hoặc nhấp) biểu tượng ứng dụng . Nếu nút hành động mặc định được khai thác (trên thiết bị chạy iOS), hệ thống sẽ khởi chạy ứng dụng và ứng dụng gọi phương thức application:didFinishLaunchingWithOptions: của đại biểu, chuyển vào trọng tải thông báo (cho thông báo từ xa) hoặc đối tượng thông báo địa phương (cho các thông báo địa phương). Mặc dù application:didFinishLaunchingWithOptions: không phải là nơi tốt nhất để xử lý thông báo, việc tải trọng tại thời điểm này cung cấp cho bạn cơ hội bắt đầu quá trình cập nhật trước khi phương thức xử lý được gọi.

Second, đây là cách bạn có thể phân biệt cho dù didReceiveLocalNotification: được gọi là từ hoạt động hoặc không hoạt động nhà nước:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    UIApplicationState appState = UIApplicationStateActive; 
    if ([application respondsToSelector:@selector(applicationState)]) 
     appState = application.applicationState; 

    if (appState == UIApplicationStateActive) 
    { 
    } 
    else 
    { 
    } 
} 
-3

Sử dụng KVO key-giá trị quan sát để biết và làm điều gì đó khi nút được khai thác .

+0

Đó không phải là những gì KVO dành cho. – kalafun

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