2011-02-07 26 views
6

Ứng dụng của tôi có chức năng báo thức bằng UILocalNotification và ứng dụng hoạt động tuyệt vời. Tuy nhiên, nếu người dùng gỡ cài đặt ứng dụng, sau đó REINSTALLS, người dùng sẽ nhận được tất cả thông báo "ở giữa" cùng một lúc.UILocalNotification cháy sau khi cài đặt lại ứng dụng

tôi đã cố gắng gọi:

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 

nếu đây là lần đầu tiên ứng dụng được đưa ra, nhưng nó không giúp đỡ, bởi vì nhận được thông báo ngay cả trước khi ứng dụng: didFinishLaunchingWithOptions: được gọi.

Điều này còn tồi tệ hơn trong 4.0 khi báo thức được lặp lại ngay cả khi người dùng đã xóa ứng dụng, nhưng ít nhất lỗi đó đã được Apple ấn định trong bản phát hành sau. Tuy nhiên bây giờ tôi đang mắc kẹt với điều này. Bất cứ ai có một ý tưởng?

+0

Xin chào, bạn có nhận được giải pháp nào cho sự cố này không ... –

Trả lời

6

Đây thực sự là lỗi trong iPhone. Nếu bạn đã gỡ bỏ ứng dụng và cài đặt nó sau này, nó sẽ có cùng một id ứng dụng, vì vậy khi ứng dụng được cài đặt lại tất cả các thông báo cục bộ trong quá khứ đã được kích hoạt ngay cả khi bạn không mở ứng dụng.

+0

Đối với người dùng iOS 4.0, 4.1 ..., bạn có nghĩ rằng có cách giải quyết nào không? Bởi vì nó sẽ cực kỳ khó chịu để nhận được những báo động lặp đi lặp lại mà không cần phải vô hiệu hóa nó (4.0). –

+0

không có cách nào khác, đó là lý do tại sao họ đã gửi lỗi – KingofBliss

+0

Tôi vẫn thấy hành vi này là 4.3, đặc biệt khi chạy (cài đặt) qua XCode. – Gregir

15

Theo Apple, đây không phải là lỗi (tôi đã gửi báo cáo lỗi). Hệ thống giữ lại UILocalNotifications cho các ứng dụng đã gỡ cài đặt trong 24 giờ trong trường hợp người dùng đã vô tình xóa ứng dụng và khôi phục UILocalNotifications đã nói nếu ứng dụng được cài đặt lại trong khung thời gian đó.

Các giải pháp sẽ được loại bỏ tất cả UILocalNotifications khi khởi động đầu tiên, như vậy:

- (BOOL)   application: (UIApplication*) application 
didFinishLaunchingWithOptions: (NSDictionary*) launchOptions 
{ 
    if (self.isFirstRun) 
    { 
    [[UIApplication sharedApplication] cancelAllLocalNotifications]; 
    self.firstRun = NO; 
    } 

    /* Other code here */ 
    ... 
} 

tất nhiên, thực hiện firstRun setter và getter của riêng bạn để lấy/lưu vào lưu trữ liên tục, giống như NSUserDefaults.

+0

Đây có phải là "tính năng" được ghi lại ở bất cứ đâu? –

+0

+1 Điều này có vẻ khá ngu ngốc. Ứng dụng không sở hữu thông báo khi chúng được bàn giao cho hệ điều hành, điều này rõ ràng khi bạn cố lập lịch thông báo thay vì tối đa 64. Ứng dụng phải chịu trách nhiệm lưu trữ đại diện riêng của mình về bất kỳ thông báo nào có nghĩa - không dựa trên HĐH. Nếu ứng dụng như vậy không có kiến ​​thức trước về các thông báo này thì chúng chỉ là rác. – Andreas