プログラムでiPhoneの携帯電話会社を知る方法はありますか?
IPhoneが接続されているキャリア名を探しています。
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>
ここに書き留めておきます。このAPIをさまざまなSIMでテストしましたが、iPhoneがロックされているオペレーターの名前が[carrer carrierName]で返されるようです。
私はこれを2つのiphoneでテストしましたが、一方はロックされ、もう一方はロックされていません。ロックされたものについては、SIMプロバイダーに関係なく、テストアプリを実行するたびにロックされているオペレーターの名前を返します。ただし、MNCは変更されることに注意してください。
Core Telephonyが「Carrier」を返す場合に備えて、ステータスバーからcarrier nameを取得します
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
}
キャリア名を取得するためのパブリックAPIはありません。 App Storeで公開する必要がない場合は、プライベートAPIを使用して確認できます。
VVCarrierParameters.h
VisualVoiceMailパッケージのcarrierServiceName
クラスメソッドが必要なようです。そのヘッダーをプロジェクトにドロップし、[VVCarrierParameters carrierServiceName]
を呼び出します。
これを行うと、アプリが拒否される可能性が高いことに注意してください。
Swiftユーザーの場合、これを試すことができます:
import CoreTelephony
static var carrierName:String? {
let networkInfo = CTTelephonyNetworkInfo()
let carrier = networkInfo.subscriberCellularProvider
return carrier?.carrierName
}
Alpha の開発中に同じ問題が発生しました。プロジェクト自体はパブリックAPIのみを使用するように制限されていなかったため、最初に@Jason Harwigのソリューションを試しました。うまく動かなかったので、別の方法を考えました。
私のソリューションは、プライベートAPIを使用して、ステータスバーに表示されているラベル(UIStatusBarServiceItemView
)の_serviceString
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の安全ではありません。
そのような方法がありますが、iOS 4でのみ使用できるため、以前のバージョンでは使用できません。そして、これはおそらくあなたの後方互換性も壊します。
Carrier?.descriptionの出力を印刷するとき
これはあなたが見るものです:
[\ "0000000100000001 \":CTCarrier(0x2803a1980){\ n\tキャリア名:[Vodafone]\n\tモバイル国コード:[214]\n\tモバイルネットワークコード:[01]\n\tISO国コード:[es ]\n\tVOIPを許可しますか? [はい]\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」ユーザーの答えを意味します。