Xcode Logos

From iPhone Development Wiki
Revision as of 08:52, 1 April 2012 by Kimcha (talk | contribs) (Using logos and theos with xCode)
Jump to: navigation, search

Using logos and theos with xCode

Theos and logos were designed to allow developers to do iOS development without xCode, but many developers including me prefer to use xCode because of it's code highlighting and code completion. On this page I would like to collect methods and ways on how to integrate xcode and theos and use it more efficiently.

crash-x's method


I am sure many people have or will figure out better ways on how to do this, but for now I just want to get this started. 

What I am posting is far from perfect, but is useable and I am sure it will be useful to some. I am using xCode just as a code editor and let theos handle everything else.
The basic steps are:
1. Use an xCode project as a wrapper
2. Logos .xm files have to be .mm files with .xmi symlinks
3. Work around logos % directives breaking code completion


1. xcode project wrapper

I am simply using L0CKnL0aD7's wrapper. Instructions on the github page https://github.com/L0CKnL0aD7/template-theosXcodeWrapper

2. xcode project wrapper

xCode does not accept .xm or .xmi files and does not complete code or highlight them. xCode also does not accept symlinks. This means the actual files containing code have to be .mm. To make theos work with them, just create a symlink with the .xm or xmi filename and point theos' makefile to it.


3. Work around logos % directives breaking code completion

Unfortunately just using the %hook and adding methods in that block confuses xcode and it does not highlight and code complete stuff. My solution for that problem is simply making xcode thing that the hooked methods are in an @implementation block. My first attempt at that was something like:

#ifdef THEOS
%group MyHooks
%hook UIApplication
#else
@implementation UIApplication
#endif


- (void) openURL: (id) arg {
    
	%orig;	
}



#ifdef THEOS
%end
%end
#else
@end
#endif

Add to your makefile:

MyTweak_CFLAGS = -DTHEOS

This works, but it is ugly and just confused me while scrolling through the code. My latest method is using:

#ifdef THEOS
#import <substrate.h>
#endif

#include <mach-o/dyld.h>
#include <objc/runtime.h>
#include <dlfcn.h>


#ifdef THEOS

#define ___logosHook %hook
#define ___logosHookEnd %end
#define ___logosNew %new
#define ___logosGroup(groupName) %group groupName
#define ___logosGroupEnd %end
#define ___logosSubclass(viewController, superclass) %subclass viewController : superclass


#else

#define ___logosHook @implementation
#define ___logosHookEnd @end
#define ___logosNew 
#define ___logosGroup(groupName)
#define ___logosGroupEnd
#define ___logosSubclass(viewController, superclass) @implementation viewController

#endif

Add this to a .h file and import it. Your code would look like:

___logosGroup(MyHooks)
___logosHook UIApplication

- (void) openURL: (id) arg {
    
	%orig;	
}

___logosHookEnd
___logosGroupEnd

This works alright, but has the disadvantage of breaking the menu at the top of the code, which allows to jump around functions and methods in the currently edited file. To be honest I do not like this method and I hope people will come up with better ways of doing this :)