Skip to content

Instantly share code, notes, and snippets.

@zwaldowski
Forked from 0xced/XCDFakeCarrier.m
Last active December 29, 2015 06:49
Show Gist options
  • Save zwaldowski/7631520 to your computer and use it in GitHub Desktop.
Save zwaldowski/7631520 to your computer and use it in GitHub Desktop.
//
// Copyright (c) 2012-2013 Cédric Luthi / @0xced. All rights reserved.
//
#if TARGET_IPHONE_SIMULATOR
@interface NSObject ()
- (void)setItem:(int)item enabled:(BOOL)enabled;
@end
static const char *fakeCarrier;
static int fakeSignalBars = -1;
#import <objc/runtime.h>
typedef struct {
char itemIsEnabled[23];
char timeString[64];
int gsmSignalStrengthRaw;
int gsmSignalStrengthBars;
char serviceString[100];
// ...
} StatusBarData;
typedef struct {
char itemIsEnabled[24];
char timeString[64];
int gsmSignalStrengthRaw;
int gsmSignalStrengthBars;
char serviceString[100];
// ...
} StatusBarData_6;
typedef struct {
char itemIsEnabled[25];
char timeString[64];
int gsmSignalStrengthRaw;
int gsmSignalStrengthBars;
char serviceString[100];
// ...
} StatusBarData_7;
@interface XCDFakeCarrier : NSObject
@end
@implementation XCDFakeCarrier
+ (void) load
{
fakeCarrier = getenv("FAKE_CARRIER");
if (!fakeCarrier)
{
NSLog(@"You must set the FAKE_CARRIER environment variable");
return;
}
int potentialFakeBars = [@(getenv("FAKE_BARS")) intValue];
if (potentialFakeBars >= 0 && potentialFakeBars < 6) {
fakeSignalBars = potentialFakeBars;
}
BOOL __block success = NO;
Class UIStatusBarComposedData = objc_getClass("UIStatusBarComposedData");
SEL selector = NSSelectorFromString(@"rawData");
Method method = class_getInstanceMethod(UIStatusBarComposedData, selector);
NSDictionary *statusBarDataInfo = @{ @"^{?=[23c][64c]ii[100c]": @"fake_rawData",
@"^{?=[24c][64c]ii[100c]": @"fake_rawData_6",
@"^{?=[25c][64c]ii[100c]": @"fake_rawData_7" };
[statusBarDataInfo enumerateKeysAndObjectsUsingBlock:^(NSString *statusBarDataTypeEncoding, NSString *fakeSelectorString, BOOL *stop) {
if (method && [@(method_getTypeEncoding(method)) hasPrefix:statusBarDataTypeEncoding])
{
SEL fakeSelector = NSSelectorFromString(fakeSelectorString);
Method fakeMethod = class_getInstanceMethod(self, fakeSelector);
success = class_addMethod(UIStatusBarComposedData, fakeSelector, method_getImplementation(fakeMethod), method_getTypeEncoding(fakeMethod));
fakeMethod = class_getInstanceMethod(UIStatusBarComposedData, fakeSelector);
method_exchangeImplementations(method, fakeMethod);
}
}];
if (success) {
if (fakeSignalBars != -1) {
NSLog(@"Using \"%s\" fake carrier with %d bars", fakeCarrier, fakeSignalBars);
} else {
NSLog(@"Using \"%s\" fake carrier", fakeCarrier);
}
} else {
NSLog(@"XCDFakeCarrier failed to initialize");
}
}
// You could also [self setItem:2 enabled:YES] for Airplane Mode.
- (StatusBarData *) fake_rawData
{
StatusBarData *rawData = [self fake_rawData];
if (fakeSignalBars != -1) {
rawData->gsmSignalStrengthBars = fakeSignalBars;
[self setItem:3 enabled:YES];
}
strlcpy(rawData->serviceString, fakeCarrier, sizeof(rawData->serviceString));
return rawData;
}
- (StatusBarData_6 *) fake_rawData_6
{
StatusBarData_6 *rawData = [self fake_rawData_6];
if (fakeSignalBars != -1) {
rawData->gsmSignalStrengthBars = fakeSignalBars;
[self setItem:3 enabled:YES];
}
strlcpy(rawData->serviceString, fakeCarrier, sizeof(rawData->serviceString));
return rawData;
}
- (StatusBarData_7 *) fake_rawData_7
{
StatusBarData_7 *rawData = [self fake_rawData_7];
if (fakeSignalBars != -1) {
rawData->gsmSignalStrengthBars = fakeSignalBars;
[self setItem:3 enabled:YES];
}
strlcpy(rawData->serviceString, fakeCarrier, sizeof(rawData->serviceString));
return rawData;
}
@end
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment