Saya memiliki layar masuk di aplikasi iOS saya. Nama pengguna dan kata sandi akan disimpan dalam NSUserDefaults
dan dimuat ke layar login lagi ketika Anda memasukkan aplikasi lagi (tentu saja, NSUserDefaults
permanen).
Sekarang, pengguna memiliki kemungkinan untuk menonaktifkan fitur penyimpanan nama pengguna / kata sandi.
Jadi NSUserDefaults
akan dibersihkan kemudian.
Tetapi dalam aplikasi saya, saya memerlukan nama pengguna / kata sandi ini untuk permintaan basis data bagi pengguna. Jadi: Di mana menyimpan data kecuali NSUserDefaults
? (Tempat ini dapat / harus dihapus ketika pengguna keluar dari aplikasi atau logout).
ios
nsuserdefaults
keychain
Kovu
sumber
sumber
Jawaban:
Anda harus selalu menggunakan Keychain untuk menyimpan nama pengguna dan kata sandi, dan karena itu disimpan dengan aman dan hanya dapat diakses ke aplikasi Anda, tidak perlu menghapusnya ketika aplikasi berhenti (jika itu menjadi perhatian Anda).
Apple memberikan kode sampel yang menyimpan, membaca, dan menghapus item gantungan kunci dan di sini adalah cara menggunakan kelas pembungkus gantungan kunci dari sampel yang sangat disederhanakan menggunakan Keychain.
Sertakan Security.framework (di Xcode 3 klik kanan pada folder frameworks dan tambahkan framework yang ada. Di Xcode 4 pilih proyek Anda, lalu pilih target, pergi ke tab Bangun Fase dan klik + di bawah Tautan Biner Dengan File) dan KeychainItemWrapper .h &. m file ke proyek Anda, # impor file .h di mana pun Anda perlu menggunakan gantungan kunci dan kemudian buat instance dari kelas ini:
( YourAppLogin dapat berupa apa saja yang Anda pilih untuk memanggil item Keychain Anda dan Anda dapat memiliki banyak item jika diperlukan)
Kemudian Anda dapat mengatur nama pengguna dan kata sandi menggunakan:
Dapatkan mereka menggunakan:
Atau hapus menggunakan:
sumber
kSecValueData
dankSecAttrAccount
dalam kode Objective-C, jadi pastikan untuk melemparkannya menggunakan(__bridge id)
, misalnya,[keychainItem setObject:obj forKey:(__bridge id)kSecValueData];
Jika Anda memerlukan versi ARC dari pembungkus di sini adalah tautan https://gist.github.com/1170641 Terima kasih kepada
sumber
Solusi yang sangat mudah melalui Gantungan Kunci .
Ini adalah pembungkus sederhana untuk sistem Keychain. Cukup tambahkan
SSKeychain.h
,SSKeychain.m
,SSKeychainQuery.h
danSSKeychainQuery.m
file untuk proyek Anda dan menambahkan Security.framework untuk target Anda.Untuk menyimpan kata sandi:
Untuk mengambil kata sandi:
Di mana
setPassword
nilai yang ingin Anda simpan danforService
variabel apa yang Anda inginkan disimpan dan akun untuk pengguna / objek mana kata sandi dan info lainnya untuk.sumber
NSString *username = [[SSKeychain accountsForService:@"AnyService"][0] valueForKey:@"acct"]
. Ini akan berfungsi dengan baik jika Anda hanya menggunakan satu akun. Seperti biasa, pastikan untuk memeriksa panjang array sebelum mencoba mengakses indeks 0.Anda cukup menggunakan
NSURLCredential
, itu akan menyimpan nama pengguna dan kata sandi di gantungan kunci hanya dalam dua baris kode .Lihat jawaban terinci saya .
sumber
Saya memutuskan untuk menjawab bagaimana menggunakan gantungan kunci di iOS 8 menggunakan Obj-C dan ARC.
1) Saya menggunakan keychainItemWrapper (versi ARCifief) dari GIST: https://gist.github.com/dhoerl/1170641/download - Tambahkan (+ salin) KeychainItemWrapper.h dan .m ke proyek Anda
2) Tambahkan kerangka Keamanan ke proyek Anda (periksa proyek> Bangun fase> Tautkan biner dengan Perpustakaan)
3) Tambahkan perpustakaan keamanan (#import) dan KeychainItemWrapper (#import "KeychainItemWrapper.h") ke file .h dan .m di mana Anda ingin menggunakan gantungan kunci.
4) Untuk menyimpan data ke gantungan kunci:
5) Baca data (mungkin layar login saat memuat> viewDidLoad):
Nikmati!
sumber
Jika Anda mengalami masalah saat mengambil kata sandi menggunakan pembungkus gantungan kunci, gunakan kode ini:
sumber
checkout kode sampel ini saya mencoba dulu pembungkus apel dari kode sampel tetapi ini jauh lebih mudah bagi saya
sumber
coba yang ini:
semoga akan membantu.
sumber
Saya melihat menggunakan KeychainItemWrapper (versi ARC) tapi saya tidak menemukan pembungkus Objective C-nya sehat seperti yang diinginkan.
Saya menggunakan solusi ini oleh Kishikawa Katsumi , yang berarti saya menulis lebih sedikit kode dan tidak harus menggunakan gips untuk menyimpan nilai NSString.
Dua contoh penyimpanan:
Dua contoh pengambilan
sumber
Ada bug kecil dalam kode di atas (omong-omong Dave itu sangat membantu posting Anda, terima kasih)
Di bagian tempat kami menyimpan kredensial, kode tersebut juga memerlukan kode berikut agar berfungsi dengan benar.
paling mungkin adalah karena kedua kalinya kami mencoba (kembali) masuk dengan kredensial yang sama dengan yang ditemukan di item gantungan kunci dan aplikasi mogok. dengan kode di atas berfungsi seperti pesona.
sumber
Untuk memperbarui pertanyaan ini:
Bagi mereka yang menggunakan Swift checkout, penerapan drag and drop swift ini oleh Mihai Costea mendukung grup akses:
https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift
Sebelum menggunakan gantungan kunci: pertimbangkan dua kali sebelum menyimpan kata sandi. Dalam banyak kasus menyimpan token otentikasi (seperti id sesi persistensi) dan email atau nama akun mungkin cukup. Anda dapat dengan mudah membatalkan token otentikasi untuk memblokir akses yang tidak sah, mengharuskan pengguna untuk login lagi pada perangkat yang dikompromikan tetapi tidak memerlukan reset kata sandi dan harus login lagi pada semua perangkat (kita tidak hanya menggunakan Apple, kan?).
sumber
Tapi, sekarang Anda bisa menggunakan NURLCredential sebagai ganti bungkus gantungan kunci. Itu melakukan apa yang perlu kita lakukan.
sumber
Untuk cepat Anda dapat menggunakan perpustakaan ini:
https://github.com/jrendel/SwiftKeychainWrapper
Ini mendukung semua versi swift.
sumber
Berikut ini akan berfungsi dengan baik:
sumber