2013-08-01 25 views
10

Tôi đang làm việc trên một ứng dụng sẽ không hoạt động nếu chấm dứt. Nó có một số tác vụ nền. Tôi muốn hiển thị thông báo địa phương nếu ứng dụng bị chấm dứt. Có những ứng dụng mà làm điều này có nghĩa là điều này là doable. Nhưng tôi không thể tìm ra cách nào.Thông báo địa phương về việc chấm dứt đơn đăng ký

Tôi đã cố gắng thiết lập thông báo cục bộ trong ứng dụngWillTerminate: phương thức appdelegate cũng như thêm thông báo chấm dứt ứng dụng trong trình xem của tôi nhưng không có phương thức nào được gọi khi ứng dụng thực sự bị chấm dứt.

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    NSLog(@"terminated"); 
    UIApplication * app = [UIApplication sharedApplication]; 
    NSDate *date = [[NSDate date] dateByAddingTimeInterval:15]; 
    UILocalNotification *alarm = [[UILocalNotification alloc] init] ; 
    if (alarm) { 
     alarm.fireDate = [NSDate date]; 
     alarm.timeZone = [NSTimeZone defaultTimeZone]; 
     alarm.repeatInterval = 0; 
     alarm.alertBody = @"This app does not work if terminated"; 
     alarm.alertAction = @"Open"; 
     [app scheduleLocalNotification:alarm]; 
    } 

    [app presentLocalNotificationNow:alarm]; 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
} 

Mọi trợ giúp đều tuyệt vời.

Cảm ơn bạn đã thăng cấp !!!

Trả lời

3

Bạn sẽ không nhận được bất kỳ thông báo nào khi nó bị chấm dứt, khi ứng dụng của bạn bị tạm dừng trong nền.

iOS sẽ gửi tín hiệu kill -9 cho tiến trình ứng dụng của bạn và ứng dụng của bạn vừa bị giết, đây là điều tương tự xảy ra khi người dùng giết ứng dụng của bạn từ khay nạp nhanh.

Từ Apple documentation:

Thậm chí nếu bạn phát triển ứng dụng của bạn đang sử dụng iOS SDK 4 và sau đó, bạn vẫn phải được chuẩn bị cho ứng dụng của bạn bị giết mà không cần bất kỳ thông báo. Người dùng có thể tiêu diệt ứng dụng một cách rõ ràng bằng giao diện người dùng đa nhiệm. Ngoài ra, nếu bộ nhớ bị hạn chế, hệ thống có thể xóa ứng dụng khỏi bộ nhớ để tạo thêm không gian. Ứng dụng bị tạm ngưng không được thông báo về việc kết thúc nhưng nếu ứng dụng của bạn hiện đang chạy ở chế độ nền trạng thái (và không bị treo), hệ thống sẽ gọi phương thức applicationWillTerminate: của ứng dụng của bạn. Ứng dụng của bạn không thể yêu cầu thời gian thực thi nền bổ sung từ phương pháp này.

+0

sau đó làm thế nào để các ứng dụng khác như ngủ nếu u có thể làm điều này? – Swati

+0

Không chắc chắn, tôi chỉ biết rằng khi hệ thống giết chết một ứng dụng không được thông báo về nó và quá trình này chỉ dừng lại và bộ nhớ bị xóa. – rckoenes

+0

việc sử dụng ứng dụngWillTerminate là gì? – Swati

3

Tôi đã gặp vấn đề tương tự như chính bạn. Tuy nhiên, tôi phát hiện ra nếu tôi không thiết lập một fireDate nó bắt đầu làm việc.

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
//Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground: 

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1 
    if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1){ 
     //Annoy The User - Set a badge 
     [application setApplicationIconBadgeNumber:1]; 

     //Try and alert the user 
     UILocalNotification *notification = [[UILocalNotification alloc] init]; 
     notification.alertBody = @"Tracking disabled. Tap to resume."; 
     notification.soundName = UILocalNotificationDefaultSoundName; 
     [application scheduleLocalNotification:notification]; 
    } 
#endif 
} 

Tôi phải cảnh báo bạn, mặc dù nó không hoạt động trên ứng dụng trống. Nó hoạt động trên ứng dụng của tôi có nhiều khung nhìn trong bộ nhớ, do đó nó phải liên quan đến lượng thời gian cần để giải quyết bộ nhớ của nó.

W

+2

là chính xác. Bạn có thể chỉ cần thêm sleep (2) vào applicationWillTerminate: – imcc

10

Ứng dụng có thể tạo ra một thông báo địa phương tại một "tương lai" ngày và thời gian mà có thể được sử dụng để thông báo cho người dùng rằng các ứng dụng đã được chấm dứt. Nếu sau đó nhấn vào ứng dụng, họ có thể khởi động lại ứng dụng của bạn.

Tính năng này hoạt động trong ứng dụng của tôi sử dụng/yêu cầu Bluetooth Central trong info.plist (vì vậy nó sẽ chạy ở chế độ nền). Tôi cho rằng bạn cũng sẽ cấu hình ứng dụng của mình để chạy trong background trong info.plist của bạn.

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
    // Schedule an alarm here to warn the user that they have terminated an application and if they want to re-activate it. 

    NSDate * theDate = [[NSDate date] dateByAddingTimeInterval:10]; // set a localnotificaiton for 10 seconds 

    UIApplication* app = [UIApplication sharedApplication]; 
    NSArray* oldNotifications = [app scheduledLocalNotifications]; 


    // Clear out the old notification before scheduling a new one. 
    if ([oldNotifications count] > 0) 
     [app cancelAllLocalNotifications]; 

    // Create a new notification. 
    UILocalNotification* alarm = [[UILocalNotification alloc] init]; 
    if (alarm) 
    { 
     alarm.fireDate = theDate; 
     alarm.timeZone = [NSTimeZone defaultTimeZone]; 
     alarm.repeatInterval = 0; 
     alarm.soundName = @"sonar"; 
     alarm.alertBody [email protected]"Background uploads are disabled. Tap here to re-activate uploads." ; 

     [app scheduleLocalNotification:alarm]; 
    } 

} 
+0

Xin chào, tôi có một ứng dụng tương tự mà tôi đang làm việc với BLE. Nhưng phương thức applicationWillTerminate không bao giờ được gọi. Lời khuyên nào? – Amit

+0

Bạn kiểm tra ứng dụngWillTerminate đang được gọi như thế nào? Làm thế nào bạn quiting ứng dụng? –

+0

Làm việc cho tôi. Cảm ơn bạn. – viral

0

Từ ứng dụng bấm đúp vào nút home và swipe để giết ứng dụng luôn gọi applicationWillTerminate.Nếu bạn nhấn một lần và gửi ứng dụng ở chế độ nền và sau đó nhấn đúp lần nữa để vuốt và xóa ứng dụng, applicationWillTerminate có thể không được gọi mỗi lần.

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
     UILocalNotification *notification = [[UILocalNotification alloc] init]; 
     notification.userInfo = [NSDictionary dictionaryWithObject:@"killed.app" forKey:@"Killed"]; 
     notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:2]; // Give some time for firing the notification at least 2 seconds. 
     notification.alertBody = @"App is killed."; 
     notification.soundName = UILocalNotificationDefaultSoundName; 
     notification.timeZone = [NSTimeZone systemTimeZone]; 
     [[UIApplication sharedApplication] scheduleLocalNotification:notification]; 
     sleep(1); // I noticed that adding sleep is required as it makes sure the notification is set before the app exits. 
} 
0

tôi đã có thể lên lịch thông báo địa phương trong appWillTerminate, sử dụng mã dưới đây:

let localNotification = UILocalNotification.init() 
    localNotification.fireDate = Date.init(timeIntervalSince1970: Date().timeIntervalSince1970 + 1.5) 
    localNotification.timeZone = TimeZone.current 
    localNotification.repeatInterval = NSCalendar.Unit(rawValue: 0) 
    localNotification.alertBody = "Did terminate app" 
    localNotification.soundName = "sonar" 
    UIApplication.shared.scheduleLocalNotification(localNotification) 
    // block main thread 
    DispatchQueue.global().async { 
     sleep(1) 
     DispatchQueue.main.sync { 
      CFRunLoopStop(CFRunLoopGetCurrent()) 
     } 
    } 
    CFRunLoopRun() 
Các vấn đề liên quan