我試圖在應用程序終止時響應位置更新。 Apple's documentation狀態:CLLocationManager`didUpdateToLocation`在應用程序終止時不會調用
IOS支持到是 懸浮或不再運行的應用程序的傳遞位置的事件。
報告還指出,startUpdatingLocation
可以在後臺模式下使用的位置更新是
然而,當應用程序在前臺還是在運行我didUpdateToLocation
方法只叫背景。當我終止應用程序時,它永遠不會處理位置更新。我已經在幾個模擬設備(iPhone 6,7,8,X)以及真正的iPhone 5s上測試了這個功能。我也確認setAllowsBackgroundLocationUpdates
被調用。
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
請注意,委託方法'didUpdateToLocation'已棄用。您應該使用'didUpdateLocations' – Paulw11