Dev:Getting Started

Learning C and Objective-C
If you have no programming experience and you want to write extensions/tweaks, you'll need to learn a lot about Objective-C and developing ordinary apps for iOS. (If you'd like to first try modifying code in simple ways to explore some possibilities, you can try the paid package Flex, on the BigBoss repository in Cydia.)

Code School has a free iOS programming course for beginners that can give you a taste. You can also try the free courses offered by Codecademy - they're not about Objective-C or iOS, but they can give you a general sense of what programming is like.

For further study:


 * Apple's developer documentation - see the Xcode page and Start Developing iOS Apps Today.


 * Videos: Stanford's "Developing iOS 7 Apps for iPhone and iPad" class on iTunes U and The New Boston video tutorials.


 * Books: Programming in Objective-C by Stephen G. Kochan and Objective-C Programming: The Big Nerd Ranch Guide by Aaron Hillegass.


 * Forums: unofficial iPhone Dev SDK forum and Stack Overflow.

It's good to learn some C too; it'll give you a better foundation for learning Objective-C. You'll want to know about pointer arithmetic, the Objective-C runtime, buffer overflows, bitwise operations, the model-view-controller pattern, etc.

Ideally you'll get to a point where you're comfortable writing and running code for iOS. If you're already there, definitely keep reading!

Setting up Theos
Follow Theos/Getting Started to set up your Theos environment by installing Theos and creating your first project. These links may also be helpful: guide on Stack Overflow, this Theos documentation by theiostream, and Theos Install Script.

You'll probably also want to read more about Cydia Substrate - see saurik's Substrate documentation.

Finding example projects
Here is a list of just a few of the many open source projects that can be used as examples: Open Source Projects.

For some simple example projects you can build with Theos, see codyd51's Theos Examples.

Not finding what you are looking for? Try searching through GitHub for iOS Tweaks with a simple trick, "extension:xm".

Example:

Using the above code will search GitHub for all files with the extension .xm (because Theos by default creates a Tweak.xm file when creating a new tweak). The example above will result in finding tweaks that reference SBAwayController. Not all developers use the .xm file extension, but a large number do, and this will help you in finding those examples.

Looking at frameworks, classes, and processes
To figure out what code to modify, you'll want to explore around iOS and apps.

You can extract Objective-C class interfaces with class-dump, class_dump_z, or classdump-dyld. Remember that the resulting files are not the original headers, so use them with caution.

You can also find other developers have done this process for many frameworks and compiled their work into github repositories. Here's two of them:
 * iOS-Runtime-Headers
 * iphoneheaders

For further help, take a look at Finding classes/methods and using them by Sassoty.

See Reverse Engineering Tools for detailed information about these tools and many others, including Logify.

See Notifications for information about observing and posting notifications informing observers of events within a process and for IPC purposes, for example.

Prototyping a tweak
You can use Cycript to explore running processes. Check out the official manual, especially the section about process injection. For a demo, see Adam Bell's JailbreakCon talk (example code and slides).

Building your tweak
After prototyping you will want to make your tweak into a project to build it and debug it. To achieve this you will most likely use Theos - see Theos/Getting Started. It is available for different platforms including iOS and Mac OS, and, to a certain extent, Linux. On Mac OS you can use Xcode's command line tools, but for the other platforms you should use a toolchain. On iOS there are two available toolchains (On-device toolchains), and there is a project for Windows.

To learn about setting up your package's control file, see saurik's article on building packages. If you need to list dependencies or conflicting packages, Debian's packaging manual may be useful (because Cydia packaging is based on Debian packaging): Syntax of relationship fields, Dependencies, Conflicts -- or if you're submitting this package to a default repository, you can just ask your repository maintainer for help with this.

Debugging
See Debugging on iOS 7 for how to run gdb and/or lldb.

The System Log article on TheiPhoneWiki has useful tips about accessing the device's syslog.

Debugging memory issues in Substrate tweaks

A few problems you may run into while getting started
''Problem: Whenever I run programs I compile with your toolchain, they are immediately "Killed". I hate Apple :(.'' Solution: iOS only wants to run signed code. Jailbreaks patch the signature verification out of the kernel, but you still need to at least add a valid CodeDirectory to the binary that contains SHA1 hashes of the executable. See Code Signing for a few ways to do this.

''Problem: I tried copying a graphical program to the iPhone, and ran it from the command line. I am nearly 100% certain my program is correct, and I did your codesign instructions, but it doesn't work.'' Solution: You can't run things from the command line, you have to run them from SpringBoard.

Problem: OK, but when I copied the file to /Applications it didn't even show up in SpringBoard. Solution: iOS caches the Info.plist files of all installed applications in a centralized place. The fastest/bestest way to handle this cache is to install UIKit Tools and then run its uicache as mobile.

Problem: When I add setuid bits to my program, it no longer starts up and syslog doesn't seem to provide any useful information, either (True?). Solution: I am not quite certain what is preventing this. However, it is easy to defeat: replace your program with a two line shell script that, in turn, runs your program. Example, maybe MyProgram (setuid) gets renamed to MyProgram_, and MyProgram (not setuid) becomes the script:

Publishing your package in a default repository
When you've completed a project (including testing), you may want to submit it to one of Cydia's default repositories for distribution. These are your options, with links to information about submitting:


 * BigBoss (managed by Optimo)
 * ModMyi (managed by Tyler)
 * MacCiti (managed by MacCiti)

If you aren't sure which to pick, look up what your favorite developers use, or ask other developers for suggestions. If you have questions, email is usually the best way to get in contact with repository managers.

For questions about the Cydia Store system for paid packages, you can ask your favorite repository manager; they've helped many developers figure this out.

Some guides on other sites

 * YouTube playlist that teaches you in depth how to write Cydia tweaks by Sassoty
 * Guide/tutorial/collection of things/etc for jailbroken iOS development by jontelang
 * Jailbroken Development : Starter Pack by iKy1e (Freerunnering)
 * A Beginners Guide To Getting Started In Cydia Tweak Development
 * Beginning Jailbroken iOS Development – Getting The Tools + Building And Deployment + Your First Tweak
 * How To Create A MobileSubstrate Tweak for iOS
 * Flex to MobileSubstrate: A beginner's guide to making a tweak

Theos challenges
This section is a set of tweaks/apps that can be created with Theos for new or experienced developers to practice with.

If you're interested in ideas for something else to build, the "Request" tag on /r/jailbreak has lots of tweak ideas from real people.