2015-05-04 14 views
5

'daki CoreTelephony.framework özel API'si aracılığıyla alma Güncel ülke için MCC ve MNC kodunu almam gerekir (SIM ana ülkesi CTCarrier sınıfından DEĞİLDİR).MCC ve MNC'yi Objective-C

Özel API'yi CoreTelephony.framework için kullanıyorum. Cihazımda her şey doğru çalışıyor. Ancak CellMonitorCallback yöntemindeki diğer cihazlarda cells = NULL elde ederiz.

Yanlış yaptığım kişiye yardım edebilir mi?


#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 
+0

Artık iOS 8.3'te çalışmıyor. – pteofil

cevap

1

Sana olmayan firar telefonlarında uygulamanızı çalıştıramaz için problemin özel api kullanıldığını düşünüyorum. Aynı şekilde size ama biraz geç :) şeyi araştırıyorum ve iOS 8.3 üzerinde çalışmak için bu answer buldum, bu iOS 8.3 Yukarıdaki çözümlerin hepsi itibariyle

çalışmaya hak gerektirir diyor
<key>com.apple.CommCenter.fine-grained</key> 
<array> 
    <string>spi</string> 
</array> 

Ayrıca bu project on github yalnızca bulabildiğim örnek koddur. ,

Ben zaten cevap biliyorum ama hak Nitekim

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

çalışmak gerektirir iOS 8.3 Yukarıdaki çözümlerin hepsi itibariyle :)

+0

Kırık olmayan telefonlarda çalışan çok sayıda özel API vardır (Apple'ın uygulamaların uygulama mağazasına gönderilme nedenlerinden biri budur). Belki de bu noktada daha fazla ayrıntı vermelisiniz (örn., _some_ özel API'leri, güvenlik alanının bozulmasına, vs.). –

0

bulmak zor olduğundan bu mayıs, bir başkası yardımcı Yukarıda bahsedilen kod ios 8.3 ve üzerinde lac ve hücre almak için çalıştırılabilir söyleniyor. Ama aslında yukarıdaki hapishane telefonuna nasıl ekleneceğini bilmiyorum. Herhangi bir detay bilgisi verebilir misiniz? Ya da bu şekilde test eden var mı?

İlgili konular