Skip to content

Instantly share code, notes, and snippets.

@guidosabatini
Forked from 0xced/XCDFakeCarrier.m
Created November 13, 2012 16:33
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guidosabatini/4066796 to your computer and use it in GitHub Desktop.
Save guidosabatini/4066796 to your computer and use it in GitHub Desktop.
Hack to choose the displayed carrier name in the iOS simulator, now working in iOS 5 and iOS 6 (with different carrier names)
//
// Copyright (c) 2012 Cédric Luthi / @0xced. All rights reserved.
//
#if TARGET_IPHONE_SIMULATOR
#define ITEMISENABLED_LENGHT_IOS5 23
#define ITEMISENABLED_LENGHT_IOS6 24
#define STATUSBARBATATYPEENCODING_IOS5 "^{?=[23c][64c]ii[100c]"
#define STATUSBARBATATYPEENCODING_IOS6 "^{?=[24c][64c]ii[100c]"
#define FAKECARRIER_IOS5 @"iOS5"
#define FAKECARRIER_IOS6 @"iOS6"
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
static NSString * FakeCarrier = FAKECARRIER_IOS6;
#import <objc/runtime.h>
typedef struct {
char itemIsEnabled[ITEMISENABLED_LENGHT_IOS6];
char timeString[64];
int gsmSignalStrengthRaw;
int gsmSignalStrengthBars;
char serviceString[100];
// ...
} StatusBarDataIos6;
typedef struct {
char itemIsEnabled[ITEMISENABLED_LENGHT_IOS5];
char timeString[64];
int gsmSignalStrengthRaw;
int gsmSignalStrengthBars;
char serviceString[100];
// ...
} StatusBarDataIos5;
@interface XCDFakeCarrier : NSObject
@end
@implementation XCDFakeCarrier
+ (void) load
{
BOOL success = NO;
Class UIStatusBarComposedData = objc_getClass("UIStatusBarComposedData");
SEL selector = @selector(rawData);
SEL fakeSelector;
const char *statusBarDataTypeEncoding;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6")) {
fakeSelector = @selector(fake_rawData_iOS6);
statusBarDataTypeEncoding = STATUSBARBATATYPEENCODING_IOS6;
FakeCarrier = FAKECARRIER_IOS6;
} else {
fakeSelector = @selector(fake_rawData_iOS5);
statusBarDataTypeEncoding = STATUSBARBATATYPEENCODING_IOS5;
FakeCarrier = FAKECARRIER_IOS5;
}
Method method = class_getInstanceMethod(UIStatusBarComposedData, selector);
Method fakeMethod = class_getInstanceMethod(self, fakeSelector);
if (method && strncmp(method_getTypeEncoding(method), statusBarDataTypeEncoding, strlen(statusBarDataTypeEncoding)) == 0)
{
success = class_addMethod(UIStatusBarComposedData, fakeSelector, method_getImplementation(fakeMethod), method_getTypeEncoding(fakeMethod));
fakeMethod = class_getInstanceMethod(UIStatusBarComposedData, fakeSelector);
method_exchangeImplementations(method, fakeMethod);
}
if (success)
NSLog(@"Using \"%@\" fake carrier", FakeCarrier);
else
NSLog(@"XCDFakeCarrier failed to initialize");
}
- (StatusBarDataIos6 *) fake_rawData_iOS6
{
StatusBarDataIos6 *rawData = [self fake_rawData_iOS6];
strlcpy(rawData->serviceString, [FakeCarrier UTF8String], sizeof(rawData->serviceString));
return rawData;
}
- (StatusBarDataIos5 *) fake_rawData_iOS5
{
StatusBarDataIos5 *rawData = [self fake_rawData_iOS5];
strlcpy(rawData->serviceString, [FakeCarrier UTF8String], sizeof(rawData->serviceString));
return rawData;
}
@end
#endif
@bbshih
Copy link

bbshih commented Mar 6, 2013

This works perfectly. Thanks for providing this!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment