Hiding nib file in target application package and package organization issue - xcode

When I create an project of OS X normally, and then build it. When I click "Show Package Contents" on the target app, in its ./Contents/Resources directory, all resources (nib files, image files, sound files, etc) are put together.
Now there are several questions:
<1> Can I hide my nib files from user to keep the completeness of it?
<2> This may similar with the first one: can I package other resource files or encrypted them in on or several target file so that user could not modify them? Just like Windows applications do?
<3> Can I organize my resources by directory in target package content? For example, if I show the package content of Firefox, all files are organized pretty.

1) .nib files are readonly by default in XCode 4, the user cannot view or edit them.
2) Binary encryption can be done perhaps adopting from iOS to osx: Executable encryption check anti piracy measure
3) Organization can be done via drag and drop of folders: Create your folder in the filesystem, then drag it to the resource folder in XCode. In the following dialog select create folder reference for any added folder. The folder should be blue. This folder is copied to your bundle with its contents.

Related

Create groups vs Create folder reference in Xcode

I'm curious when using Xcode.
I always need to choose an option when copying the open source class files I need for my project.
The options are "Create groups" and "Create folder references".
I've read the difference between the two already.
But it is not understood at all.
When I chose one of the two options, I deleted the file from my project and the open source class file was deleted at the same time.
I do not want it.
I want to always exist as an independent file. What should I choose?
It took me a while to understand the difference between those two options so I thought I'd share:
I'm writing this when Xcode 12 is the current version
The biggest difference is how the imported folder / file will be accessible from the finder. Let's say you want to import a new folder to your Xcode project. When you choose Create groups Xcode will import your new folder and create a group (the yellow icon). When you go to your project's directory (using Finder) you should see a folder named like the one you've just imported, but any additional files you put to this folder trough Finder won't be visible in your Xcode project.
When you choose Create folder references the imported folder will have a classic blue folder icon in Xcode. This new folder will also be visible when you go to your projects directory, but now every new file you put there will also appear in your Xcode project.
If you want to know more just read this explanation http://www.thomashanning.com/xcode-groups-folder-references/
It's pretty straightforward and easy to understand.
There are two types of any Xcode project structure organization:
filesystem project structure (inspectable with Finder.app)
IDE project structure (inspectable with Project Navigator in Xcode's navigator area.)
Xcode relies on filesystem organization by keeping a reference to a "physical" file or folder. That is why you may have all the classes, images, plists, and other parts of your projects stored in the same folder, while the references to these parts are being kept organized into respective groups within Xcode project.
When you create a group, it affects the organization of your project in Xcode. When you create a group with a reference folder, it creates both, a group in Xcode project and a folder in your filesystem.
However, since Xcode 9 it seems like, Apple enforces filesystem project structure to correspond to Xcode project structure. It means, that you explicitly has to choose "New Group without Folder"
Added files and folders from Finder into the Xcode group. Xcode 10.2.1. Just take a look at the examples without Copy items if needed
Files
Common behaviour for create groups and create folder references
Rename a file from Finder does not rename the file in Xcode, as a result Xcode doesn't handle it and it will mark them by red color.
Rename a file from Xcode rename the file in Finder
Change a file from Finder change the file in Xcode and vice versa
Remove to trash a file from Xcode change the file in Finder and vice versa
Add a file from folder in Finder does not add the file to group in Xcode
Folders
Common behaviour for create groups and create folder references:
Rename a folder/group from Xcode rename the folder in Finder
create groups
If you choose create groups, then the corresponding folder appears with a yellow icon in the project navigator.
It is just a virtual folder. It useful during development when you copy a file and it is not compiled and you do not have a time to make changes in it and want only to check if a project works. So you can just remove a reference from a file. It will not be removed from a folder as a result you will be able to add this file again.
Rename a folder in Finder does not rename a name of group in Xcode. You steal can work with group but previous content inside although visible but unavailable
Add a file to a folder in Finder does not add the file to group in Xcode
Add a file to a group in Xcode does not add the file to folder in Finder
Remove a folder in Finder does not remove the group in Xcode. You steal can work with group but previous content inside although visible but unavailable
create folder references
If you are choosing create folder references, then the folder appears with a blue icon in the project navigator.
It is a real folder and any changes will be reflected
Rename a folder in Finder does not rename a name of folder in Xcode. The previous content is gone and you can not work with this folder
Add a file to a folder in Finder adds the file to folder in Xcode
Add a file to a folder in Xcode adds the file to folder in Finder
Remove a folder in Finder removes the folder in Xcode.
[Copy items if needed]
Create folder references:
Useless because even if you list this folder to be included with a target, Xcode won't include any of its contents in that target and there's no way to click on something in the folder and see which targets it's included in.
Create groups:
This is the only way to go, if you want to include any of the folders' contents in a build target.

How to include support documents in xcode cocoa app?

In iOS version of app, sample/template files are added to Xcode in a group and then become a directory of that name within the app bundle. Easy enough.
What is the Cocoa equivalent? When I try the same thing, Xcode (Swift 3) fails on build with a "Command /usr/bin/codesign failed with exit code 1". How does one add support files (or directory of files) to a Cocoa app?
In macOS, I guess you mean that, every App creates a Resources Folder inside the NSBundle. Just check with right click "Show Bundle Content".
If you add resources to Xcode, just by dragging the file anywhere in your project navigation, will be asked to copy that file if needed.
I usually create a group with Supporting File, but thats arbitrary, because it has nothing to do with the file structure inside the project folder on disk nor with the product package.
To create groups just right mouse and select group.
This copies the file inside the Xcode project Folder. And if you choose to add target, then the file will be included to that Resource folder.
You can ask for that File with:
let bundle = Bundle.main
let path = bundle.path(forResource: "Test", ofType: "txt")
Edit
if you have to code sign your resources, then ope the copy files menu in Build Phases, add with the plus button your resource and check code sign on copy. This should provide a proper signing for your resource.
Hope it helps!

Folders not showing up on disk from XCode

I added a folder to my project in XCode and called it Themes, which will be used to store themes for my iPad app. Under that I have Red,Blue, and so forth.
They show up in XCode. But when I look at the physical folder, there is no Themes directory (and obviously anything under it).
Why not? Where did it go? How can I store images (which may have same names) under different paths (themes)?
Thanks in advance
XCode does not create "folder", it creates "groups". Groups are logical organization of your files, independent of the file system organization underneath it
If you want to actually have a folder, easiest way would be to create one on the file system first (through Finder), and then drag it to XCode's project navigator. When a confirmation window pops up, leave the default settings ("Copy items into destination" and "Create groups for any added folders")
This will import the folder and all the files in it, however it will not auto-import newly added files to the folder after this (you'd have to manually add them).
If you do want to auto-import newly added files from the file system's folder to this group in XCode, instead of using "Create groups for any added folders", change to "Create folder references to any added folders"

Where to store custom icons in Xcode 4?

I am creating my own icons for buttons. I did some snooping around, and it looks like application icons usually go under:
ApplicationName/Contents/Resources/some.png
What do I do to recreate my own structure like this for icons? I don't see any "Content/Resources" in Project navigator.
Xcode will move the icons to the Resources folder in your app package automatically during a build.
Just add the icon files to your Xcode project and it will detect that they are image resource files and add them to the Copy Bundle Resources build phase for you. Any files that are included in the Copy Bundle Resources build phase will be copied to the Resources folder in the built app's bundle.
It doesn't matter which group you put the images into in the Xcode files list because the file group organisation is ignored in the built product, so feel free to put them where you like. I often create a Media group with subgroups such as Images and Audio but it's completely up to you.

Settingup Xcode project to add new file in custom directory

How can i setup my Xcode project so that it creates new class files (.h/.m) in Classes directory and new interface files (.xib/.nib) in Interfaces directory?
By default Xcode adds new files in the root project directory, and i have to manually put these into Classes and Interfaces directories.
Edit:
I'm referring to the Xcode File > New File... option. I want the new files created from the Xcode project to move automatically to corresponding directories e.g. .h/.m files get automatically created in Classes directory, and .xib get automatically created in Interfaces directory etc. And i mean physical directories, not Xcode "Groups".
I assume you've made a group (folder) called Classes, or something along these lines, inside your Xcode project. Select it and do Command+I (or right-click it and select Get Info). Change the "Path" option to the place where you want files to be created.
Please note that it will only affect files you create on it. Creating them elsewhere then moving them to this group will not move them into the directory.
EDIT The above answer applies to Xcode 3. In Xcode 5, you would need to select the logical group in the Project Navigator (first navigator tab, bring it up with ⌘1) and then inspect it with the File Inspector (first utility tab, bring it up with ⌥⌘1). The default physical folder for all the new files can be changed by clicking the folder icon below the Location dropdown menu.
In Xcode 5, it auto-selects the default folder on disk to match to the project folder in the sidebar for certain folders, and it is possible to manually establish this linkage.
In my project, I have sidebar groups for AppName, AppNameTests, and one I created myself called Shared Components. When I select the AppName group in the sidebar and create a class, the Save dialog automatically drills into the AppName subdirectory inside the top-level AppName folder on disk, and does the same for classes created inside AppNameTests.
I was unable to get Xcode to mimic this behaviour with my custom Shared Components sidebar group, despite having a Shared Components folder on disk, but I figured out how to coerce it!
Xcode simply needed to know that the on-disk folder was what my sidebar group was all about. To do that:
Open your project's folder up in the Finder
Drag the folder you'd like linked into the sidebar into the project organizer.
When Xcode presents its "Add Files" dialog, select "Create groups for any added folders". (These are the dialog options I selected:
Now, when I select this sidebar group and create a file, the Save dialog starts in the folder I dragged into the project sidebar. Victory!
Edit: I discovered the keys that Xcode uses in the project.pbxproj file for this: if you change a folder's name key to path, i.e.
path = "Shared Components";
that's basically what Xcode is doing when you add a folder to the project as a group reference. (You can also use both name and path keys if you want the sidebar name to be different than the on-disk path.)

Resources