سؤال

أريد أن أعرف كيفية اكتشاف أجهزة GPS في الوقت الحاضر في iPhone أم لا

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

المحلول

على الرغم من أنه لا يمكنك تحديد هذا باستخدام SDK، يمكنك استغلال معرفتك بالنماذج الحالية. إذا تقصر نفسك على iPhone 3G، iPhone 3GS و iPod Touch 2nd (أنا لا أقوم شخصيا بدعم شخصيا iPhone Edge أو iPod Touch الجيل الأول)، فأنت تعرف بالفعل أن نماذج iPhone يتم شحنها مع وحدة AGPS حقيقية أثناء تشغيل iPod Touch 2nd يمكن أن يستخدم الجيل - إذا ومتى تتوفر - بقع Hot Wifi Geotagged WiFi. يمكنك بعد ذلك استخدام الطريقة التالية لتحديد النموذج الذي تقوم بتشغيله:

- (NSString *) deviceModel{
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *answer = malloc(size);
    sysctlbyname("hw.machine", answer, &size, NULL, 0);
    NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
    free(answer);
    return results;
}

تتم إرجاع الطريقة @ "iPhone2،1" لل 3GS، @ "iPhone1،2" ل 3G و @ "iPod2،1" لجيل iPod Touch 2nd؛ أنت تسميها على النحو التالي

NSString *deviceModel = [[self deviceModel] retain];

واستخدامه على النحو التالي:

if([self.deviceModel isEqualToString:@"Pod2,1"]){
    // no real GPS unit available 
    // no camera available
    ...
}

نصائح أخرى

لا يمكنك ذلك يكشف الأجهزة، على الأقل ليس من خلال SDK الرسمي. يمكنك، ومع ذلك، يتفاعل مع ذلك (هما، الحصول على معلومات خارجها) من طلبك (عبر إطار Corelocation). وهذا يعمل في كل جهاز يتم شحنها على الإطلاق منذ إصدار إصدار iPhone OS 2.0 (حتى iPod Touches دون وجود GPS حقيقي في الداخل).

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

//Use classLoaders to avoid crashes on iPhone OS 3.x
id netInfo = [[NSClassFromString(@"CTTelephonyNetworkInfo") alloc] init];
if (netInfo) 
{
            id carrier = [netInfo subscriberCellularProvider];

            if ([[carrier carrierName] length] <=0)
            {
                    //NO operator=>NO 3G and no real GPS  
            }
}
[netInfo release];

بالطبع قد لا يكون هذا دليلا في المستقبل بنسبة 100٪، لكنه يعمل بشكل جيد في هذه المرحلة. أستخدمه في تطبيق My Battery HD من أجل إخفاء تقديرات GPS، لذلك من الواضح أنني لا أريد أن أسأل المستخدم عن التراخيص لذلك.

أفضل ما وجدته هو الاستفادة من حقيقة ذلك CLLocation.verticalAccuracy يتم تعيين فقط للأجهزة المجهزة GPS. بالطبع يعني ذلك أن توفر GPS يمكن تحديده إلا بعد تحديث الموقع الأول.

من وثائق أبل:

يتطلب تحديد الدقة الرأسي جهازا مع إمكانيات GPS. وبالتالي، في بعض الأجهزة المستندة إلى نظام التشغيل iOS في وقت سابق، يحتوي هذا العقار دائما على قيمة سلبية.

تحديث:في بعض الأحيان، يرسل الموقع الأساسي كائنات CLLASOINCACTACACACURACACURACE = -1 على iPhone 4 أيضا. ربما يكون الأمر كذلك عندما لا يكون أي إصلاح GPS متاحا ومنتجعات الموقع الأساسية إلى الخلية أو المواقع الواي فاي. لذلك حقيقة أنك تحصل على -1 لا تعني بالضرورة أنك لا تملك GPS. فقط إذا كنت تحصل على قيمة إيجابية تعرف بالتأكيد، فستكون لديك GPS.

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