سؤال

هل هناك طريقة لمعرفة الخليوي الناقل على اي فون برمجيا ؟

أنا أبحث عن اسم الناقل الذي توصيل اي فون.

هل كانت مفيدة؟

المحلول

في دائرة الرقابة الداخلية 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 على مختلف بالمشترك ويبدو أن اسم المشغل وتخوض اي فون ليتم إرجاعها مع [كارير CARRIERNAME] !!

وأنا جربت هذا في 2 فون، واحد مقفل والآخر لا، وعلى واحد مقفلة، بغض النظر عن مزود SIM، فإنه يعود اسم المشغل تم تأمينه لفي كل مرة تشغيل بلدي التطبيق الاختبار. ومع ذلك نلاحظ أن الشركات متعددة الجنسيات لا تغيير!

وليس هناك API العام للحصول على اسم الناقل. إذا كنت لا تحتاج إلى نشر على المتجر هل يمكن أن ننظر في استخدام واجهة برمجة التطبيقات الخاص.

VVCarrierParameters.h في حزمة VisualVoiceMail يبدو ان لديه أسلوب فئة carrierServiceName التي قد تكون ماذا تحتاج. إسقاط بأن رأس في المشروع، وندعو [VVCarrierParameters carrierServiceName].

ملاحظة التطبيق من المرجح أن يكون مرفوضا إذا قمت بذلك .

والحصول على اسم الناقل من شريط الحالة في حالة إذا الأساسية الهاتفية بإرجاع "الناقل"

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 العامة ، وذلك لأول مرة حاولت @جيسون Harwig الحل.لأنني لا يمكن أن تحصل على عمل ، فكرت خيار آخر.

الحل يستخدم API الخاص للوصول إلى _serviceString ivar التسمية (UIStatusBarServiceItemView) الذي يتم عرضه في شريط الحالة.

وهي تعتمد على شريط الحالة وجود الناقل قيمة و يحتاج فقط 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];
}

أنا فقط اختبار الأسلوب مع التطبيقات التي لديها شريط مرئي.فإنه يعود نفس السلسلة كما هو ظاهر في شريط الحالة ، بحيث أنه يعمل بشكل صحيح حتى عند التجوال.

هذه الطريقة ليست المتجر آمنة.

<وأ href = "https://developer.apple.com/iphone/prerelease/library/documentation/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html#//apple_ref/doc/uid/TP40009596-CH1- DontLinkElementID_3 "يختلط =" نوفولو noreferrer "> https://developer.apple.com/iphone/prerelease/library/documentation/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html#//apple_ref/doc/uid/TP40009596-CH1 -DontLinkElementID_3

وهناك مثل هذه الطريقة إلا أنها متاحة فقط على دائرة الرقابة الداخلية 4 حتى أنك لن تكون قادرا على استخدامه في الإصدارات السابقة. وهذا ربما يكسر التوافق أيضا.

لمستخدمي سريع يمكنك أن تجرب هذا:

import CoreTelephony

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

وعند طباعة الناتج من الناقل؟. الوصف

وهذا هو ما تراه:

[\ "0000000100000001 \": CTCarrier (0x2803a1980) {\ ن \ اسم tCarrier: [فودافون] \ ن \ بيري رمز البلد: [214] \ ن \ بيري شبكة الرمز: [01] \ ن \ TISO رمز البلد : [ط] \ ن \ الشحوم VOIP؟ [YES] \ ن} \ ن]

ومنسق (\ n و \ ر):

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

وحتى الحصول على اسم الناقل من شريط الحالة هو خيار جيد (على الأقل بالنسبة لي)

وأعني الجواب من المستخدم "codethemall".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top