No edit summary |
|||
Line 89: | Line 89: | ||
So let's make a simple application real quick. This will not be the best written app in the world but it will have enough explanation for you to understand what you need to do if you want multiple files. | So let's make a simple application real quick. This will not be the best written app in the world but it will have enough explanation for you to understand what you need to do if you want multiple files. | ||
Make 3 files: <tt>main.m</tt>, <tt>TestLabel.h</tt>, and <tt>TestLabel.m</tt>. | Make a folder in <tt>/var/mobile</tt> called <tt>test_app_src</tt>. | ||
Change directory into this folder and make 3 files: <tt>main.m</tt>, <tt>TestLabel.h</tt>, and <tt>TestLabel.m</tt>. | |||
=== <tt>main.m</tt> === | === <tt>main.m</tt> === | ||
Line 176: | Line 178: | ||
</source> | </source> | ||
If you didn't get any errors, go ahead and open the app again and you should see this: | If you didn't get any errors, when you list the contents of the directory you should see this: | ||
<source lang="bash"> | |||
main.m TestLabel.m TestLabel.h main.o TestLabel.o Test | |||
</source> | |||
Copy <tt>Test</tt> into /Applications/Test.app/ and overwrite the old empty <tt>Test</tt> file you created earlier. | |||
Then, go ahead and open the app again and you should see this: | |||
[[File:4fd0b2623ffbdcb5c19e5e959bb25344.png|200px]] | [[File:4fd0b2623ffbdcb5c19e5e959bb25344.png|200px]] |
Revision as of 00:40, 3 December 2014
This article will be useful to anyone that does not have a Mac to compile apps or does not want to pay the $100/year fee to run code on your own device.
You don't even need a secondary desktop or a laptop to do this! However it is not recommended to actually code the app directly on-device, unless if you're a masochist or something.
Prerequisites
Aquire an iOS device with iOS 5 or higher and jailbreak it.
This technically could work with lower iOS versions, but the available toolchain on Cydia was compiled for iOS 5.
Install the toolchain
Open Cydia and install these:
- Tape archive
- iOS toolchain
- OpenSSH
- wget
Or just run
apt-get install tar org.coolstar.iostoolchain openssh wget
as root (default password: alpine).
Get the SDK
They are found here: http://iphone.howett.net/sdks/
You can literally use any SDK you want as long as they have the frameworks you need, however it is recommended you use the iOS 7 SDK or higher as the lower ones do not support arm64 (optimized for iPhone 5s and higher).
Right click "Download" on one of the SDKs and copy the link.
SSH into your device (user: mobile, default password: alpine) and run these commands:
cd /var/mobile
mkdir sdks
cd sdks
wget http://iphone.howett.net/sdks/dl/iPhoneOS8.1.sdk.tbz2 #or whatever SDK you wanted
tar xvf iPhoneOS8.1.sdk.tbz2
rm iPhoneOS8.1.sdk.tbz2
ln -s iPhoneOS8.1.sdk Latest.sdk
Boom. Your device can fully now compile iOS applications.
Creating a vanilla app
Creating the app structure
Login as root (default password: alpine) and run these commands:
cd /Applications
mkdir Test.app
cd Test.app
touch Test
chmod +x Test
Then create a file Info.plist in /Applications/Test.app/ with the following contents:
<dict>
<key>CFBundleExecutable</key>
<string>Test</string>
<key>CFBundleIdentifier</key>
<string>net.iphonedevwiki.test</string>
<key>CFBundleName</key>
<string>LOL</string>
</dict>
Then switch back to mobile and run:
uicache
If you did everything right, once the command is done running you should see this on your homescreen:
(On iOS 6 and lower, there would be no lines in the white square)
When you try to open the app, it will crash! That's because you actually haven't written anything yet.
Actually writing a working app
So let's make a simple application real quick. This will not be the best written app in the world but it will have enough explanation for you to understand what you need to do if you want multiple files.
Make a folder in /var/mobile called test_app_src.
Change directory into this folder and make 3 files: main.m, TestLabel.h, and TestLabel.m.
main.m
#import <UIKit/UIKit.h>
#import "TestLabel.h"
@interface LyAppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic, strong) UIWindow *window;
@end
int main(int argc, char *argv[])
{
@autoreleasepool
{
return UIApplicationMain(argc, argv, nil, NSStringFromClass(LyAppDelegate.class));
}
return 0;
}
@implementation LyAppDelegate
@synthesize window=_window;
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [UIWindow.alloc initWithFrame:UIScreen.mainScreen.bounds];
self.window.backgroundColor = UIColor.redColor;
UILabel *label = [[TestLabel alloc] initWithBackgroundColor:self.window.backgroundColor];
[self.window addSubview:label];
[label release];
[self.window makeKeyAndVisible];
return true;
}
@end
TestLabel.h
#import <UIKit/UIKit.h>
@interface TestLabel : UILabel
-(instancetype)initWithBackgroundColor:(UIColor *)backgroundColor;
@end
TestLabel.m
#import "TestLabel.h"
@implementation TestLabel
-(instancetype)initWithBackgroundColor:(UIColor *)backgroundColor
{
if(self == [self init])
{
self.backgroundColor = backgroundColor;
self.textColor = UIColor.whiteColor;
self.text = @"rofl";
self.frame = CGRectMake(20,20,300,300);
}
return self;
}
@end
Compiling
Run these commands:
clang -isysroot /var/mobile/sdks/Latest.sdk \
-c main.m
clang -isysroot /var/mobile/sdks/Latest.sdk \
-c TestLabel.m
clang -isysroot /var/mobile/sdks/Latest.sdk \
-framework Foundation \
-framework UIKit \
main.o TestLabel.o \
-o Test
If you didn't get any errors, when you list the contents of the directory you should see this:
main.m TestLabel.m TestLabel.h main.o TestLabel.o Test
Copy Test into /Applications/Test.app/ and overwrite the old empty Test file you created earlier.
Then, go ahead and open the app again and you should see this:
WAU, that AMAZING!!!
That's pretty much all you need to know to get started. If you want to use more frameworks (like AVFoundation or something) add the `-framework AVFoundation` flag during the last compile step (kinda like how I used UIKit and Foundation).
Other details
Enabling automatic reference counting (ARC)
Add the -fobjc-arc flag when compiling.
Icons, default backgrounds, entitlements, etc
Check out Apple's documentation on the subject. No need to write it twice. You can also look in any of the other Info.plists in the /Applications/ directory on your device! Cydia.app would be a good place to start.
Uninstalling
Delete it from /Applications/ and run uicache as mobile again. iOS thinks it's a system app, so you can't delete it like a normal iOS app.