2017-10-17 2 views
0

Ich versuche auf Standortaktualisierungen zu reagieren, wenn meine App beendet wird. Apple's documentation Zustände:CLLocationManager `didUpdateToLocation` wird nicht aufgerufen, wenn App beendet wird

iOS unterstützt die Lieferung von Standort Ereignis zu Anwendungen, die ausgesetzt oder nicht mehr ausgeführt werden.

Darin heißt es auch, dass startUpdatingLocation

Standortaktualisierungen im Hintergrundmodus verwenden kann JA

Allerdings ist meine didUpdateToLocation Methode nur aufgerufen, wenn der App im Vordergrund oder im Rennen Hintergrund. Wenn ich die App beende, wacht sie nie auf, um Standortaktualisierungen zu verarbeiten. Ich habe dies auf mehreren simulierten Geräten (iPhone 6, 7, 8, X) sowie einem echten iPhone 5s getestet. Ich habe auch bestätigt setAllowsBackgroundLocationUpdates wird aufgerufen.

AppDelegate.m

#import "AppDelegate.h" 
#import "RNFIRMessaging.h" 
#import <CoreLocation/CoreLocation.h> 

#import <React/RCTBridgeModule.h> 
#import <React/RCTBundleURLProvider.h> 
#import <React/RCTRootView.h> 
#import "NoteManager.h" 

@implementation AppDelegate { 
    UIApplication *_app; 
    NoteManager *_noteManager; 
    CLLocationManager* _locationManager; 
} 

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    NSLog(@"--- Initializing application"); 
    _app = application; 

    id<RCTBridgeDelegate> moduleInitialiser = self; 
    RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:moduleInitialiser launchOptions:launchOptions]; 

    RCTRootView *rootView = [[RCTRootView alloc] 
    initWithBridge:bridge 
    moduleName:@"GoNote" 
    initialProperties:nil 
    ]; 
    rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    UIViewController *rootViewController = [UIViewController new]; 
    rootViewController.view = rootView; 
    self.window.rootViewController = rootViewController; 
    [self.window makeKeyAndVisible]; 

    [FIRApp configure]; 
    [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self]; 
    [self setupLocationManager]; 

    return YES; 
} 

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { 
    // return [NSURL URLWithString:@"http://192.168.1.177:8081/index.ios.bundle?platform=ios"]; 
    return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 
} 

- (NSArray *)extraModulesForBridge:(RCTBridge *)bridge { 
    NSLog(@"--- extraModulesForBridge"); 
    // Initialize our native modules here 
    _noteManager = [[NoteManager alloc] initWithApp:_app]; 
    return @[ 
    _noteManager 
    ]; 
} 

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { 
    NSLog(@"--- pushNotifications willPresentNotification"); 
    [RNFIRMessaging willPresentNotification:notification withCompletionHandler:completionHandler]; 
} 

#if defined(__IPHONE_11_0) 
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { 
    NSLog(@"--- pushNotifications didReceiveNotificationResponse"); 
    [RNFIRMessaging didReceiveNotificationResponse:response withCompletionHandler:completionHandler]; 
} 
#else 
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler { 
    NSLog(@"--- pushNotifications didReceiveNotificationResponse"); 
    [RNFIRMessaging didReceiveNotificationResponse:response withCompletionHandler:completionHandler]; 
} 
#endif 

//You can skip this method if you don't want to use local notification 
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 
    NSLog(@"--- pushNotifications didReceiveLocalNotification"); 
    [RNFIRMessaging didReceiveLocalNotification:notification]; 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{ 
    NSLog(@"--- pushNotifications didReceiveLocalNotification"); 
    [RNFIRMessaging didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; 
} 

- (void) applicationDidEnterBackground:(UIApplication *)application { 
    NSLog(@"--- applicationDidEnterBackground"); 
    [_locationManager stopUpdatingLocation]; 

    __block UIBackgroundTaskIdentifier bgTask = [_app beginBackgroundTaskWithExpirationHandler:^{ 
    bgTask = UIBackgroundTaskInvalid; 
    }]; 

    [NSTimer 
    scheduledTimerWithTimeInterval: 10.0 
    target: self 
    selector: @selector(startTrackingBg) 
    userInfo: nil 
    repeats: YES 
    ]; 
} 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError*)error { 
    NSLog(@"--- (NoteManager) locationManager didFailWithError %@", error); 
} 

- (void) setupLocationManager { 
    NSLog(@"--- setupLocationManager"); 
    CLLocationManager* locationManager = _locationManager = [[CLLocationManager alloc] init]; 
    if([locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { 
    NSLog(@"--- setAllowsBackgroundLocationUpdates:YES"); 
    [locationManager setAllowsBackgroundLocationUpdates:YES]; 
    } else { 
    NSLog(@"--- setAllowsBackgroundLocationUpdates:NO"); 
    } 
    [locationManager setDelegate:self]; 
    [locationManager requestAlwaysAuthorization]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [locationManager setDistanceFilter:10]; 
    [locationManager setPausesLocationUpdatesAutomatically:NO]; 
    [locationManager startUpdatingLocation]; 
} 

- (void) startTrackingBg { 
#if !TARGET_OS_TV 
    NSLog(@"--- startTrackingBg"); 
    [_locationManager startUpdatingLocation]; 
#endif 
} 

- (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    NSLog(@"--- didUpdateToLocation"); 
    if(_noteManager != nil) { 
    [_noteManager updateLocation:newLocation]; 
    } 
} 

@end 

AppDelegate.h

#import <UIKit/UIKit.h> 
#import <React/RCTBridgeDelegate.h> 
#import <CoreLocation/CoreLocation.h> 
@import UserNotifications; 

@interface AppDelegate : UIResponder <UIApplicationDelegate, UNUserNotificationCenterDelegate, RCTBridgeDelegate, CLLocationManagerDelegate> 

@property (nonatomic, strong) UIWindow *window; 

@end 
+0

Beachten Sie, dass die Delegatmethode 'didUpdateToLocation' veraltet ist. Sie sollten 'didUpdateLocations' verwenden. – Paulw11

Antwort

2

Das genau nicht funktioniert, wie Sie es wollen. Die Standortaktualisierungen arbeiten, wenn Sie erhebliche Standortänderungen überwachen

startMonitoringSignificantLocationChanges mit()

diese Antwort Lesen Sie hier, wo jemand war fast das gleiche versuchen - Restart location updates from the background

Sie die Implementierung lesen hier https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html

+0

Je nach Anwendungszweck können Sie auch CLVisit oder die Bereichsüberwachung verwenden. Beide wecken die App im Hintergrund und rufen den Update-Speicherort auf. –

Verwandte Themen