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];
    
}

Sonntag, 17. Juli 2016

Schlüssel zur Produktivität? Konzentrieren Sie sich auf eine Aufgabe!

In der heutigen Zeit sollen uns technische Kommunikationsmittel wie zum Beispiel E-Mail oder auch Instant Messanger den Arbeitsalltag vereinfachen. Leider ist dies oft nicht der Fall, denn diese zusätzlichen Kanäle müssen von uns ständig beobachtet und kontrolliert werden. Kommen dann noch weitere Kanäle wie zum Beispiel das Social Intranet oder ein Firmen internes Wiki hinzu sind wir überfordert und lassen uns schnell von der eigentlichen Arbeit ablenken.

Konzentrieren Sie sich auf eine Aufgabe! 

Auch wenn die Kommunikationskultur in Ihrem Unternehmen eine andere ist (Jeder muss immer für den Anderen da sein!), versuchen Sie sich auf immer nur auf eine Aufgabe zu konzentrieren.

  •  Möchten Sie ungestört arbeiten, schließen Sie Ihre Bürotür. So können Sie Ihren Kollegen deutlichen machen, dass Sie aktuell nicht gestört werden möchten.
  • In Großraumbüros sollten Sie in der Konzentrationsphase Gespräche mit anderen Kollegen vermeiden. Bei störenden Geräuschen, nehmen Sie z.B. Kopfhörer mit Geräuschunterdrückung (Bose QuietComfort 15).

Beispiel: E-Mail

Dies ist eigentlich ein asynchrones Medium. E-Mails sollten nur dann bearbeitet werden, wenn man Zeit hat. Dies wird in den Unternehmen aber häufig ignoriert. Man erwartet, dass E-Mails sofort gelesen und auch beantwortet werden müssen.
Folge, das E-Mail-Programm ist immer geöffnet und für jede eingehende E-Mail gibt es eine sofortige Benachrichtigung. Hieraus resultiert eine sofortige Ablenkung und man ist nicht mehr fokussiert bei der Arbeit. Anschließend benötigt es dann wieder mehrere Minuten, bis der ursprüngliche Zustand (Was wollte ich jetzt eigentlich tun, damit ich meine Aufgabe erledigen kann?) wiederhergestellt ist.

Tipps zum Thema E-Mail

  • Lösen Sie das Problem zusammen mit Ihren E-Mail Partnern.
    • Machen Sie deutlich, dass Sie nicht sofort auf E-Mails antworten.
  • Lassen Sie sich nicht von Kollegen ablenken (Hey, hast du schon die Mail von XYZ gelesen?).
  • Setzen Sie sich feste Zeitblöcke, in denen Sie E-Mails beantworten (morgens, mittags, nachmittags...).
  • Sprechen Sie mit Ihrem Vorgesetzten und entwickeln Sie zum Beispiel einen "E-Mail freien Tag" oder "Slow E-Mail".

Sonntag, 3. Juli 2016

WLAN langsam? Funkkanal optimieren!

Immer häufiger kommt es gerade in Ballungszentren vor, dass viele Router auf dem gleichen Kanal (Channel) senden. Wenn das eigene WLAN sehr langsam ist, kann man durch den richtig eingestellten Kanal deutlich mehr Datendurchsatz erzielen.

Dies geht z.B. mit dem folgenden Tool:
http://www.chip.de/downloads/Acrylic-WiFi-Free_84415105.html
Hinweis: Vorher oben rechts in den Einstellungen den "Advanced Mode" aktivieren, anschließend stehen die "Channel" Reiter zur Verfügung.

Mit der Analyse sollten man an einem Ort beginen, wo das WLAN am schwächsten ist.
Es werden dann grafisch die Kanäle anhand von hohen Kurven angezeigt, welche am häufigsten in der Umgebung von anderen Routern verwendet werden.

Zum Einstellen des am wenigsten verwendten Kanals, muss dann der eigene Router aufgerufen werden. Z.B. für FritzBox: http://fritz.box (oder IP-Adresse) => WLAN => Funkkanal.



Hintergrund zu den WLAN-Kanälen:

2,4 GHz: 
Die meisten Router senden im 2,4 GHz Band. Die Kanäle reichen von 1 bis 13. In jeweils 3 Kanälen überlappen sich die Frequenzen. Wenn sich in Ihrer Nähe ein weiterer Router befindet, wählen Sie einen um 3 Kanälen höheren oder niedrigeren WLAN-Kanal. In Europa gibt es drei Kanäle, die überlappungsfrei sind (Kanal 1, 6 und 11). Verzichten Sie lieber auf die Kanäle 9 und 10, da Mikrowellenherde mit derselben Frequenz betrieben werden.

5 GHz: 

Nicht alle Geräte unterstützen das 5 GHz Band. Während es im 2,4 GHz Band nur 3 überlappungsfreie Kanäle gibt, so sind es im 5 GHz Band 28. Das 5 GHz Band ist weniger anfällig auf Störungen
Quelle: http://praxistipps.chip.de/wlan-einrichten-welchen-kanal-waehlen_34273