有没有办法以编程方式知道iPhone上的手机信箱?
我正在寻找iPhone所连接的运营商名称。
答案 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)
有这样的方式,但它只能在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卡,其运营商名称替换了该卡的先前值 属性。
如果用户从不配置了一个 设备的载体。