1

앱이 백그라운드에서 실행 중일 때 푸시 알림을 받으면 내 앱에 사용자 위치가 필요합니다.iOS 앱 배경 위치 (푸시 알림)

독서의 비트를 수행 한 후 나는이 즉, 불가능하다는 인상을 해요 : 백그라운드에서

1) 앱

2) 푸시 알림을받은

3) 가져 오기 사용자 위치 및 코드 블록을 실행합니다.

사용자 위치를 얻기 위해 N 분마다 작업을 실행할 수 있다고 제안하는 post on here이 발견되었습니다. 그래서 이걸 사용하면 10 분마다 점검 할 수 있지만 실제로 GPS를 작동 시키면 사용자 배터리가 낭비됩니다. 따라서 사용자가 내 앱을 기다리는 푸시 알림을 가지고 있는지를 백그라운드 작업에서 알 수 있는지 궁금합니다. 그렇게하면 10 분마다 점검하고 GPS 만 활성화하면 확인합니다.

아마도 나는이 모든 잘못된 길로 가고 있습니다. 나는 충고를 정말 고맙게 생각합니다. 배경 작업을위한 코드를 아직 가지고 있지 않아서 미안합니다. 아직 작동 시키려고하고 있습니다.

[업데이트] 당신의 조언을

감사 더스틴. 약간의 테스트가 끝나면 더 쉬운 옵션을 선택하기로 결정했습니다. 지금 Apple의 중요한 위치 변경을 사용 중입니다. 배열에 변경 사항을 저장합니다. 마지막 변경이 10 분 전보다 큰 경우에만 업데이트하도록 설정했습니다. 그런 다음 앱이 활성화되면 푸시 알림을 보낸 시간과 배열에서 가장 가까운 시간을 일치시켜 해당 위치를 사용합니다. viewDidLoad에 아래

또는 didFinishingLaunchingWithOptions 추가 : applicationDidEnterBackground :와에서

locationsLogged = [[NSMutableArray alloc] init]; 
lastLocationTime = [[NSDate alloc] init] 
locationManager = [[CLLocationManager alloc] init]; 
[locationManager setDelegate:self]; 
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 

추가 :

+0

푸시 알림을 전송하는 대상은 무엇입니까? 내용에 따라 KVO를 할 수 있습니다. – Dustin

+0

턴 기반 게임/앱 - 사용자가 차례를 마칠 때 상대방에게 푸시 알림이 전송되어 상대방에게 자신의 차례를 알립니다. – dciso

+0

알림이 플레이어의 차례인지 여부에 해당하는 부울 값을 설정합니다. KVO를 부울 값으로 처리하십시오. – Dustin

답변

1

으로는 여기있다, 내가 대체 솔루션을 사용 논의

[locationManager startMonitoringSignificantLocationChanges]; 

추가 :

-(void) storeLocations:(CLLocation *)location 
{ 
bgTask = [[UIApplication sharedApplication] 
      beginBackgroundTaskWithExpirationHandler: 
      ^{ 
       [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
       }]; 

[locationsLogged addObject:location]; 

if (bgTask != UIBackgroundTaskInvalid) 
{ 
    [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
    } 
} 


-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
BOOL isInBackground = NO; 
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) 
{ 
    isInBackground = YES; 
} 


NSDate *now = [NSDate date]; 
NSTimeInterval diff = [now timeIntervalSinceDate:lastLocationTime]; 


if ((int)diff > 600) { 

    if (isInBackground) 
    { 
     [lastLocationTime release]; 
     lastLocationTime = [[NSDate alloc] init]; 
     [self storeLocations:newLocation]; 
    } 
    else 
    { 
     // ... 
    } 
} 
} 

그런 다음 applicationDidBecomeActive에서 위치 정보를 적용하는 데 필요한 모든 논리를 사용할 수 있습니다.