I was looking for a way to detect whether an iOS device has a GPS unit or not, and I ran into this question. I found the last answer very interesting:
CTTelephonyNetworkInfo* netInfo = [[CTTelephonyNetworkInfo alloc] init];
if(netInfo) {
CTCarrier* carrier = [netInfo subscriberCellularProvider];
if([[carrier carrierName] length] <=0) {
//NO operator=>NO 3G and no real GPS
}
}
I was looking for some confirmation as the the validity of this technique/whether or not it is entirely accurate. I don't have enough devices to test it myself.
After doing some digging, I've found this article from Apple which, as a footnote, explains that:
iOS devices without a cellular connection use only Wi-Fi for Location Services (if a Wi-Fi network is available).
GPS is available [only] on iPhone and iPad Wi-Fi + 3G models.
So it seems that detecting a cellular connection is a reliable way to determine whether or not and iOS device has a GPS unit. No cellular connection, no GPS.
Note that iOS supports external GPS units through bluetooth and dock connector. The above methods will tell whether the device has a internal GPS but not whether LocationManager will be able to provide GPS driven location updates.