2009-05-12 3 views
41

क्या आईफोन पर सेल वाहक को प्रोग्रामिक रूप से जानने का कोई तरीका है?आईफोन से कैरियर नाम पुनर्प्राप्त करना प्रोग्रामेटिक रूप से

** अद्यतन **

मैं वाहक नाम जो iPhone से जुड़ा है के लिए देख रहा हूँ।

+5

क्या, तुम मतलब है वहाँ iPhone हैं एटी एंड टी के अलावा वाहक?

+0

क्या आप इस बारे में बात कर रहे हैं कि फोन किस समय सेवा से जुड़ा हुआ है (यानी रोमिंग हो सकता है), या वाहक कौन है जिसके पास आपको बिल मिलते हैं? – crashmstr

+12

आपने शायद इसके बारे में नहीं सुना होगा, लेकिन दुनिया के अन्य देश हैं। और दिलचस्प बात यह है कि उनके पास मोबाइल तकनीक है। – mentat

उत्तर

76

आईओएस 4 में, CoreTelephony ढांचे useable है, यहाँ एक टुकड़ा वाहक नाम पाने के लिए है: CoreTelephony के खिलाफ

CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init]; 
CTCarrier *carrier = [netinfo subscriberCellularProvider]; 
NSLog(@"Carrier Name: %@", [carrier carrierName]); 
[netinfo release]; 

लिंक और अपने हेडर में शामिल हैं:

#import <CoreTelephony/CTTelephonyNetworkInfo.h> 
#import <CoreTelephony/CTCarrier.h> 
+10

ऐप्पल के दस्तावेज़ीकरण के मुताबिक, यह हमेशा आपको अपने होनमे वाहक के बारे में जानकारी देता है, न कि वाहक जो आप वर्तमान में रोमिंग के समय से जुड़े हुए हैं। – phoenies

+5

'#import को ' – zekel

+7

#import जोड़ें अन्यथा यह चेतावनी दिखाएगा कि "वाहक नाम विधि नहीं मिली"। – HarshIT

2

वाहक का नाम प्राप्त करने के लिए कोई सार्वजनिक API नहीं है। यदि आपको ऐप स्टोर पर प्रकाशित करने की आवश्यकता नहीं है तो आप निजी एपीआई का उपयोग कर देख सकते हैं।

VVCarrierParameters.h विजुअलवॉइसमेल पैकेज में carrierServiceName क्लास विधि है जो आपको चाहिए जो हो सकता है। अपने प्रोजेक्ट में हेडर ड्रॉप करें और [VVCarrierParameters carrierServiceName] पर कॉल करें।

नोट करें कि यदि आप यह करते हैं तो आपके ऐप को अस्वीकार कर दिया जाएगा।

+0

लिंक करते समय 'प्रतीक नहीं मिला' त्रुटि को कैसे ठीक किया जाए? धन्यवाद – ohho

+0

अफसोस की बात यह है कि यह विधि हमेशा मेरे लिए शून्य वापस आती है। :( – Legoless

0

https://developer.apple.com/iphone/prerelease/library/documentation/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html#//apple_ref/doc/uid/TP40009596-CH1-DontLinkElementID_3

एक ऐसे रास्ते लेकिन यह तो आप पिछले संस्करणों पर इसका इस्तेमाल करने में सक्षम नहीं होगा आईओएस 4 पर ही उपलब्ध है नहीं है। और यह शायद आपकी पिछड़ी संगतता भी तोड़ देता है।

10

बस बनाने के लिए एक यहां ध्यान दें .. मैंने इस एपीआई को विभिन्न सिम्स पर परीक्षण किया और ऐसा लगता है कि ऑपरेटर का नाम आईफोन लॉक किया गया है [कैरियर कैरियर नाम] के साथ वापस आ गया है !!

मैंने सिम प्रदाता की परवाह किए बिना 2 आईफोन, एक लॉक और दूसरा नहीं, और लॉक के लिए इसका परीक्षण किया, यह ऑपरेटर का नाम देता है जब भी मैं अपना टेस्ट ऐप चलाता हूं। ध्यान दें कि एमएनसी बदलता है!

+1

अच्छी टिप्पणी। इस जवाब को तब तक नहीं पता था जब तक कि मैंने यह जवाब नहीं देखा। पुष्टि कर सकता हूं कि मुझे वही व्यवहार मिल रहा है - वाहकनाम लॉक वाहक का नाम देता है, सिम वाहक नहीं। –

+0

आईओएस 7 पर परीक्षण किया गया, अनलॉक फोन: हमेशा "वाहक "वाहक नाम के रूप में। इसलिए यह पता लगाना संभव नहीं है कि कौन सा ऑपरेटर फोन में है। स्ट्रिंग रेटू rned सेटिंग्स -> सामान्य -> ​​कैरियर के अंतर्गत के बारे में प्रदर्शित स्ट्रिंग के बराबर है। हालांकि संस्करण संख्या खो गई है। – Legoless

+0

यह सही है। एमएनसी सीटी कैरियर से वाहक का एकमात्र सटीक परीक्षण है। हम एमएनसी वैल्यू को भी कैश करते हैं, क्योंकि यदि उपयोगकर्ता के पास नेटवर्क कनेक्शन नहीं है, तो यह शून्य वापस आ जाएगा, हवाई जहाज मोड में है, या अपनी सिम हटा दी है। – NSAlexC

1

Alpha विकसित करते समय, मुझे एक ही समस्या का सामना करना पड़ा। यह परियोजना केवल सार्वजनिक एपीआई का उपयोग करने तक ही सीमित नहीं थी, इसलिए मैंने पहले @ जेसन हरविग के समाधान की कोशिश की। क्योंकि मैं इसे काम नहीं कर सका, मैंने एक और विकल्प सोचा।

मेरे समाधान लेबल (UIStatusBarServiceItemView) है कि स्थिति पट्टी में प्रदर्शित किया जाता है की _serviceString इवर तक पहुँचने के लिए निजी API का उपयोग करता।

यह कैरियर मूल्य वाले स्टेटस बार पर निर्भर करता है और केवल काम करने के लिए UIKit की आवश्यकता है।

- (NSString *)carrierName 
{ 
    UIView* statusBar = [self statusBar]; 

    UIView* statusBarForegroundView = nil; 

    for (UIView* view in statusBar.subviews) 
    { 
     if ([view isKindOfClass:NSClassFromString(@"UIStatusBarForegroundView")]) 
     { 
      statusBarForegroundView = view; 
      break; 
     } 
    } 

    UIView* statusBarServiceItem = nil; 

    for (UIView* view in statusBarForegroundView.subviews) 
    { 
     if ([view isKindOfClass:NSClassFromString(@"UIStatusBarServiceItemView")]) 
     { 
      statusBarServiceItem = view; 
      break; 
     } 
    } 

    if (statusBarServiceItem) 
    { 
     id value = [statusBarServiceItem valueForKey:@"_serviceString"]; 

     if ([value isKindOfClass:[NSString class]]) 
     { 
      return (NSString *)value; 
     } 
    } 

    return @"Unavailable"; 
} 

- (UIView *)statusBar 
{ 
    NSString *statusBarString = [NSString stringWithFormat:@"%@ar", @"_statusB"]; 
    return [[UIApplication sharedApplication] valueForKey:statusBarString]; 
} 

मैंने केवल उन अनुप्रयोगों के साथ विधि का परीक्षण किया जिनके पास स्टेटस बार दिखाई देता है। यह वही स्ट्रिंग देता है क्योंकि यह स्टेटस बार में प्रदर्शित होता है, इसलिए रोमिंग के दौरान भी यह सही तरीके से काम करता है।

यह विधि ऐप स्टोर सुरक्षित नहीं है।

0

तेज उपयोगकर्ताओं के लिए आप इस कोशिश कर सकते हैं:

import CoreTelephony 

static var carrierName:String? { 
    let networkInfo = CTTelephonyNetworkInfo() 
    let carrier = networkInfo.subscriberCellularProvider 
    return carrier?.carrierName 
} 
0

यदि कोर टेलीफोनी रिटर्न "कैरियर" मामले में स्थिति पट्टी से वाहक नाम जाओ

func getCarrierName() -> String? { 

    var carrierName: String? 

    let typeName: (Any) -> String = { String(describing: type(of: $0)) } 

    let statusBar = UIApplication.shared.value(forKey: "_statusBar") as! UIView 

    for statusBarForegroundView in statusBar.subviews { 
     if typeName(statusBarForegroundView) == "UIStatusBarForegroundView" { 
      for statusBarItem in statusBarForegroundView.subviews { 
       if typeName(statusBarItem) == "UIStatusBarServiceItemView" { 
        carrierName = (statusBarItem.value(forKey: "_serviceString") as! String) 
       } 
      } 
     } 
    } 
    return carrierName 
}