2012-02-14 35 views
29

Giả sử tôi đặt 5 thông báo cục bộ cho ứng dụng iPhone, sau đó người dùng xóa ứng dụng. Nếu ứng dụng được cài đặt lại, nó sẽ hiển thị các thông báo trước đó.Cách xóa tất cả thông báo cục bộ khi ứng dụng bị xóa khỏi iPhone

Tôi biết đoạn mã sau xóa tất cả các thông báo

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 

Nhưng nơi nào tôi đặt mã đó để nó thực thi khi ứng dụng bị xóa?

Hoặc bất kỳ cách nào khác để giải quyết vấn đề này.

+4

thể bạn không xóa nó trên khởi động đầu tiên để thay thế? Ví dụ: nếu một cờ nhất định trong UserSettings không được đặt, bạn hủy tất cả cờ và đặt cờ? –

+0

Trong ứng dụng này tôi sử dụng cơ sở dữ liệu để lưu trữ và lấy lại đối tượng thông báo cũng –

+0

Neon .. điều này có giúp ích không? http://stackoverflow.com/questions/12369900/when-i-delete-my-ios-application-push-notification-state-remains – pordi

Trả lời

31

Như những người khác đã nói, tôi nghĩ rằng cách tốt nhất để thực hiện điều này là phải có một lá cờ trong didFinishLaunchingWithOptions trong ứng dụng ủy nhiệm kiểm tra xem đó có phải là lần khởi chạy đầu tiên hay không.

Nếu ứng dụng đã được đưa ra lần đầu tiên, bạn có thể gọi

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 

này sẽ hủy bỏ bất kỳ thông báo hiện có.

Ví dụ:

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

    // this flag will need to be stored somewhere non-volatile such as using CoreData 
    // or user defaults 
    if(flag == nil || [flag count] ==0){ 

     [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

     // update your flag so that it fails this check on any subsequent launches 
     flag = 1; 
    } 
{ 
+0

Thông báo địa phương không bị xóa tự động nếu ứng dụng bị xóa? Tôi không thấy lý do tại sao họ nên được khôi phục cài đặt ứng dụng mới? – Supertecnoboff

+1

Tôi tin rằng chúng được giữ lại trong một khoảng thời gian nhất định trong trường hợp ứng dụng được cài đặt lại. Tôi sẽ đăng tài liệu nếu tôi có thể tìm thấy nó. – DerekH

+0

Không khi xóa Thông báo sẽ không bị xóa. Tôi đã tạo một ứng dụng và tôi lên lịch một số thông báo địa phương. Sau đó, tôi đã xóa ứng dụng và cài đặt lại nhưng các thông báo vẫn tiếp tục (khoảng thời gian này không được triển khai cho các thông báo cục bộ).Đây là lý do tại sao tôi tin rằng họ được giữ lại nhưng tôi không chắc chắn về điều này (giữ lại) thời gian –

-7

Đến appDelegate.m của bạn, chức năng «didFinishLaunchingWithOptions» thêm mã này:

application.applicationIconBadgeNumber = 0; 
+1

Tôi không muốn xóa thông báo địa phương thay vì huy hiệu. –

0

Bạn có thể sử dụng để lưu trữ UIPasteboard một lá cờ như DerekH đã đề cập.
Something liên kết này:

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

    if ([self mustCancelNotifications]) { 
     [application cancelAllLocalNotifications]; 
     [self removeTag]; 
    } else { 
     // Set your local notifications 
     [self setFlag]; 
    } 

    //... 

    // Override point for customization after application launch. 
    return YES; 
} 

- (BOOL)mustCancelNotifications 
{ 
    UIPasteboard *past = [UIPasteboard generalPasteboard]; 
    NSString *s = [past valueForPasteboardType:@"my_app_local_notifications"]; 
    if (s) { 
     return YES; 
    } 
    return NO; 
} 

- (void)setFlag 
{ 
    UIPasteboard *past = [UIPasteboard generalPasteboard]; 
    [past setValue:@"dummy" forPasteboardType:@"my_app_local_notifications"]; 
} 

- (void)removeFlag 
{ 
    UIPasteboard *past = [UIPasteboard generalPasteboard]; 
    [past setData:nil forPasteboardType:@"my_app_local_notifications"]; 
} 
3

Dưới đây là những gì tôi đã làm:

In Your appdelegate

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

    //Check if its first time 
    if (![[NSUserDefaults standardUserDefaults] objectForKey:@"is_first_time"]) { 
     [application cancelAllLocalNotifications]; // Restart the Local Notifications list 
     [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"is_first_time"]; 
    } 

    return YES; 
} 

Hy vọng nó sẽ giúp!

3

Đối nhanh chóng 3.0 bạn có thể sử dụng

if (isFirstLaunch){ 
    UNUserNotificationCenter.current().removeAllPendingNotificationRequests() 
} 

Sau đó thêm phương pháp này để kiểm tra xem đây là thời gian đầu tiên

var isFirstLaunch: Bool { 
    get { 
     if  (NSUserDefaults.standardUserDefaults().objectForKey("firstLaunchDate") == nil) { 
      NSUserDefaults.standardUserDefaults().setObject(NSDate(),  forKey: "firstLaunchDate") 
      NSUserDefaults.standardUserDefaults().synchronize() 
      return true 
     } 
     return false 
    } 
} 
+0

Lưu ý, mã này là dành cho> = iOS 10 –

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