2010-01-05 116 views

回答

1

儘管您無法使用SDK來確定這一點,但您可能會利用您對當前模型的瞭解。如果您僅限於iPhone 3G,iPhone 3GS和iPod Touch第二代(我不親自支持較舊的iPhone邊緣或iPod Touch第一代),那麼您已經知道iPhone機型配備了真正的AGPS裝置,而iPod Touch 2nd世代可以使用 - 如果可用 - 地理標記的無線熱點。然後,您可以使用以下方法來確定你的模型運行於:

- (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; 
} 

該方法返回@「iPhone2,1」的3GS,@「iPhone1,2」,爲3G和@「iPod2, 1「爲iPod touch第二代;你叫它如下

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

和按如下方式使用它:

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

不能檢測硬件,至少不是通過官方SDK。但是,您可以通過與您的應用程序(通過CoreLocation框架)交互(即從中獲取信息)。而且這種方式適用於自iPhone OS 2.0發佈以來發布的所有設備(即使沒有內置真正的GPS也可接觸iPod)。

1

我找到的最好的是利用一個事實,即CLLocation.verticalAccuracy只適用於裝有GPS設備的設置。當然,這意味着GPS可用性只能在第一次更新位置後才能確定。

從蘋果公司的文檔:

確定垂直精度 需要與GPS 能力的設備。因此,在某些早期的基於iOS的設備 中,此屬性 始終包含負值。

更新: 有時,核心定位發送CLLocation與verticalAccuracy = -1在iPhone 4對象以及。當沒有GPS定位可用時,Core Location可能會採用小區或Wi-Fi定位。所以你得到-1的事實並不一定意味着你沒有GPS。只有當你獲得肯定的價值時,你纔有GPS。

2

爲了避免要求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%的未來證明,但它在這一點上效果很好。我在我的Battery HD應用程序中使用它以隱藏GPS估計值,所以我顯然不想向用戶詢問授權。

+0

carrierName如何短於0? – bk138 2016-03-07 22:02:08