문제

Iphone에 있는 GPS 하드웨어를 감지하는 방법을 알고 싶습니다.

도움이 되었습니까?

해결책

SDK를 사용하여이를 결정할 수는 없지만 현재 모델에 대한 지식을 이용할 수 있습니다. iPhone 3G, iPhone 3GS 및 iPod Touch 2nd Generation으로 제한한다면 (나는 개인적으로 구형 iPhone 엣지 또는 iPod Touch 1st Generation을 지원하지 않습니다), iPhone 모델은 실제 AGPS 장치와 함께 배송되는 동안 iPod Touch 2nd를 이미 알고 있습니다. Generation은 지오 태깅 된 WiFi 핫스팟을 사용할 수 있습니다. 그런 다음 다음 방법을 사용하여 실행중인 모델을 결정할 수 있습니다.

- (NSString *) deviceModel{
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *answer = malloc(size);
    sysctlbyname("hw.machine", answer, &size, NULL, 0);
    NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
    free(answer);
    return results;
}

이 방법은 3GS의 경우 @"iPhone2,1", 3G의 경우 "iPhone1,2"및 iPod touch 2nd Generation의 경우 "iPod2,1"을 반환합니다. 당신은 그것을 다음과 같이 부릅니다

NSString *deviceModel = [[self deviceModel] retain];

다음과 같이 사용하십시오.

if([self.deviceModel isEqualToString:@"Pod2,1"]){
    // no real GPS unit available 
    // no camera available
    ...
}

다른 팁

당신은 할 수 없습니다 감지하다 하드웨어는 적어도 공식 SDK를 통한 것이 아닙니다. 그러나 당신은 할 수 있습니다. 상호 작용하십시오 (즉, Corelocation Framework를 통해) 응용 프로그램에서 정보를 얻습니다. 그리고 이것은 iPhone OS 2.0이 출시 된 이후로 배송 된 모든 장치에서 작동합니다 (실제 GPS가없는 iPod 터치).

GPS가 존재하는지 여부를 알기 위해 GPS 권한을 요구하지 않기 위해 약간의 트릭을 사용합니다. 실제 GPS가있는 모든 장치에는 3G가 있으므로 장치에 전화 연산자가 있는지 확인하십시오.

//Use classLoaders to avoid crashes on iPhone OS 3.x
id netInfo = [[NSClassFromString(@"CTTelephonyNetworkInfo") alloc] init];
if (netInfo) 
{
            id carrier = [netInfo subscriberCellularProvider];

            if ([[carrier carrierName] length] <=0)
            {
                    //NO operator=>NO 3G and no real GPS  
            }
}
[netInfo release];

물론 이것은 100% 미래의 증거가 아닐 수도 있지만이 시점에서 잘 작동합니다. GPS 추정치를 숨기기 위해 배터리 HD 앱에서 사용하므로 사용자에게 승인을 요청하고 싶지 않습니다.

내가 찾은 최고는 다음과 같은 사실을 활용하는 것입니다. CLLocation.verticalAccuracy GPS가 장착된 장치에만 설정됩니다.물론 이는 GPS 가용성이 첫 번째 위치 업데이트 이후에만 결정될 수 있음을 의미합니다.

Apple 문서에서:

수직 정확도를 결정하려면 GPS 기능이있는 장치가 필요합니다.따라서 일부 초기 iOS 기반 장치 에서이 속성에는 항상 음수 값이 포함되어 있습니다.

업데이트:때때로 Core Location은 iPhone 4에서도 VerticalAccuracy = -1인 CLLocation 객체를 보냅니다.아마도 GPS 수정을 사용할 수 없고 Core Location이 셀 또는 Wi-Fi 위치 지정에 의존할 때 그렇게 하는 것일 수 있습니다.따라서 -1을 얻는다는 사실이 반드시 GPS가 없다는 의미는 아닙니다.확실히 알고 있는 양수 값을 얻는 경우에만 GPS가 있는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top