Aplikasi saya yang bekerja dengan baik di iOS 7 tidak bekerja dengan iOS 8 SDK.
CLLocationManager
tidak mengembalikan lokasi, dan saya tidak melihat aplikasi saya di bawah Pengaturan -> Layanan Lokasi juga. Saya melakukan pencarian Google pada masalah ini, tetapi tidak ada yang muncul. Apa yang salah?
Jawaban:
Saya akhirnya memecahkan masalah saya sendiri.
Rupanya di iOS 8 SDK,
requestAlwaysAuthorization
(untuk lokasi latar belakang) ataurequestWhenInUseAuthorization
(lokasi hanya saat latar depan)CLLocationManager
diperlukan sebelum memulai pembaruan lokasi.Ada juga perlu
NSLocationAlwaysUsageDescription
atauNSLocationWhenInUseUsageDescription
dimasukkanInfo.plist
dengan pesan yang akan ditampilkan di prompt. Menambahkan ini memecahkan masalah saya.Semoga ini bisa membantu orang lain.
SUNTING: Untuk informasi yang lebih luas, lihat di: Core-Location-Manager-Changes-in-ios-8
sumber
Saya mencabut rambut saya dengan masalah yang sama. Xcode memberi Anda kesalahan:
Tetapi bahkan jika Anda menerapkan salah satu metode di atas, itu tidak akan meminta pengguna kecuali ada entri di info.plist untuk
NSLocationAlwaysUsageDescription
atauNSLocationWhenInUseUsageDescription
.Tambahkan baris berikut ke info.plist Anda di mana nilai string mewakili alasan Anda perlu mengakses lokasi pengguna
Saya pikir entri ini mungkin telah hilang sejak saya memulai proyek ini di Xcode 5. Saya kira Xcode 6 mungkin menambahkan entri default untuk kunci ini tetapi belum dikonfirmasi.
Anda dapat menemukan informasi lebih lanjut tentang dua Pengaturan ini di sini
sumber
Untuk memastikan bahwa ini kompatibel dengan iOS 7, Anda harus memeriksa apakah pengguna menjalankan iOS 8 atau iOS 7. Misalnya:
sumber
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
requestAlwaysAuthorization
metode ini. Solusi tambahan saya adalah menggunakan baris ini diif
pernyataan bukan metode panggilan biasa:[self.locationManager performSelector:@selector(requestAlwaysAuthorization)];
. Mungkin ini jelas bagi orang lain, tetapi butuh beberapa saat untuk mencari tahu. Saya pikir itu solusi yang tepat sampai Xcode 6 final dirilis.__IPHONE_OS_VERSION_MAX_ALLOWED
(#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
)Dan ke File info.plist Anda
sumber
Menurut dokumen Apple:
Pada iOS 8, kehadiran
NSLocationWhenInUseUsageDescription
atauNSLocationAlwaysUsageDescription
nilai kunci dalam file Info.plist aplikasi Anda diperlukan. Maka juga diperlukan untuk meminta izin dari pengguna sebelum mendaftar untuk pembaruan lokasi, baik dengan menelepon[self.myLocationManager requestWhenInUseAuthorization]
atau[self.myLocationManager requestAlwaysAuthorization]
tergantung pada kebutuhan Anda. String yang Anda masukkan ke Info.plist kemudian akan ditampilkan di dialog berikutnya.Jika pengguna memberikan izin, itu bisnis seperti biasa. Jika mereka menolak izin, maka delegasi tidak diberitahu tentang pembaruan lokasi.
sumber
Kedua tombol ini mengambil string
sumber
Solusi saya yang dapat dikompilasi dalam Xcode 5:
sumber
Kode lama untuk menanyakan lokasi tidak akan berfungsi di iOS 8. Anda dapat mencoba metode ini untuk otorisasi lokasi:
sumber
Di iOS 8, Anda perlu melakukan dua hal tambahan agar lokasi berfungsi: Tambahkan kunci ke Info.plist Anda dan minta otorisasi dari manajer lokasi untuk memintanya memulai.
daftar info:
Tambahkan ini ke kode Anda
sumber
Satu kesalahan umum untuk pengembang Swift:
Pertama, pastikan Anda menambahkan nilai pada daftar untuk salah satu
NSLocationWhenInUseUsageDescription
atauNSLocationAlwaysUsageDescription
.Jika Anda masih tidak melihat jendela yang muncul meminta otorisasi, lihat apakah Anda meletakkan garis
var locationManager = CLLocationManager()
dalamviewDidLoad
metode View Controller Anda . Jika Anda melakukannya, maka bahkan jika Anda meneleponlocationManager.requestWhenInUseAuthorization()
, tidak ada yang akan muncul. Ini karena setelah viewDidLoad dijalankan, variabel locationManager dideallocated (dihapus).Solusinya adalah dengan menempatkan baris
var locationManager = CLLocationManager()
di bagian atas metode kelas.sumber
Sebelumnya
[locationManager startUpdatingLocation];
, tambahkan permintaan layanan lokasi iOS8:Edit aplikasi Anda
Info.plist
dan tambahkan kunciNSLocationAlwaysUsageDescription
dengan nilai string yang akan ditampilkan kepada pengguna (misalnya,We do our best to preserve your battery life.
)Jika aplikasi Anda hanya membutuhkan layanan lokasi saat aplikasi terbuka, ganti:
requestAlwaysAuthorization
denganrequestWhenInUseAuthorization
danNSLocationAlwaysUsageDescription
denganNSLocationWhenInUseUsageDescription
.sumber
Saya sedang mengerjakan aplikasi yang ditingkatkan ke iOS 8 dan layanan lokasi berhenti bekerja. Anda mungkin akan mendapatkan kesalahan di area Debug seperti:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
Saya melakukan prosedur yang paling tidak mengganggu. Pertama-tama tambahkan
NSLocationAlwaysUsageDescription
entri ke info.plist Anda:Perhatikan saya tidak mengisi nilai untuk kunci ini. Ini masih berfungsi, dan saya tidak khawatir karena ini adalah aplikasi in-house. Juga, sudah ada judul yang meminta untuk menggunakan layanan lokasi, jadi saya tidak ingin melakukan sesuatu yang berlebihan.
Selanjutnya saya membuat persyaratan untuk iOS 8:
Setelah ini
locationManager:didChangeAuthorizationStatus:
metodenya adalah panggilan:Dan sekarang semuanya bekerja dengan baik. Seperti biasa, lihat dokumentasi .
sumber
Solusi dengan kompatibilitas mundur:
Pengaturan NSLocationWhenInUseUsageDescription kunci di Info.plist Anda
sumber
locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error
. Namun, dia lupa untuk menambahkan startUpdatingLocation ke pernyataan if jadi setelah mereka menerima atau menolaknya, itu sebenarnya tidak memanggil startUpdateLocation.Solusi dengan kompatibilitas mundur yang tidak menghasilkan peringatan Xcode:
NSLocationWhenInUseUsageDescription
Kunci pengaturan diInfo.plist
.Untuk iOS versi 11.0+ :
NSLocationAlwaysAndWhenInUseUsageDescription
Kunci pengaturan diInfo.plist
. bersama dengan 2 kunci lainnya.sumber
Ini masalah dengan ios 8 Tambahkan ini ke kode Anda
dan ke info.plist:
sumber
NSLocationUsageDescription
tidak digunakan di iOS8 +Untuk Mengakses Lokasi Pengguna di iOS 8 Anda harus menambahkan,
Ini akan meminta izin kepada pengguna untuk mendapatkan lokasi mereka saat ini.
sumber
Prosedur Objective-C Ikuti instruksi di bawah ini:
Untuk iOS-11 Untuk iOS 11 lihat Jawaban ini: akses lokasi iOS 11
Perlu Tambahkan dua Tombol ke dalam daftar dan berikan pesan seperti gambar di bawah ini:
Untuk iOS-10 ke bawah:
Metode Delegasi
Prosedur Cepat
Ikuti instruksi di bawah ini:
Untuk iOS-11 Untuk iOS 11 lihat Jawaban ini: akses lokasi iOS 11
Perlu Tambahkan dua Tombol ke dalam daftar dan berikan pesan seperti gambar di bawah ini:
Untuk iOS-10 ke bawah:
Metode Delegasi
sumber
Bagi mereka yang menggunakan Xamarin , saya harus menambahkan kunci
NSLocationWhenInUseUsageDescription
ke info.plist secara manual karena itu tidak tersedia di dropdown di Xamarin 5.5.3 Build 6 atau XCode 6.1 - hanyaNSLocationUsageDescription
ada dalam daftar, dan itu menyebabkanCLLocationManager
terus untuk gagal diam-diam.sumber
sumber
Pembantu kecil untuk Anda semua yang memiliki lebih dari satu file Info.plist ...
Ini akan menambahkan tag yang diperlukan ke semua file Info.plist di direktori saat ini (dan subfolder).
Lainnya adalah:
Ini akan menambah deskripsi Anda ke semua file.
sumber
Simpan informasi Cocoa Keys selalu di ujung jari Anda untuk pembaruan tersebut, berikut adalah tautannya:
https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26
Nikmati.
sumber
Saya mendapatkan kesalahan serupa di iOS9 (bekerja dengan Xcode 7 dan Swift 2): Mencoba memulai pembaruan lokasi MapKit tanpa meminta otorisasi lokasi. Harus menghubungi - [CLLocationManager requestWhenInUseAuthorization] atau - [CLLocationManager requestAlwaysAuthorization] terlebih dahulu. Saya mengikuti tutorial tetapi tutornya menggunakan iOS8 dan Swift 1.2. Ada beberapa perubahan pada Xcode 7 dan Swift 2, saya menemukan kode ini dan berfungsi dengan baik untuk saya (jika seseorang membutuhkan bantuan):
Akhirnya, saya masukkan ke info.plist: Information Property List: NSLocationWhenInUseUsUsageDescription Value: App membutuhkan server lokasi untuk staf
sumber
Untuk mengakses lokasi pengguna di iOS. Anda perlu menambahkan dua tombol
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
ke dalam file Info.plist.
Lihat gambar di bawah ini.
sumber
Tambahkan kunci
NSLocationWhenInUseUsageDescription
atauNSLocationAlwaysUsageDescription
(gunakan GPS latar belakang) dengan string yang meminta untuk menggunakan GPS pada masing-masinginfo.plist
dari setiap target.Minta izin dengan menjalankan:
[self initLocationManager: locationManager];
Dimana
initLocationManager
:Ingat bahwa jika kunci tidak pada masing
info.plist
-masing untuk setiap target aplikasi tidak akan meminta pengguna. Aplikasi iniif
menyediakan kompatibilitas dengan iOS 7 danrespondsToSelector:
metode ini menjamin kompatibilitas di masa depan daripada hanya menyelesaikan masalah untuk iOS 7 dan 8.sumber
Masalahnya bagi saya adalah bahwa kelas yang
CLLocationManagerDelegate
privat, yang mencegah semua metode delegasi dipanggil. Kira itu bukan situasi yang sangat umum tetapi saya pikir saya akan menyebutkannya kalau-kalau ada yang membantu.sumber
Saya menambahkan kunci mereka di
InfoPlist.strings
dalam iOS 8.4, iPad Mini 2. Ia bekerja juga. Saya tidak menetapkan kunci apa pun, sepertiNSLocationWhenInUseUsageDescription
diInfo.plist
.InfoPlist.strings :
Berdasarkan utas ini , katanya
as in iOS 7
,, dapat dilokalisasi di InfoPlist.strings. Dalam pengujian saya, kunci-kunci itu dapat dikonfigurasi secara langsung dalam fileInfoPlist.strings
.MEMPERBARUI:
Saya pikir
@IOS
metode ini lebih baik. Tambahkan kunciInfo.plist
dengan nilai kosong dan tambahkan string terlokalisasi keInfoPlist.strings
.sumber