【问题标题】:Xcode 6 iPhone Simulator Application Support locationXcode 6 iPhone Simulator 应用程序支持位置
【发布时间】:2014-08-09 01:40:52
【问题描述】:

在 Xcode 6 中,我有一个正在使用 Core Data 的应用程序,但 iOS 8 iPhone 模拟器的应用程序支持中没有文件夹。我的文件和 Core Data sqlite 数据库存储在哪里?

【问题讨论】:

标签: ios xcode core-data ios8 xcode6


【解决方案1】:

模拟器目录已随 Xcode 6 beta 移动到...

~/Library/Developer/CoreSimulator

将目录浏览到应用的 Documents 文件夹有点费劲,例如,

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

【讨论】:

  • 这通常是正确的,但似乎有更多的内部文件夹更改。这是在 Xcode Beta 3 中适用于我的路径:~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
  • 有没有办法理解数字或蛮力是获取数据的唯一机会?
  • NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]); - 将打印数据文件夹的完整路径
  • 我需要一个指向我的应用程序文档目录的持久快捷方式,以便快速调试。应用后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 现在我有了一个可以工作的 simlink,即使 iOS8 + XCode6 每次构建时都会更改我的应用程序的数据 GUID。
  • xcrun simctl list命令可以用来查看模拟器名称和设备UDID的对应关系。或者更具体地说是xcrun simctl list devices 命令。
【解决方案2】:

我建议您使用SimPholders 来查找您的模拟器文件。它是一个菜单栏项,可跟踪您的模拟器应用程序并让您直接进入它们的文件夹和内容。太棒了。

【讨论】:

  • 我在 Yosemite 上也遇到了 SimPholders2 的问题,所以我启动了一个命令行脚本来帮助您找到并打开一个 Finder 窗口来连接您想要的模拟器和应用程序。它通过文件夹和元数据列表列出所有模拟器文件夹和应用程序。如果有兴趣,请查看here
  • SimPholders2 在优胜美地工作,但有点慢;单击状态栏中的图标后,只需等待几秒钟,它就会出现。
  • 哇,Yosemite + Xcode 6.3 的最新作品太棒了!
【解决方案3】:

我发现SimulatorManager 应用程序非常有用。它会将您直接带到已安装模拟器的应用程序文件夹。我试过 7.1、8.0 和 8.1 模拟器。

SimulatorManager 作为图标驻留在系统托盘中,并提供“登录时启动”选项。

注意:这仅适用于 Xcode 6(在我的情况下为 6.1.1)及更高版本。

希望有帮助!

【讨论】:

  • Amar,你如何安装 SimulatorManager?我以为它是 Xcode 的插件,但它是一个 Xcode 项目
  • 在顶部栏中选择:产品->存档->然后将存档导出为Mac应用程序而不重新签名(最后一个选项),您将获得一个可以放入的.app文件你的应用程序文件夹就像一个普通的应用程序......
【解决方案4】:

要知道 .sqlite 文件在 AppDelegate.m 中的存储位置,请添加以下代码

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

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

现在在 AppDelegate.m 中调用此方法

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

  //call here
   [self applicationDocumentsDirectory];

}

【讨论】:

  • 太棒了.. 当有多个模拟器时特别有用
【解决方案5】:

这对我很有效:

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

【讨论】:

    【解决方案6】:

    我为此苦苦挣扎了一段时间。简单地访问我本地的 sqlite 数据库变得非常痛苦。我编写了这个脚本,并在 XCode 中将其作为代码 sn-p。我将它放在我的 appDidFinishLaunching 中的 appDelegate 中。

    
    //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
    
    

    这会在驱动器的根目录创建一个 simlink。 (第一次你可能需要自己创建这个文件夹,然后chmod它,或者你可以改变位置到其他地方)然后我安装了xcodeway插件https://github.com/onmyway133/XcodeWay

    我对其进行了一些修改,以便它允许我简单地按 cmd+d 并打开一个查找器卷绕器到我当前应用程序的持久文档目录。这样,无论 XCode 更改路径多少次,它只会在运行时更改,并且在每次运行时立即更新您的 simlink。

    我希望这对其他人有用!

    【讨论】:

    • 谢谢,我刚刚更新了 XcodeWay 以支持 iOS 8 模拟器文件夹
    【解决方案7】:

    打开 finder>Library>Developer>CoreSimulator>Devices

    然后从查找器中更改排列图标选择添加日期

    选择您的应用>数据>容器>数据>应用程序>

    选择您的应用>文档>这是您的数据库文件

    就我而言:

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

    否则这样做:

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

    - 它将打印数据文件夹的完整路径。

    斯威夫特:

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

    【讨论】:

    • Swift 3.0:let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
    【解决方案8】:

    使用 Finder-->转到文件夹并输入给定的基本路径以访问应用程序文件夹

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

    【讨论】:

      【解决方案9】:

      模拟器把文件放在~/Library/Developer/CoreSimulator/Devices/... 但是/Devices后面的路径每个人都不一样。

      使用这个方便的方法。它返回当前用户的临时目录的路径,不带任何参数。

      NSString * NSTemporaryDirectory ( void );
      

      因此,在我的 ViewController 类中,我通常将这一行放在我的 viewDidLoad 中,以供我需要获取我的 CoreData 存储文件时参考。希望这可以帮助。

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

      (注意:要转到路径,从 finder 菜单中单击 Go 并输入 ~/Library 以打开隐藏目录,然后在 Finder 窗口中您可以单击控制台上显示的路径。)

      【讨论】:

        【解决方案10】:

        此位置再次更改,如果使用 Swift,请使用它来查找文件夹的位置(这是从 Apple 为您创建的 AppDelegate.swift 文件复制的,因此如果它在您的计算机上不起作用,在该文件中搜索正确的语法,这适用于我使用 Xcode 6.1 和 iOS 8 模拟器):

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

        【讨论】:

          【解决方案11】:

          模拟器位于:

          ~/Library/Developer/CoreSimulator/

          在这里,它们被列为具有 UUID 名称的目录。使用按“修改日期”排序来查找最新的。里面导航到:

          /data/Containers/Data/Application/

          您将在此处获得该设备上所有应用程序的列表。您可以再次对其进行排序以获得最新的应用程序。

          注意: Xcode 每次运行应用程序时都会更改目录名称,因此不要依赖于在桌面上创建别名/快捷方式。

          最简单的方法是使用应用程序here,它会自动完成所有操作。

          【讨论】:

            【解决方案12】:

            我创建了这个脚本,它将压缩为任何模拟器构建的最新应用程序并将其压缩到桌面。

            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"
            

            【讨论】:

              【解决方案13】:

              在 Swift 4 或 Swift 5 中,您可以使用 NSHomeDirectory()

              Xcode 10(或 Xcode 11)中最简单的方法是暂停您的应用程序(例如当它遇到断点时)并在调试器控制台中运行此行:

              po NSHomeDirectory()
              

              po 代表打印对象,打印大部分东西

              【讨论】:

                【解决方案14】:
                 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
                

                【讨论】:

                  【解决方案15】:
                  1. 使用 Swift 4,您可以使用以下代码获取应用的主目录。您的应用的文档目录就在其中。

                    print(NSHomeDirectory())

                  2. 我想你已经知道你的应用程序的主目录是可以更改的,所以如果你不想在你的代码库中添加额外的代码,SimPholder 对你来说是一个不错的工具。

                  3. 此外,您可能想知道是否有一种工具可以帮助您在每次更改应用的主目录后节省关闭和重新打开同一个 SQLite 数据库的时间。答案是肯定的,我知道的一个工具是SQLiteFlow。从它的文件中可以看出:

                    处理数据库文件名或目录更改。这使得 SQLiteFlow 可以在 iOS 模拟器中与您的 SQLite 数据库友好地工作。

                  【讨论】:

                    【解决方案16】:

                    这是上次使用的模拟器和应用程序的 sh。只需运行 sh 并复制打印的文本并粘贴并运行命令以在 finder 中显示。

                    #!/bin/zsh
                    
                    lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
                    
                    echo $lastUsedSimulatorAndApplication
                    

                    【讨论】:

                      猜你喜欢
                      • 2014-11-14
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-01-23
                      • 1970-01-01
                      • 2014-11-30
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多