LightMessaging: Difference between revisions

From iPhone Development Wiki
(→‎Client: remove redundancy)
Line 61: Line 61:
== Client ==
== Client ==

This can be run anywhere that has the appropriate permissions to send/receive data on a message port.
This can be run anywhere; like a command line program, sandboxed process, daemon, etc.

<source lang="objc">
<source lang="objc">

Revision as of 05:38, 7 August 2016

LightMessaging is an inter-process communication header-only library by Ryan Petrich. According to its GitHub page, it is a "simple low-level replacement for CFMessagePort".

How to use this library

Headers are available from LightMessaging's GitHub project. If using Theos, place the headers in $THEOS/include/LightMessaging.

Include directive

#import <LightMessaging/LightMessaging.h>


LightMessaging uses RocketBootstrap by default, so be sure to have it set up (instructions here). To have LightMessaging not use RBS, add the following directive before including the LM header:



This must not be done in a sandboxed process. Typically, this is done in SpringBoard or a non-sandboxed daemon. If you put the server anywhere other than SpringBoard, then you must register the service in SpringBoard. Further explanation here.

The Callback

void some_callback(CFMachPortRef port,
                   LMMessage *request,
                   CFIndex size,
                   void *info)
	// get the reply port
	mach_port_t replyPort = request->head.msgh_remote_port;

	// sanity check
	if (size < sizeof(LMMessage)) {
		LMSendReply(replyPort, NULL, 0);
		LMResponseBufferFree((LMResponseBuffer *)request);
	// get the data you recieved
	void *data = LMMessageGetData(request);

	// send some data back
	const char *msg = "lol";
	LMSendReply(replyPort, msg, strlen(msg) + 1);

	// free the response buffer??
	LMResponseBufferFree((LMResponseBuffer *)request);

Starting the Server

LMStartService("net.iphonedevwiki.some.server", CFRunLoopGetCurrent(), (CFMachPortCallBack)some_callback);


This can be run anywhere; like a command line program, sandboxed process, daemon, etc.

// setup connection
LMConnection connection = {

//send message
LMResponseBuffer buffer;
const char *msg = "lol wtf";
SInt32 messageId = 0x1111; // this is arbitrary i think
LMConnectionSendTwoWay(&connection, messageId, msg, strlen(msg) + 1, &buffer);
LMMessage *response = &(buffer.message);

// do whatever you want !!!!
const char *data = LMMessageGetData(response);

Type helpers

There are some cool helper functions for if you want to send Images / PropertyLists / etc instead of just strings. Look at the header file or other examples to see how to use them.

(this section should be expanded)


External links