2017-06-20 11 views
5

Aktualizuj lokalizację, gdy zadanie jest uruchamiane, gdy aplikacja działa w tle. Ale nie można wykonać zadania w trybie tła. My Kod próbki z scheduleBackgroundRefreshWithPreferredDate jest poniżejW Apple iWatch zadanie w tle nie jest wywoływane lub wyzwalane z czasem harmonogramu.

[WKExtension.sharedExtension scheduleBackgroundRefreshWithPreferredDate:[NSDate dateWithTimeIntervalSinceNow:60] userInfo:nil scheduledCompletion:^(NSError * _Nullable error) { 

     if(error == nil) { 
      NSLog(@"background refresh task re-scheduling successfuly "); 

     } else{ 

      NSLog(@"Error occurred while re-scheduling background refresh: %@",error.localizedDescription); 
     } 
    }]; 

Po zadanie harmonogram przełożyć w handleBackgroundTasks:

- (void)handleBackgroundTasks:(NSSet<WKRefreshBackgroundTask *> *)backgroundTasks 
{ 
    for (WKRefreshBackgroundTask * task in backgroundTasks) { 

     if ([task isKindOfClass:[WKApplicationRefreshBackgroundTask class]]) { 
      WKApplicationRefreshBackgroundTask *backgroundTask = (WKApplicationRefreshBackgroundTask*)task; 
      // location update methods schedule as background task 
      [self startLocationUpdate]; 
      [backgroundTask setTaskCompleted]; 

     } else if ([task isKindOfClass:[WKSnapshotRefreshBackgroundTask class]]) { 
      WKSnapshotRefreshBackgroundTask *snapshotTask = (WKSnapshotRefreshBackgroundTask*)task; 
      [snapshotTask setTaskCompletedWithDefaultStateRestored:YES estimatedSnapshotExpiration:[NSDate distantFuture] userInfo:nil]; 

     } else if ([task isKindOfClass:[WKWatchConnectivityRefreshBackgroundTask class]]) { 
      WKWatchConnectivityRefreshBackgroundTask *backgroundTask = (WKWatchConnectivityRefreshBackgroundTask*)task; 
      [backgroundTask setTaskCompleted]; 

     } else if ([task isKindOfClass:[WKURLSessionRefreshBackgroundTask class]]) { 
      WKURLSessionRefreshBackgroundTask *backgroundTask = (WKURLSessionRefreshBackgroundTask*)task; 
      [backgroundTask setTaskCompleted]; 

     } else { 
      [task setTaskCompleted]; 
     } 
    } 
} 

metod zadania Tło poniżej

-(void)startLocationUpdate { 

    locationMgr = [[CLLocationManager alloc] init]; 
    [locationMgr setDelegate:self]; 

    locationMgr.desiredAccuracy = kCLLocationAccuracyBest; 
    locationMgr.distanceFilter = kCLDistanceFilterNone; 

    // locationMgr.allowsBackgroundLocationUpdates = YES; 

    [locationMgr requestAlwaysAuthorization]; 
    [locationMgr startUpdatingLocation]; 

    [WKExtension.sharedExtension scheduleBackgroundRefreshWithPreferredDate:[NSDate dateWithTimeIntervalSinceNow:60] userInfo:nil scheduledCompletion:^(NSError * _Nullable error) { 

     if(error == nil) { 
      NSLog(@"background refresh task re-scheduling successfuly "); 

     } else{ 

      NSLog(@"Error occurred while re-scheduling background refresh: %@",error.localizedDescription); 
     } 
    }]; 

} 
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateLocations:(NSArray<CLLocation *> *)locations { 

    NSTimeInterval locationAge = -[[locations lastObject].timestamp timeIntervalSinceNow]; 

    NSLog(@"Location Age : %f",locationAge); 

    if (locationAge > 5.0) return; 

    NSLog(@"latitude: %f longitude: %f",[locations lastObject].coordinate.latitude,[locations lastObject].coordinate.longitude); 

    //NSString *strLocation = [NSString stringWithFormat:@"%f,%f" ,[locations lastObject].coordinate.latitude , [locations lastObject].coordinate.longitude]; 
    NSString *strLocation = @"bgLocation"; 

    NSDictionary *applicationData = [[NSDictionary alloc] initWithObjects:@[strLocation] forKeys:@[@"watchlocation"]]; 

    [[WCSession defaultSession] transferUserInfo:applicationData]; 

} 
+0

Chcę wysłane aktualne położenie (aktualizacja lokalizacja zegarek) do iOS, nawet gdy aplikacja zegarek w trybie tła – Ashish

+0

Nie ma sensu wysyłać informacji o lokalizacji z oglądania na telefon za pomocą WatchConnectivity. Jeśli chcesz korzystać z funkcji WatchConnectivity, aplikacja musi działać co najmniej w tle w telefonie, dlatego łatwiej i bardziej optymalnie jest po prostu uzyskać dane o lokalizacji telefonu, niż pobrać je na zegarku i wysłać do telefon. –

+0

jeśli dostaję lokalizację na iPhone'a niż obliczam odległość między iPhone'em i iWatch i wyzwalam bazę powiadomień na odległość między nimi – Ashish

Odpowiedz

5

wykonanie Tło jest bardzo trudne w watchOS3. Istnieje wiele ograniczeń, a nawet jeśli uda Ci się zaplanować odświeżanie tła, nie ma gwarancji, że watchOS go uruchomi.

Według mojego doświadczenia po wykopaniu w sesji WWDC i dokumentacja:

  1. watchOS3 nie odda swojej aplikacji w dowolnym momencie wykonania tła, jeśli aplikacja nie jest w doku lub nie masz aktywnego komplikację na obecnym watchface
  2. liczba zadań odświeżania tła jest ograniczona do około 1 na godzinę dla aplikacji w Docku i 2 na godzinę dla aplikacji z aktywną komplikacją
  3. czas wykonywania w tle jest również ograniczony, a jeśli aplikacja przekroczy ten czas, zostanie zakończona przez demona watchOS
  4. raz zadzwonić setTaskCompleted, aplikacja przechodzi do stanu zawieszenia, więc asynchroniczne locationManager:didUpdateLocations: metoda z kodem nie powinno być wykonywane
Powiązane problemy