以编程方式从iPhone检索运营商名称

时间:2009-05-12 15:46:06

标签: iphone cocoa-touch core-telephony

有没有办法以编程方式知道iPhone上的手机信箱?

我正在寻找iPhone所连接的运营商名称。

10 个答案:

答案 0 :(得分:81)

在iOS 4中,CoreTelephony框架是可用的,这里有一个获取运营商名称的片段:

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

链接CoreTelephony并包含在标题中:

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

答案 1 :(得分:13)

只是在这里做笔记..我在不同的SIM上测试了这个API,似乎iPhone锁定的操作符的名称是[carrer carrierName]返回的!!

我在2台iphone上测试了这个,一个是锁定的,另一个没有,而对于锁定的一个,无论SIM提供商,它都会返回每次运行我的测试应用时锁定的操作员的名称。但请注意,MNC确实发生了变化!

答案 2 :(得分:2)

没有用于获取运营商名称的公共API。如果您不需要在App Store上发布,可以查看使用私有API。

VisualVoiceMail包中的

VVCarrierParameters.h似乎有一个carrierServiceName类方法,可能就是您所需要的。删除项目中的标题并调用[VVCarrierParameters carrierServiceName]

请注意,如果您执行此操作,您的应用很可能会被拒绝

答案 3 :(得分:2)

如果Core Telephony返回&#34; Carrier&#34;

,请从状态栏中获取运营商名称
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
}

答案 4 :(得分:1)

在开发Alpha时,我遇到了同样的问题。该项目本身并不仅限于使用公共API,所以首先我尝试了@Jason Harwig的解决方案。因为我无法让它工作,我想到了另一种选择。

我的解决方案使用私有API访问状态栏中显示的标签_serviceString)的UIStatusBarServiceItemView ivar。

它依赖于具有运营商价值的状态栏,只需要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];
}

我只使用状态栏可见的应用程序测试了该方法。它返回与状态栏中显示的字符串相同的字符串,因此即使在漫游时它也能正常工作。

此方法不适用于App Store。

答案 5 :(得分:1)

对于 Swift 和 ios 12.0 <执行以下操作:

导入 CoreTelephony

static var carrierName:String? {
    CTTelephonyNetworkInfo().serviceSubscriberCellularProviders?.first?.value.carrierName ?? ""
}

答案 6 :(得分:0)

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

有这样的方式,但它只能在iOS 4上使用,所以你将无法在以前的版本上使用它。这也可能会破坏你的向后兼容性。

答案 7 :(得分:0)

对于快速用户,您可以尝试:

import CoreTelephony

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

答案 8 :(得分:0)

当您打印承运人的输出时。.说明

这是您看到的:

[\“ 0000000100000001 \”:CTCarrier(0x2803a1980){\ n \ t运营商名称:[Vodafone] \ n \ t移动国家/地区代码:[214] \ n \ t移动网络代码:[01] \ n \ tISO国家/地区代码:[es] \ n \ t允许VOIP吗? [是] \ n} \ n]

格式化(\ n和\ t):

[\"0000000100000001\": CTCarrier (0x2803a1980) {
    Carrier name: [Vodafone]
    Mobile Country Code: [214]
    Mobile Network Code:[01]
    ISO Country Code:[es]
    Allows VOIP? [YES]
}
]

因此,从状态栏中获取承运人姓名是个不错的选择(至少对我来说如此)

我的意思是“ codethemall”用户的答案。

答案 9 :(得分:0)

更多重要评论。只需为carrierName添加docs

运营商提供此字符串,并将其格式化以呈现给 用户。如果用户正在漫游 ,则该值不会更改;它总是 代表用户拥有帐户的提供商。

如果您为运营商配置设备,然后删除 SIM卡, 此属性保留承运人的名称。如果您再安装 new SIM卡,其运营商名称替换了该卡的先前值 属性。

如果用户从不配置了一个 设备的载体。