Posts mit dem Label Apple werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Apple werden angezeigt. Alle Posts anzeigen

Montag, 27. April 2026

Linux-Rechner - Apple Mac mini (2018), leise Hardware mit zweitem Leben dank Ubuntu

Der Apple Mac mini (A1993) aus dem Jahr 2018 zählt zu den letzten Intel‑Modellen von Apple – und genau das macht ihn heute besonders interessant für Linux. In dem schlichten, dunkelgrauen Aluminiumgehäuse stecken min. eine Quad‑Core‑CPU (Core i3‑8100B), 8 GByte RAM und eine 256‑GByte‑SSD. Trotz der kompakten Bauform ist das Netzteil intern verbaut. Mit vier Thunderbolt‑3‑Anschlüssen lassen sich Displays, schnelle SSDs und USB‑C‑Hardware problemlos betreiben, ein echter Pluspunkt für ein Linux‑System.

Warum Linux auf dem Mac mini?

Softwareseitig ist die Zukunft unter macOS begrenzt. Neuere macOS‑Versionen (macOS 26 und höher) unterstützen keine Intel‑Macs mehr. Spätestens ab Anfang 2028 ist daher auch mit dem Ende der Sicherheitsupdates zu rechnen.

Linux bietet hier eine klare Alternative. Distributionen wie Ubuntu 25.10 laufen stabil, sind sicherheitsseitig langfristig gepflegt und holen aus der Hardware deutlich mehr Zukunft heraus. Windows 11 fällt dagegen aus, da der speziell für Apple gefertigte Core i3‑8100B kein Firmware‑TPM 2.0 besitzt.

Alltag unter Linux: lautlos, stabil und effizient

Unter Linux überzeugt der Mac mini vor allem durch seine absolute Lautlosigkeit, selbst unter Volllast bleibt der Lüfter praktisch unhörbar. Der Stromverbrauch liegt mit etwa 11 Watt im Leerlauf bei angeschlossenem 4K‑Display etwas höher als erwartet, ist insgesamt aber weiterhin moderat. Die 8 GByte RAM reichen für typische Linux‑Einsatzbereiche wie Web, Office, Medienwiedergabe, Programmierung oder leichtgewichtige Server‑Dienste aus.

Ein Arbeitsspeicher‑Upgrade ist möglich, jedoch etwas aufwendig: Das Gerät muss nahezu komplett zerlegt werden, außerdem sind beide RAM‑Slots mit 4‑GByte‑Modulen belegt, die vollständig ersetzt werden müssen. Für viele Anwender lohnt sich dieser Schritt daher nur bedingt.

Kurz-Anleitung: Ubuntu auf dem Mac mini (2018) installieren

Die Installation von Ubuntu gelingt schnell und unkompliziert:

  • Ubuntu herunterladen
    • Das Ubuntu‑Desktop‑ISO (z. B. Ubuntu 25.10) von ubuntu.com laden.
  • Bootfähigen USB‑Stick erstellen
  • Vom USB‑Stick booten
    • Den Mac mini ausschalten, USB‑Stick einstecken und beim Einschalten die Alt‑Taste (⌥) gedrückt halten. Anschließend den USB‑Stick im Bootmenü auswählen.
  • Ubuntu installieren
    • Im Installer „Ubuntu installieren“ wählen und der Standardinstallation folgen. Grafik, Thunderbolt und externe Monitore funktionieren in der Regel sofort.

Wichtig: Broadcom‑WLAN manuell nachrüsten

Einziger Wermutstropfen beim Mac mini ist das integrierte Broadcom‑WLAN. Die erforderliche Firmware ist in Ubuntu nicht enthalten und muss manuell installiert werden.
Die passende Firmware findet man hier: https://github.com/NoaHimesaka1873/apple-bcm-firmware/releases/tag/v14.0

Vorgehensweise:

  • Firmware‑Archiv herunterladen und entpacken
  • Die enthaltenen Dateien in folgende Verzeichnisse kopieren:
    • /usr/lib/firmware/brcm
    • /lib/firmware/
  • Mac mini neu starten

Nach dem Neustart funktioniert das Broadcom‑WLAN zuverlässig auch unter Linux.

Fazit

Der Mac mini (2018) ist als macOS‑System technisch am Ende seiner Lebensdauer angekommen, als Linux‑Rechner jedoch erstaunlich vielseitig. Leise, kompakt und gut ausgestattet eignet er sich ideal als Desktop‑PC, Entwickler‑Maschine, Media‑Center oder Homeserver. Wer bereit ist, die WLAN‑Firmware einmal manuell zu installieren, erhält mit Ubuntu einen stabilen und zukunftsfähigen Rechner und schenkt dem Intel‑Mac eine zweite Karriere.

Mittwoch, 16. April 2025

Digitale Produkte - Europäische Alternativen

Die nachfolgende Linksammlung hilft dabei, sich digital unabhängig von Donald Trump und den Big Tech Giganten bzw. den Big Five (Alphabet (Google), Amazon, Apple, Meta Platforms (ehem. Facebook) und Microsoft) zu machen.




Sonntag, 24. Juli 2016

iOS Xcode - Location Services unter iOS 8

Nach dem neusten Xcode Update dürfen iOS Apps nur noch mit iOS 8 kompiliert werden. Nach dieser Umstellung funktionierte anschließend der intern verwendete LocationManager nicht mehr.

Mit iOS 8 haben sich die Berechtigungen verändert. Diese müssen jetzt zwingend in der Info.plist als Schlüssel definiert werden:

  • NSLocationAlwaysUsageDescription
  • NSLocationWhenInUseUsageDescription
Beispiel:


<key>NSLocationAlwaysUsageDescription</key>
<string>This application requires location services to work</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This application requires location services to work</string>

Zusätzlich muss auch folgende Funktion hinzugefügt werden:

  • requestAlwaysAuthorization (for background location) oder
  • requestWhenInUseAuthorization (location only when foreground) 
Beispiel:


- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // instance of the CLLocationManager class
    [super viewDidLoad];
    _locationManager = [[CLLocationManager alloc] init];
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    _locationManager.delegate = self;
    
    [_locationManager startUpdatingLocation];

    [_locationManager requestWhenInUseAuthorization]; // Notwendig ab iOS8
...

iOS Xcode - UIWebView readyState richtig abfangen

Ruft man innerhalb einer App (in diesem Beispiel Apple iOS) eine Webseite auf und möchte anschließend JavaScript Operationen ausführen muss man wissen, wann die Webseite in dem WebView fertig geladen wurde (readyState).

In dem nachfolgenden Beispiel wird der readyState abgefragt, bis dieser auf "complete" steht. Anschließend wird mittels JavaScript (JSBridge) eine Funktion innerhalb der fertig geladenen Webseite im WebView aufgerufen.

Ich verwenden dies in der App simplyEat.de (www.simplyeat.de) um per JSBridge über den LocationManager die aktuelle Position des Nutzers zu setzen. Danach werden Angebote aus seiner Umgebung in der WebView angezeigt.

Hier ein Beispiel wie dies unter iOS (Xcode) richtig funktioniert:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    offerUrl.delegate = self;
    self.title = offer.name;
    
    NSString *urlAddress = offer.url;
    //Create a URL object.
    NSURL *url = [NSURL URLWithString:urlAddress];
    //URL Requst Object
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    //Load the request in the UIWebView.
    [self.offerUrl loadRequest:requestObj];  

}

- (void)webViewActuallyFinished {
    _webViewLoads--;
    if (_webViewLoads > 0) {
        return;
    }
    //Actually done loading
    
    if ([[self.offerUrl stringByEvaluatingJavaScriptFromString:@"document.readyState"] isEqualToString:@"complete"]) {
        
        // UIWebView object has fully loaded.

        NSString *param1 = [NSString stringWithFormat:@"{coords:{'latitude':%@", latitudeString];
        NSString *param2 = [NSString stringWithFormat:@",'longitude':%@", longitudeString];
        NSString *param3 = @"}}";
        
        NSString *param123 = [NSString stringWithFormat:@"%1$@ %2$@ %3$@", param1, param2, param3];
        NSString *param = [param123 stringByTrimmingCharactersInSet:
                           [NSCharacterSet whitespaceCharacterSet]];
        
        NSString * jsCallBack = [NSString stringWithFormat:@"geoCallBackSuccess(%@);",param];
        [self.offerUrl stringByEvaluatingJavaScriptFromString:jsCallBack];
        
        //NSLog(@"viewDidLoad - javascriptString: %@", jsCallBack);
        [self.offerUrl stringByEvaluatingJavaScriptFromString:jsCallBack];
    }
}

- (void)webViewDidFinishLoad:(UIWebView *)offerUrl {
    //NSLog(@"webViewDidFinishLoad");
    // Identify the “last” webViewDidFinishLoad message
    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(webViewActuallyFinished) userInfo:nil repeats:NO];
}

- (void)webViewDidStartLoad:(UIWebView *)offerUrl {
    //NSLog(@"webViewDidStartLoad");
    _webViewLoads++;
}

-(void)webView:(UIWebView *)offerUrl didFailLoadWithError:(NSError *)error {
    NSLog(@"No internet connection");
    _webViewLoads--;
    
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"error.html" ofType:nil]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.offerUrl loadRequest:request];
    
}