gpt4 book ai didi

ios - 在Objective-C中通过CoreTelephony.framework私有(private)API获取MCC和MNC

转载 作者:可可西里 更新时间:2023-11-01 04:51:07 28 4
gpt4 key购买 nike

我需要获取当前国家/地区的 MCCMNC 代码(不是来自 SIM 所在国家/地区的 CTCarrier 类)。

我为 CoreTelephony.framework 使用私有(private) API。在我的设备上一切正常。但是在方法 CellMonitorCallback 中的其他设备上,我们获得了 cells = NULL

有人可以帮助我做错什么吗?


#import "AMCoreTelephone.h"
#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

struct CTResult
{
int flag;
int a;
};

extern CFStringRef const kCTCellMonitorCellType;
extern CFStringRef const kCTCellMonitorCellTypeServing;
extern CFStringRef const kCTCellMonitorCellTypeNeighbor;
extern CFStringRef const kCTCellMonitorCellId;
extern CFStringRef const kCTCellMonitorLAC;
extern CFStringRef const kCTCellMonitorMCC;
extern CFStringRef const kCTCellMonitorMNC;
extern CFStringRef const kCTCellMonitorUpdateNotification;

id _CTServerConnectionCreate(CFAllocatorRef, void*, int*);
void _CTServerConnectionAddToRunLoop(id, CFRunLoopRef, CFStringRef);
mach_port_t _CTServerConnectionGetPort(id);

#ifdef __LP64__
void _CTServerConnectionRegisterCallService(id);
void _CTServerConnectionUnregisterCallService(id,int*);
void _CTServerConnectionRegisterForNotification(id, CFStringRef);
void _CTServerConnectionCellMonitorStart(id);
void _CTServerConnectionCellMonitorStop(id);
void _CTServerConnectionCellMonitorCopyCellInfo(id, void*, CFArrayRef*);
void _CTServerConnectionIsInHomeCountry(id, void*, int*);
void _CTServerConnectionCopyCountryCode(id, void*, CFStringRef);

#else

void _CTServerConnectionRegisterCallService(struct CTResult*, id);
#define _CTServerConnectionRegisterCallService(connection) { struct CTResult res; _CTServerConnectionRegisterCallService(&res, connection); }

void _CTServerConnectionRegisterForNotification(struct CTResult*, id, CFStringRef);
#define _CTServerConnectionRegisterForNotification(connection, notification) { struct CTResult res; _CTServerConnectionRegisterForNotification(&res, connection, notification); }

void _CTServerConnectionCellMonitorStart(struct CTResult*, id);
#define _CTServerConnectionCellMonitorStart(connection) { struct CTResult res; _CTServerConnectionCellMonitorStart(&res, connection); }

void _CTServerConnectionCellMonitorStop(struct CTResult*, id);
#define _CTServerConnectionCellMonitorStop(connection) { struct CTResult res; _CTServerConnectionCellMonitorStop(&res, connection); }

void _CTServerConnectionCellMonitorCopyCellInfo(struct CTResult*, id, void*, CFArrayRef*);
#define _CTServerConnectionCellMonitorCopyCellInfo(connection, tmp, cells) { struct CTResult res; _CTServerConnectionCellMonitorCopyCellInfo(&res, connection, tmp, cells); }

void _CTServerConnectionIsInHomeCountry(struct CTResult*, id, int*);
#define CTServerConnectionIsInHomeCountry(connection, isHomeCountry) { struct CTResult res; _CTServerConnectionIsInHomeCountry(&res, connection, &isHomeCountry); }

#endif


@implementation AMCoreTelephone
{
CTCarrier *_carrier;
id CTConnection;
mach_port_t port;
}

+ (instancetype) sharedInstance
{
static AMCoreTelephone *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[AMCoreTelephone alloc] init_true];
});
return instance;
}

- (instancetype) init_true
{
if (self = [super init]) {
_carrier = [[CTTelephonyNetworkInfo new] subscriberCellularProvider];
}
return self;
}


- (void) startMonitoring{
#if TARGET_IPHONE_SIMULATOR
return;
#else
CTConnection = _CTServerConnectionCreate(kCFAllocatorDefault, CellMonitorCallback, NULL);
_CTServerConnectionRegisterForNotification(CTConnection, kCTCellMonitorUpdateNotification);

port = _CTServerConnectionGetPort(CTConnection);
CFMachPortRef ref = CFMachPortCreateWithPort(kCFAllocatorDefault,port,NULL,NULL, NULL);
CFRunLoopSourceRef rlref = CFMachPortCreateRunLoopSource ( kCFAllocatorDefault, ref, 0);
CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent();
CFRunLoopAddSource(currentRunLoop, rlref, kCFRunLoopCommonModes);

_CTServerConnectionCellMonitorStart(CTConnection);

#endif

}

- (void) stopMonitoring{
_CTServerConnectionCellMonitorStop(CTConnection);
}


int CellMonitorCallback(id connection, CFStringRef string, CFDictionaryRef dictionary, void *data)
{
int tmp = 0;
CFArrayRef cells = NULL;
_CTServerConnectionCellMonitorCopyCellInfo(connection, (void*)&tmp, &cells);
if (cells == NULL)
{
return 0;
}

for (NSDictionary* cell in (__bridge NSArray*)cells)
{
int LAC, CID, MCC, MNC;

if ([cell[(__bridge NSString*)kCTCellMonitorCellType] isEqualToString:(__bridge NSString*)kCTCellMonitorCellTypeServing])
{
LAC = [cell[(__bridge NSString*)kCTCellMonitorLAC] intValue];
CID = [cell[(__bridge NSString*)kCTCellMonitorCellId] intValue];
MCC = [cell[(__bridge NSString*)kCTCellMonitorMCC] intValue];
MNC = [cell[(__bridge NSString*)kCTCellMonitorMNC] intValue];
}
else if ([cell[(__bridge NSString*)kCTCellMonitorCellType] isEqualToString:(__bridge NSString*)kCTCellMonitorCellTypeNeighbor])
{
}
}

CFRelease(cells);

return 0;
}

@end

最佳答案

我认为问题出在使用私有(private) api,因此您无法在非越狱手机上运行您的应用程序。我正在和你一样研究这个东西,但有点晚了 :) 我发现了这个 answer在 iOS 8.3 上工作,它说

As of iOS 8.3 all of the above solutions require entitlement to work

<key>com.apple.CommCenter.fine-grained</key>
<array>
<string>spi</string>
</array>

还有这个project on github只是我能找到的示例代码。

我想你已经知道答案了,但这可能对其他人有帮助,因为很难找到:)

关于ios - 在Objective-C中通过CoreTelephony.framework私有(private)API获取MCC和MNC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30032743/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com