常見原因清單
- Info.plist 缺少隱私權限鍵(iOS 8+ 強制):
NSLocationWhenInUseUsageDescription(前台定位)
NSLocationAlwaysAndWhenInUseUsageDescription(前後台定位)
- CLLocationManagerDelegate 未正確設定:
self.locationManager.delegate = self;
[self.locationManager startUpdatingLocation];
- 模擬器未模擬位置:Xcode 模擬器頂部選單 Debug → Location → Custom Location 或選擇預設城市(如 "Apple HQ")。
- iOS 9 新增 App Transport Security (ATS):若定位服務涉及 HTTP 請求,需在 Info.plist 設定
NSAppTransportSecurity 例外。
最小可行程式碼
@import CoreLocation;
@interface ViewController () <CLLocationManagerDelegate>
@property (strong) CLLocationManager *locMgr;
@end
- (void)viewDidLoad {
[super viewDidLoad];
_locMgr = [[CLLocationManager alloc] init];
_locMgr.delegate = self;
_locMgr.desiredAccuracy = kCLLocationAccuracyBest;
[_locMgr requestWhenInUseAuthorization]; // 觸發權限彈窗
[_locMgr startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
CLLocation *loc = locations.lastObject;
NSLog(@"Lat: %f, Lon: %f", loc.coordinate.latitude, loc.coordinate.longitude);
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"定位失敗: %@", error.localizedDescription);
}
排查步驟
- 確認 Console 有無「This app has attempted to access privacy-sensitive data without a usage description」警告 → 補 Info.plist。
- 真機測試:模擬器 GPS 精度極低,真機為準。
- 檢查
didFailWithError 錯誤碼:kCLErrorDenied(用戶拒絕授權)、kCLErrorLocationUnknown(暫時無法定位)。