Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

organizing xcode 4.0 copy bundle resources

Is there an easy way to organize the files within the Copy Bundle Resources in xcode 4.0? I have multiple targets for my project, and every time I add files, I need to, most of the time, add them to every project. It would help a great deal if I had an easy way to catch myself when I mistakenly forget to copy resources to every target (other than just looking at the count of files in the bundle, which will eventually diverge from being the same for each project).

It'd be a lot easier if I could make folders within the resources list, but it doesn't seem I can. At the very least it might help if I could automatically alphabetize them.

like image 486
Joey Avatar asked Dec 23 '10 22:12

Joey


Video Answer


1 Answers

What you have to do is to parse .pbxproj file. All linked file and resources in .pbxproj are identified from their own UUID. So,

  1. Get the rootObject's UUID
  2. Get list of targets UUID from rootObjects
  3. For each target get the list of UUID for Resource, Source and Framework. And find the list of files UUID for all of the three resource types
  4. Compare the list of resources for each of the targets.

Some hints, The format of the project file is like this, the rootObject refer to other objects.

{
    archiveVersion = 1;
    classes = {
    };
    objectVersion = 45;
    objects = {
         /* .... List of all objects are here .... */
        }
    rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
}

From the rootObject we can follow the targets value.

/* Begin PBXProject section */
        29B97313FDCFA39411CA2CEA /* Project object */ = {
            isa = PBXProject;
            buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MyProject" */;
            compatibilityVersion = "Xcode 3.1";
            developmentRegion = English;
            hasScannedForEncodings = 1;
            knownRegions = (
                English,
                German,
                de,
            );
            mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
            projectDirPath = "";
            projectRoot = "";
            targets = (
                1D6058900D05DD3D006BFB54 /* TargetDebug */,
                C446CDCB12BA35A1001324C8 /* TargetAdHoc */,
                C446CF2D12BA3DDC001324C8 /* TargetAppStore */,
            );
        };
/* End PBXProject section */

In the target section of the project file, buildPhases contains the link to the copied bundle resources list and link.

    /* Begin PBXNativeTarget section */
            1D6058900D05DD3D006BFB54 /* TargetAdHoc */ = {
                isa = PBXNativeTarget;
                buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "TargetAdHoc" */;
                buildPhases = (
                    1D60588D0D05DD3D006BFB54 /* Resources */,
                    1D60588E0D05DD3D006BFB54 /* Sources */,
                    1D60588F0D05DD3D006BFB54 /* Frameworks */,
                );
                buildRules = (
                );
                dependencies = (
                );
                name = TargetAdHoc;
                productName = MyProject;
                productReference = 1D6058910D05DD3D006BFB54 /* MyProject.app */;
                productType = "com.apple.product-type.application";
            };


C446CDCC12BA35A1001324C8 /* Resources */ = {
            isa = PBXResourcesBuildPhase;
            buildActionMask = 2147483647;
            files = (
                C446CDCD12BA35A1001324C8 /* MainWindow.xib in Resources */,
                    /* ....... list of all PNGs and XIB files..... */
                            81CDEBBF13B21B790067A088 /* AnImage.png in Resources */,
            );
            runOnlyForDeploymentPostprocessing = 0;
        };
like image 141
karim Avatar answered Sep 18 '22 18:09

karim