web-dev-qa-db-ja.com

プログラムでiPhoneからキャリア名を取得する

プログラムでiPhoneの携帯電話会社を知る方法はありますか?

IPhoneが接続されているキャリア名を探しています。

44
thierryb

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>
82
George Zhu

ここに書き留めておきます。このAPIをさまざまなSIMでテストしましたが、iPhoneがロックされているオペレーターの名前が[carrer carrierName]で返されるようです。

私はこれを2つのiphoneでテストしましたが、一方はロックされ、もう一方はロックされていません。ロックされたものについては、SIMプロバイダーに関係なく、テストアプリを実行するたびにロックされているオペレーターの名前を返します。ただし、MNCは変更されることに注意してください。

15
Abolfoooud

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
}
2
codethemall

キャリア名を取得するためのパブリックAPIはありません。 App Storeで公開する必要がない場合は、プライベートAPIを使用して確認できます。

VVCarrierParameters.h VisualVoiceMailパッケージのcarrierServiceNameクラスメソッドが必要なようです。そのヘッダーをプロジェクトにドロップし、[VVCarrierParameters carrierServiceName]を呼び出します。

これを行うと、アプリが拒否される可能性が高いことに注意してください

2
Jason Harwig

Swiftユーザーの場合、これを試すことができます:

import CoreTelephony

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

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の安全ではありません。

1
Legoless

https://developer.Apple.com/iphone/prerelease/library/documentation/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html#//Apple_ref/doc/uid/TP40009596-CH1-DontLinkElementID_

そのような方法がありますが、iOS 4でのみ使用できるため、以前のバージョンでは使用できません。そして、これはおそらくあなたの後方互換性も壊します。

0
radalin

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」ユーザーの答えを意味します。

0
Markus