Search code examples
objective-cmacoscocoausbnstask

Detect Whether Mac Has MagSafe Charging Port Programmatically, Or Detect If USB-C Port Exists


I'm trying to figure out a way to determine whether a Mac has a MagSafe charging port programmatically. If that's not possible, alternatively, I suppose detecting whether any USB-C ports exist (and thus MagSafe is not present).

I've searched around the web for APIs for this as well as shell commands but haven't found any good solutions. I need this to work in a sandboxed environment distributed through the Mac App Store. Ideally, any solution would be in pure Cocoa/Objective-C, but I am also fine with achieving this via NSTask or similar.

Thank you so much in advance for any suggestions!


Solution

  • I ended up compiling a list from EveryMac.com of all the models with MagSafe:

    - (bool) macHasMagSafe
    {
        NSString *macModel = @"";
    
        size_t len = 0;
        sysctlbyname("hw.model", NULL, &len, NULL, 0);
    
        if (len)
        {
            char *model = malloc(len*sizeof(char));
            sysctlbyname("hw.model", model, &len, NULL, 0);
            macModel = [NSString stringWithUTF8String:model];
            free(model);
        }
        else
        {
            macModel = @"UNKNOWN";
        }
        
        NSArray *magSafeModels = [[NSArray alloc] initWithObjects:
                                  
                                  // MACBOOK MODELS
                                  @"MacBook7,1",
                                  @"MacBook6,1",
                                  @"MacBook5,2",
                                  @"MacBook5,1",
                                  @"MacBook4,1",
                                  @"MacBook3,1",
                                  @"MacBook2,1",
                                  @"MacBook1,1",
                                  
                                  // MACBOOK PRO MODELS
                                  @"MacBookPro11,5",
                                  @"MacBookPro11,4",
                                  @"MacBookPro12,1",
                                  @"MacBookPro11,3",
                                  @"MacBookPro11,2",
                                  @"MacBookPro11,1",
                                  @"MacBookPro10,1",
                                  @"MacBookPro10,2",
                                  @"MacBookPro9,1",
                                  @"MacBookPro9,2",
                                  @"MacBookPro8,3",
                                  @"MacBookPro8,2",
                                  @"MacBookPro8,1",
                                  @"MacBookPro6,1",
                                  @"MacBookPro6,2",
                                  @"MacBookPro7,1",
                                  @"MacBookPro5,2",
                                  @"MacBookPro5,3",
                                  @"MacBookPro5,4",
                                  @"MacBookPro5,5",
                                  @"MacBookPro5,1",
                                  @"MacBookPro4,1",
                                  @"MacBookPro3,1",
                                  @"MacBookPro2,1",
                                  @"MacBookPro2,2",
                                  @"MacBookPro1,2",
                                  @"MacBookPro1,1",
                                  
                                  // MACBOOK AIR MODELS
                                  @"MacBookAir7,2",
                                  @"MacBookAir7,1",
                                  @"MacBookAir6,2",
                                  @"MacBookAir6,1",
                                  @"MacBookAir5,2",
                                  @"MacBookAir5,1",
                                  @"MacBookAir4,2",
                                  @"MacBookAir4,1",
                                  @"MacBookAir3,2",
                                  @"MacBookAir3,1",
                                  @"MacBookAir2,1",
                                  @"MacBookAir1,1",
                                  
                                  nil];
        
        if ([magSafeModels containsObject:macModel])
        {
            return YES;
            //NSLog(@"This Mac has a MagSafe port");
        }
        else
        {
            return NO;
            //NSLog(@"This Mac DOES NOT have a MagSafe port");
        }
    }