Xcode 6 iPhone Simulator Uygulama Destek konumu


137

Xcode 6'da, Temel Verileri kullandığım bir uygulamam var, ancak iOS 8 iPhone Simulator için Uygulama Desteği'nde klasör yok. Dosyalarım ve Core Data sqlite veritabanı nerede saklanıyor?


Deneyin bu . En son çalışan uygulamanın Belgeler dizinini doğrudan açan bir uygulama var.
NSRover

Temel Veri dosyalarının bulunduğu yolu programlı olarak nasıl alacağınızı gösteren bir yanıt (diğer yanıtların altına) ekledim.
SpokaneDude


"NSTemporaryDirectory ()" kullanın. Şuna
bakın-

Yanıtlar:


296

Simülatör dizini Xcode 6 beta ile taşındı ...

~/Library/Developer/CoreSimulator

Dizine uygulamanızın Belgeler klasörüne göz atmak biraz daha zahmetlidir, ör.

~/Library/Developer/CoreSimulator/Devices/4D2D127A-7103-41B2-872B-2DB891B978A2/data/Containers/Data/Application/0323215C-2B91-47F7-BE81-EB24B4DA7339/Documents/MyApp.sqlite

4
bu genel olarak doğrudur, ancak daha fazla dahili klasör değişikliği olduğu görülmektedir. Bu benim için Xcode Beta 3'te çalışan yoldur:~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
harryhorn

1
Verilere ulaşmak için tek şansın sayıların veya kaba kuvvetin olduğunu anlamanın bir yolu var mı?
vir us

89
NSLog (@ "app dir:% @", [[[NSFileManager defaultManager] URLsForDirectory: Alanlardaki NSDocumentDirectory: NSUserDomainMask] lastObject]); - veri klasörünün tam yolunu yazdıracağız
vir us

2
Hızlı hata ayıklama için uygulamamın belgeler dizininde kalıcı bir kısayola ihtiyacım vardı. Uygulamadan sonra didFinishLaunchingWithOptions. #if DEBUG NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName]; remove([aliasPath UTF8String]); [[NSFileManager defaultManager]createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil]; #endif İOS8 + XCode6, her oluşturduğumda Uygulamamın Veri GUID'ini değiştirmesine rağmen, şimdi çalışan bir simlink var.
levrek

32
xcrun simctl listKomut simülatörü adları ve cihaz UDID'ler arasındaki ilişkiyi görmek için kullanılabilir. Veya daha spesifik olarak xcrun simctl list deviceskomut.
ThomasW

36

Simulator dosyalarınızı bulmak için SimP sahiplerini kullanmanızı öneririm . Simülatör uygulamalarınızı izleyen ve doğrudan klasörlerine ve içeriğine gitmenizi sağlayan bir menü çubuğu öğesidir. Bu harika.


Ayrıca Yosemite üzerinde SimPholders2 ile ilgili sorunlar yaşıyordum, bu yüzden simülatör ve istediğiniz bir Finder penceresi bulmanıza ve açmanıza yardımcı olacak bir komut satırı komut dosyası başlattım. Tüm simülatör klasörlerini ve Uygulamaları listelemek için klasörlerden ve meta veri plist'lerinden geçer. Eğer ilgileniyorsanız, buradan
Rodrigo Lima

SimPholders2 Yosemite'de çalışıyor ama biraz yavaş; durum çubuğundaki simgeyi tıkladığınızda, birkaç saniye bekleyin ve görünmesi gerekir.
Jason

Whoa harika ve Yosemite + Xcode 6.3 ile son çalışır!
TruMan1

21

SimulatorManager uygulamasını çok kullanışlı buldum . Doğrudan kurulu simülatörlerin uygulama klasörüne götürür. 7.1, 8.0 ve 8.1 simülatörleri ile denedim.

SimulatorManager sistem tepsisinde bir simge olarak bulunur ve "Girişte Başlat" seçeneği sunar.

resim açıklamasını buraya girin

Not : Bu yalnızca Xcode 6 (benim durumumda 6.1.1) ve üstü ile çalışır.

Umarım yardımcı olur!


Amar, SimulatorManager'ı nasıl kurarsın? Ben Xcode bir eklenti olduğunu düşündüm ama bir Xcode projesi
malena

1
üst çubukta: Ürün -> Arşiv -> öğesini seçin ve ardından yeniden imzalamadan (son seçenek) Arşivi Mac Uygulaması olarak Dışa Aktarın Uygulama klasörünüze normal bir uygulama gibi koyabileceğiniz bir .app dosyası alırsınız. ..
Heckscheibe

11

.Sqlite dosyanızın AppDelegate.m dosyasında nerede depolandığını öğrenmek için aşağıdaki kodu ekleyin

- (NSURL *)applicationDocumentsDirectory
{
    NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory      inDomains:NSUserDomainMask] lastObject]);

    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory     inDomains:NSUserDomainMask] lastObject];
 }

şimdi bu yöntemi AppDelegate.m'de çağırın

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

  //call here
   [self applicationDocumentsDirectory];

}

harika .. birden fazla simülatör olduğunda özellikle yararlıdır
Yasitha Waduge

6

Bu benim için hızlı çalıştı:

let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")

3

Bir süre bununla güreştim. Sadece yerel sqlite db almak için büyük bir acı oldu. Bu komut dosyasını yazdım ve XCode içinde bir kod snippet'i yaptım. Ben appDidFinishLaunching benim appDelegate içine yerleştirin.


//xcode 6 moves the documents dir every time. haven't found out why yet. 

    #if DEBUG 

         NSLog(@"caching documents dir for xcode 6. %@", [NSBundle mainBundle]); 

         NSString *toFile = @"XCodePaths/lastBuild.txt"; NSError *err = nil; 

         [DOCS_DIR writeToFile:toFile atomically:YES encoding:NSUTF8StringEncoding error:&err]; 

         if(err) 
            NSLog(@"%@", [err localizedDescription]);

         NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];   

         NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName]; 

         remove([aliasPath UTF8String]); 

         [[NSFileManager defaultManager] createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil]; 

     #endif

Bu, sürücünüzün kökünde bir simlink oluşturur. (Bu klasörü ilk kez kendiniz oluşturmanız ve chmod yapmanız gerekebilir veya konumu başka bir yere değiştirebilirsiniz) Sonra xcodeway eklentisini yükledim https://github.com/onmyway133/XcodeWay

Biraz değiştirdim, böylece cmd + d tuşlarına basmamı sağlayacak ve mevcut uygulamamın kalıcı Belgeler dizinine bir bulucu sarıcı açacak. Bu şekilde, XCode'un yolunuzu kaç kez değiştirdiği önemli değil, sadece çalışma sırasında değişir ve simlinkinizi her çalıştırmada hemen günceller.

Umarım bu diğerleri için yararlıdır!


Teşekkürler, sadece XcodeWay'i iOS 8 simülatör klasörünü destekleyecek şekilde
güncelliyor

3

Bulucuyu aç> Kütüphane> Geliştirici> CoreSimulator> Cihazlar

Ardından bulucudan Düzenlemeyi Değiştir simgesi Eklenme Tarihi'ni seçin

Uygulamanızı seçin> veriler> Kapsayıcı> veri> Uygulamalar>

uygulamanızı seçin> Belgeler> İşte db dosyanız

Benim durumumda:

/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite

Aksi takdirde bunu yapın:

NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]); 

- Veri klasörünün tam yolunu yazdıracaktır.

Swift:

let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")

Swift 3.0:let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
AtomicBoolean

2

Finder'ı kullanın -> klasöre gidin ve uygulama klasörlerine ulaşmak için verilen temel yolu girin

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;

NSLog(@"%@",basePath);

1

Simülatör dosyayı ~ / Library / Developer / CoreSimulator / Devices / ... içine yerleştirir, ancak / Devices öğesinden sonraki yol herkes için farklıdır.

Bu kullanışlı yöntemi kullanın. Geçerli kullanıcı için geçici dizinin yolunu döndürür ve hiçbir bağımsız değişken almaz.

NSString * NSTemporaryDirectory ( void );

Yani benim ViewController sınıf ben genellikle benim CoreData saklanan dosya kapmak gerektiğinde sadece bir referans için benim viewDidLoad bu satırı koymak. Bu yardımcı olur umarım.

  NSLog(@"FILE PATH :%@", NSTemporaryDirectory());

(Not: yola gitmek için, bulucu menüsünden Git'e tıklayın ve gizli dizini açmak için ~ / Library yazın ve Finder Penceresinde konsolunuzda gösterilen yolu tıklayabilirsiniz.)


1

Bu konum bir kez daha değişti, Swift kullanıyorsanız, klasörün nerede olduğunu bulmak için bunu kullanın (bu, Apple'ın sizin için oluşturduğu AppDelegate.swift dosyasından kopyalanır, böylece makinenizde çalışmazsa, doğru sözdizimi için bu dosya, Xcode 6.1 ve iOS 8 simülatörü kullanılarak benimki üzerinde çalışır):

let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")

1

Simülatörler:

~/Library/Developer/CoreSimulator/

Burada, UUID isimleri olan dizinler olarak listelenirler. En sonuncuyu bulmak için 'Değiştirme tarihi' ile sıralamayı kullanın. Içinde şuraya gidin:

/data/Containers/Data/Application/

Burada o cihazdaki tüm uygulamaların bir listesini alacaksınız. En son uygulamayı almak için bunu tekrar sıralayabilirsiniz.

NOT: Xcode, uygulamayı her çalıştırdığınızda dizin adını değiştirir, bu nedenle masaüstünde takma ad / kısayollar yapmaya güvenmeyin.

En kolay yol, her şeyi otomatik olarak yapan uygulamayı burada kullanmaktır .


1

Herhangi bir simülatör için oluşturulan en son uygulamayı ve masaüstüne zipleyecek bu komut dosyasını oluşturdum.

https://gist.github.com/Gerst20051/8ca49d5afbf09007b3696fab6e9f425c

#!/bin/bash

DESTINATION_DIR="$HOME/Desktop"
APP_PATH=$(find ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Bundle/Application/*/*.app -type d -maxdepth 0 -print0 | xargs -0 ls -td | head -n1)
APP_DIRNAME=$(dirname "$APP_PATH")
APP_BASENAME=$(basename "$APP_PATH")
FILE_NAME="${APP_BASENAME%.*}"

cd "$APP_DIRNAME"
zip -qr "$DESTINATION_DIR/$FILE_NAME.zip" "$APP_BASENAME"

1

Swift 4 veya Swift 5'de kullanabilirsiniz NSHomeDirectory().

Xcode 10'daki (veya Xcode 11) en kolay yol, uygulamanızı duraklatmak (bir kesme noktasına çarptığında olduğu gibi) ve bu satırı hata ayıklayıcı konsolunda çalıştırmaktır:

po NSHomeDirectory()

po yazdırma nesnesini temsil eder ve birçok şeyi yazdırır


0
 1.   NSTemporaryDirectory() gives this:

    /Users/spokaneDude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/199B1ACA-A80B-44BD-8E5E-DDF3DCF0D8D9/tmp

 2. remove "/tmp" replacing it with "/Library/Application Support/<app name>/"  --> is where the .sqlite files reside

0
  1. Swift 4 ile, uygulamanızın ana dizinini almak için aşağıdaki kodu kullanabilirsiniz. Uygulamanızın belge dizini orada.

    print(NSHomeDirectory())

  2. Uygulamanızın ana dizininin değiştirilebilir olduğunu zaten biliyorsunuzdur, bu nedenle kod tabanınıza ek kod eklemek istemiyorsanız, SimPholder sizin için güzel bir araçtır.

  3. Dahası, uygulamanızın ana dizini her değiştikten sonra aynı SQLite veritabanını kapatıp yeniden açarak zaman kazanmanıza yardımcı olabilecek bir araç olduğunu merak edebilirsiniz. Ve cevap evet, bildiğim bir araç SQLiteFlow . Belgesinden şunu söylüyor:

    Veritabanı dosya adı veya dizin değişikliklerini işleyin. Bu, SQLiteFlow'un iOS simülatöründeki SQLite veritabanınızla uyumlu çalışmasını sağlar.


0

İşte son kullanılan simülatör ve uygulama için sh . Sh'yi çalıştırın ve basılı metni kopyalayın ve bulucuda göstermek için yapıştırın ve çalıştırın.

#!/bin/zsh

lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`

echo $lastUsedSimulatorAndApplication
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.