Kaydedilmiş NSUserDefaults'u görmenin kolay yolu?


225

Neyin NSUserDefaultsdoğrudan kaydedildiğini görmenin bir yolu var mı ? Verilerimin doğru kaydedilip kaydedilmediğini görmek istiyorum.


3
Uygulama dizininizin konumunu almak için bunu kullanın: print (NSHomeDirectory ()) bu konumdan, Library> Preferences> <yourAppsBundleName.plist> adresine gidin, burası NSUserDefaults verilerinizi kaydedecektir.
Bobby

Yanıtlar:


162

Aşağıdakilere giderseniz uygulamanızın pList dosyasını simülatörde bulabilirsiniz:

/ users / kullanıcı adınız / Library / Application Support / iPhone Simulator / <Sim Version> / Uygulamalar

Bu dizinde dizin adı verilen bir grup GUID vardır. Birkaç uygulama üzerinde çalışıyorsanız bunlardan birkaçı olacaktır. Yani uygulamanızın ikili dosyasını bulmanız gerekir:

find . -name foo.app
./1BAB4C83-8E7E-4671-AC36-6043F8A9BFA7/foo.app

Ardından GUID dizinindeki Library / Preferences dizinine gidin. Yani:

cd 1BAB4C83-8E7E-4671-AC35-6043F8A9BFA7/Library/Preferences

Şuna benzeyen bir dosya bulmalısınız:

<Bundle Identifier>.foo.pList

Bunu pList düzenleyicisinde açın ve kalbinizin içeriğinde kalıcı değerlere göz atın.


12
Bunun XCode'un sonraki sürümlerinde değiştiğini gördüm. Şimdi Kullanıcı yerine geçerli ios sürüm numarasının altındaki bir dizinde bulacaksınız - ör. /
Users

İlginç ... Görünüşe göre OCMock / SenTestingKit birim testi ile test yapıyorsanız NSUserDefaults, NSUserDefaultsbir .plist dosyasına kalıcı değil, bellekte yönetiliyor: stackoverflow.com/questions/6193597/…
ma11hew28

Önceden yüklenmiş bir uygulama için nasıl görüntüleyebilirim? Müşterim uygulamayı uygulama mağazasından indirdi ve bir sorun var. NSUserDefaults dosyasını kontrol etmem gerekiyor
Dejell

Müşteriniz - onunla konuşabiliyorsanız ve biraz anlayışlıysa - telefon dosya sistemine erişmek ve dosyayı size göndermek için dosyayı telefondan kopyalamak için PhoneView gibi bir araç kullanabilir.
Daniel Schneller

13
Yol şu şekilde değiştirildi: ~ / Library / Developer / CoreSimulator / Devices
Brainware

355

Tüm mevcut NSUserDefault'larını günlüğe yazdırabilirsiniz:

Sadece tuşları:

NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);

Anahtarlar ve değerler:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

1
THX, bu daha verimli ~
akustik

3
Apple bunun için XCode'da basit bir görüntüleyici yapabilir. Plist görüntüleyici gibi. Ama hayır, bunu kolaylaştırmak istemiyorlar.
GeneCode

79

Swift'te aşağıdakileri kullanabiliriz: -

Swift 3.x ve 4.x

Tüm anahtarları ve değerleri almak için:

for (key, value) in UserDefaults.standard.dictionaryRepresentation() {
    print("\(key) = \(value) \n")
}

Kullanıcı varsayılanlarının tam sözlük temsilini almak için:

print(Array(UserDefaults.standard.dictionaryRepresentation()))

Anahtarları almak için:

// Using dump since the keys are an array of strings.
dump(Array(UserDefaults.standard.dictionaryRepresentation().keys))

Değerleri almak için:

Burada da dökümü kullanabiliriz, ancak bu değerler dizisindeki her öğenin tam miras hiyerarşisini döndürür. Nesneler hakkında daha fazla bilgi gerekiyorsa, dökümü kullanın, normal yazdırma deyimine devam edin.

// dump(Array(UserDefaults.standard.dictionaryRepresentation().values))
print(Array(UserDefaults.standard.dictionaryRepresentation().values))

Swift 2.x

Kullanıcı varsayılanlarının tam sözlük temsilini almak için:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation())

Anahtarları almak için:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array)

Değerleri almak için:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array)

40

Tarafından döndürülen dizideki her bir anahtarın değerlerini kontrol edebilirsiniz.

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

3
Bu, hata ayıklayıcıda şu komutu kullanarak da çalıştı: (lldb) "po [[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]"
Ethan Parker

21

Bazen simülatörde çalışırken NSUserDefaults dosyamın konumunu yazdırmak için aşağıdaki snippet'i kullanıyorum

NSArray * path = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * folder = [yol nesnesiAtIndex: 0];
NSLog (@ "NSUserDefaults'unuz bu klasörde saklanır:% @ / Preferences", klasör);

Tercihler klasörüne giden yolu verir

NSUserDefaults'unuz bu klasörde saklanır: / Kullanıcılar / kale / Kütüphane / Uygulama Desteği / iPhone Simülatörü / Kullanıcı / Uygulamalar / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Kütüphane / Tercihler

NSUserDefaults dosyanız tercihler klasöründe bulunur ve ön ekinize ve uygulama adınıza göre adlandırılır;

dk.castleandersen.dreamteam.grid.plist

Aynı şeyin gerçek cihaz için de geçerli olmasını bekliyorum.


bu yanıtı beğendim. Kararlı ve umarım çalışır!
lucianoenrico

7

Kolay, plist dosya adı olduğundan <app-bundle-identifier>.plist, findyolunu bulmak için komutu kullanabilirsiniz . Ancak tüm bilgisayarınızı ararsanız çok uzun sürer, bu nedenle ~/Library/Developer/CoreSimulatorXcode 6 gibi iyi bir kapsam seçmeniz gerekir .

misal:

find ~/Library/Developer/CoreSimulator -type f -name com.awesome.app.plist

çıktı böyle bir şey olacak ...

/Users/hlung/Library/Developer/CoreSimulator/Devices/B61913F6-7D7C-4E45-AE2F-F45220A71823/data/Containers/Data/Application/E4CC51CF-11E5-4168-8A74-6BAE3B89998F/Library/Preferences/com.awesome.app.plist

Ve oradan openkomutu kullanabilirsiniz . Veya iTerm2 kullanıyorsanız , yolu açmak için komut üzerine sadece tıklayın.


7

Swift 4.0'da

//func dictionaryRepresentation() -> [String : AnyObject]

çünkü dictionaryRepresentation of NSUserDefaults.standardUserDefaults () döndürür [String: AnyObject]

Biz bir NSDictionary. Sonra onu parantez içine alarak '()' herhangi bir NSDictionary gibi .allKeys veya .allValues ​​çağırmamıza izin verir.

 print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)

6

Aşağıdaki kodu kullanın.

NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

Parlak! En iyi cevapların genellikle en kısa olması ilginçtir. Terminal modunda seyrek olarak dizinlerde gezinmek gerekir. Görünüşe göre, meraklıları arka kapı yaklaşımı gibi, belki de içindeki gizli hacker?
John

Teşekkürler, ama seni elde edemiyorum. Ne demek istiyorsun?
Mr.Javed Multani

5

For OS X uygulamaları yerine uygulamanın öndeğerleri plist dosyasını bulma, kullanımı basit defaultskomut satırı yardımcı.

ADI

 defaults -- access the Mac OS X user defaults system

ÖZET

 defaults [-currentHost | -host hostname] read [domain [key]]

 defaults [-currentHost | -host hostname] read-type domain key

 defaults [-currentHost | -host hostname] write domain { 'plist' | key 'value' }

 defaults [-currentHost | -host hostname] rename domain old_key new_key

 defaults [-currentHost | -host hostname] delete [domain [key]]

 defaults [-currentHost | -host hostname] { domains | find word | help }

AÇIKLAMA

defaultskullanıcıların Mac OS X kullanıcı varsayılanlarını komut satırı kabuğundan okumasına, yazmasına ve silmesine izin verir. Mac OS X uygulamaları ve diğer programlar, kullanıcı çalışmalarını ve uygulamalar çalışmadığında korunması gereken diğer bilgileri kaydetmek için varsayılan sistemi kullanır (yeni belgeler için varsayılan yazı tipi veya Bilgi panelinin konumu gibi). Bu bilgilerin çoğuna uygulamanın Tercihler panelinden erişilebilir, ancak Bilgi panelinin konumu gibi bilgilerin bir kısmı yoktur. Bu bilgilere şununla erişebilirsiniz:defaults

Misal:

$ defaults read com.apple.Safari
{
    AutoplayPolicyWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    AutoplayQuirksWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    DefaultBrowserPromptingState2 = 4;
    ...

4

Xcode 7 için

NSUserDefaults standardı Varsayılanlar burada saklanır:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Data/Application/{UUID}

İçin NSUserDefaults paketi / uygulama grubunun burada saklanır:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Shared/AppGroup/{UUID}/Library/Preferences/{GROUP_NAME}.plist

Https://github.com/scinfu/NCSimulatorPlugin kullanmanızı tavsiye ederim çünkü bu günlerde her şey UUID'lerin arkasında ve bulmak için bir acı. Simülatör uygulama dizinlerinize kolay erişim sağlar.


2

Bu yöntemi Morion'un daha iyi sunum önerisine dayanarak yaptım. Arayarak kullanın[self logAllUserDefaults]

- (void) logAllUserDefaults
{
    NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys];
    NSArray *values = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allValues];
    for (int i = 0; i < keys.count; i++) {
        NSLog(@"%@: %@", [keys objectAtIndex:i], [values objectAtIndex:i]);
    }
}

2
Bu işlevi "logAllUserDefaults" olarak adlandırmanızı öneririm, çünkü aslında varsayılanları "almaz" mı?
markrickert

Doğru, @markrickert. Belki ondan bir sözlük yaratıp geri verebilirdi.
Julian F. Weinert

1
Veya basitçe .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Neredeyse yukarıdaki en çok oylanan cevapta olduğu gibi.)
matsr

2

SimPholders2 adlı Mac uygulamasını arayın . Menü çubuğunda yaşar ve kullandığınız tüm simülatörleri listeler ve ardından uygulamalarınızın her birini gösterir. Birini seçtiğinizde, uygulamanın dizinine zaten açık olan yeni bir Finder penceresi açılır. Bu, uygulamanızı ve tüm dizinlerini bulmanızı çok kolaylaştırır. Çok büyük bir zaman tasarrufu (ve yazara kolayca bağış yaptım).


2

Simülatör Uygulaması

Bu kabuk komut dosyası uygulamanın adını arar , paket kimliğini alır ve Plist dosyalarını içeren klasörleri açar .

#!/bin/bash

appname="$1"
[ -z $appname ] && read -p "Application name : " appname

apppath=$(find ~/Library/Developer/CoreSimulator/Devices/ -name "$appname.app" -print -quit)
if [[ ! -z $apppath ]]; then
    appbundle=$(osascript -e "id of app \"$apppath\"")
    find ~/Library/Developer/CoreSimulator/Devices/ -name "$appbundle.plist" -exec bash -c 'open "$(dirname "$1")"' -- {} \;
else
    echo "No application found by that name: $appname.app"
fi

Genişletilmiş komut dosyası sürümü

Kullanımı: iphone-app-folder "My App"

#!/bin/bash
appname="$1"
[ -z "$appname" ] && read -p "Application name : " appname

apppath=$(find ~/Library/Developer/CoreSimulator/Devices -name "$appname.app" -print -quit)
if [[ ! -z $apppath ]]; then
    appbundle=$(osascript -e "id of app \"$apppath\"")
    echo "Found app $appname (${appbundle})"
    echo -e "\033[1;30m$apppath\033[0m"
    plists=$(find ~/Library/Developer/CoreSimulator/Devices -name "$appbundle.plist" -print -quit)
    count=$(echo plists | wc -l | sed "s/ //g")
    if [[ $count -eq 1 ]] && [[ -f "$plists" ]]; then
        echo -e "\033[1;32mUserDefaults found for $appname\033[0m"
        echo -e "\033[1;30m$plists\033[0m"
        plistutil -i "$plists"
        /usr/bin/open $(dirname "$plists")
    elif [[ ${#plists} -gt 0 ]]; then
        echo -e "\033[1;32mUserDefaults found for $appname\033[0m"
        i=1
        while read line; do
            echo "[${i}] ${line} "
            i=$((i+1))
        done < <(echo "$plists")
        echo
        read -p "Select defaults to read: [1-${count}] " choice
        plist=$(echo ${plists} | sed -n "${choice}p")
        plistutil -i "$plist"
        /usr/bin/open $(dirname "$plist")
    else
        echo -e "\033[31mNo UserDefaults plist found for $appname\033[0m"
    fi
else
    echo -e "\033[31mNo application found by that name: $appname.app\033[0m"
fi

Bulunan uygulama Uygulamam (com.organisation.MyApp) / Kullanıcılar / kuruluş / Kütüphane / Geliştirici / CoreSimulator / Cihazlar / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / data / Konteynerler / Paket / Uygulama / 960A5232-219D-4C46-8CA3- Bölüm 01E259D8DDAD / My App.app

Uygulamam için Kullanıcı Hatası bulundu

Mac Uygulaması

defaults read com.bundleid.app

1

Swift 2.2'de

let path = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)
let folder = path[0]
NSLog("Your NSUserDefaults are stored in this folder: \(folder)/Preferences")

NSUserDefaults'un plist dosya klasörü konumunu Xcode hata ayıklama konsolunda yazdıracaktır. Yol dizesini kopyalayın. Finder'ınızı açın, Git menü öğesinde Klasöre Git'i seçin, Yol dizesini yapıştırın. Plist dosyasına çift tıklayın. İçeriği Xcode düzenleyicinizde göreceksiniz.

Sadece Simülatörde çalışın

Teşekkürler @Niels Kalesi


Bu, xcode 9.4 için simülatörde kullanıcı hataları plistini bulmak için çalışan tek çözümdür
anoo_radha

1

Masaüstümde, simülatörün uygulamaları sakladığı klasöre bir kısayol tutuyorum, yani:

/Users/gary/Library/Application Support/iPhone Simulator/User/Applications

En son tarihe göre sıralanmış, en son Kitaplık / Tercihler uygulama klasörüne gidin ve dosyayı plist düzenleyicisinde görüntüleyin.



1

MacOS uygulamaları
için: /Users/{User <//Library/Containers/com.{your şirketiniz}. {Uygulamanız} / Veri / Kütüphane / Tercihler bölümüne gidin ve uygulamanızın pList'ini Xcode ile açın.


1

Swift 5 Xcode 11.2 Çözümü

Bu, UserDefaults anahtar değerlerinizin bir plist dosyasında olacağı yolun tamamıdır. Uygulama paketi tanımlayıcı .plist dosyanızı takip edin ve bulun.

/ Kullanıcılar / 'Kullanıcı Adınız' / Kütüphane / Geliştirici / CoreSimulator / Cihazlar / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / data / Konteynerler / Veri / Uygulama / 56D7CE31-9A8B-4371-9B0F-9604E239423B0 / Kütüphane / Tercihler

Burada "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2", Cihaz Kimliğinizdir

ve "56D7CE31-9A8B-4371-9B0F-9604E239423B0", Uygulama Kimliğinizdir

Normalde klasörleri Finder'da Değiştirilen son Tarihe göre sıralayarak alırım. En son düzenlenen klasör, cihaz kimliğim ve Uygulama Kimliğimdir.

Zevk almak!


0

Ayarladığınız her değeri NSLog yapabilirsiniz, örneğin:

NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);

0

Bu sorunun kabul edilen cevabını okuduktan sonra, NSUserDefaultstercihleri saklamak için iOS simülatörü tarafından kullanılan plist dosyalarını açan bu basit komut dosyasını bir araya getirdim ve belirli bir kurulumu varsayarken (benimkine mükemmel şekilde uyuyor), diğerleri için bir başlangıç ​​noktası olarak çalışabilir .

$ cat open-prefs-plist.sh
#!/bin/sh

# The project name based on the workspace path, e.g. "MyProject" from "./MyProject.xcworkspace"
WORKSPACE_NAME=$(echo `find . -name *.xcworkspace -type d -exec basename {} \;` | cut -d'.' -f1)
SIMULATOR_PATH="$HOME/Library/Application Support/iPhone Simulator"
# The App's bundle ID taken from its info plist, e.g "com.myproject" from "./MyProject/MyProject-Info.plist"
BUNDLE_ID=`/usr/libexec/PlistBuddy -c Print:CFBundleIdentifier $WORKSPACE_NAME/$WORKSPACE_NAME"-Info.plist"`
# Open all plist files in the simulator path that match the app's bundle ID 
# normally one per iOS version
find "$SIMULATOR_PATH" -name $BUNDLE_ID".plist" -type f -print0 \
    | while IFS= read -r -d '' PLIST; do
    echo $PLIST
    open "$PLIST"
done

Örnek yerleşim:

$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh

Bu senaryoyu çatallarla veya ellerle nasıl yerim? nereye koyayım yani?
Josh

1
@Josh Proje dosyalarınızın yanına koymanız gerekiyor (benim örneğimde komut dosyasının adı open-prefs-plist.sh). Ben bunu en son Xcode ile test etmedim. Bu bilgiyi şimdi incelemeniz için Flex'i öneriyorum. github.com/Flipboard/FLEX
Ernesto MB

0

Kullanıcı tercihleri, önbellek ve diğer birçok verinin tam yolunu bulmak için bunu kullanabilirsiniz.

print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))


0

Tercihler dizininin yolunu application:didFinishLaunchingWithOptions:AppDelegate'inizdeki geri aramayla yazdırabilirsiniz:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    print(FileManager.default.urls(for: .preferencePanesDirectory, in: .userDomainMask).first!)
    return true
}

Ardından, orada nelerin kaydedildiğini görmek için doğrudan plist dosyasına bakabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.