As has been stated you can simply unzip and zip again to create your own ipa.
All you further need is to add some resources that don't need code signing.
Your best bet would be to create a new (empty) directory in the ipa. Directories themselves are not signed, but are extracted on the device and can be detected by your code.
In other words: the CodeResources
file containing the signatures does not change when adding an empty directory.
A simple test I just did, was to create a folder reference to a folder called "extra", the contents of which are decoded using percent encoding and displayed in a popup:
NSString *path = [[NSBundle mainBundle] pathForResource:@"extra" ofType:@""];
NSDirectoryEnumerator *direnum = [[NSFileManager defaultManager] enumeratorAtPath:path];
NSString *f;
while (f = [direnum nextObject])
{
NSString *decoded = [f stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:nil message:decoded delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
[alert show];
}
This can be used to send subliminal messages to your code. Percent encoding allows you to put in any character you like. I tested filename lengths up to 100 chars.
All you further need is some code to dynamically add an empty directory under Payload/yourapp.app/extra/
to the ipa, with the percent encoded message as its filename, e.g. Payload/yourapp.app/extra/http%3A%2F%2Fstackoverflow.com%2F
update: example shell commands to add a directory to an ipa:
$ mkdir -p Payload/myapp.app/extra/http%3A%2F%2Fstackoverflow.com%2F
$ zip -r myapp.ipa Payload/
updating: Payload/ (stored 0%)
updating: Payload/myapp.app/ (stored 0%)
updating: Payload/myapp.app/extra/ (stored 0%)
adding: Payload/myapp.app/extra/http%3A%2F%2Fstackoverflow.com%2F/ (stored 0%)
$ rm -r Payload/
You will of course need to create a clean copy of the ipa every time, or the urls will pile up under /extra/
inside the ipa.