152 lines
5.0 KiB
Objective-C

//
// WebserviceClient.m
// ipbc-Client
//
// Created by Gerrit Linnemann on 28.10.13.
// Copyright (c) 2013 Adawim UG (haftungsbeschränkt). All rights reserved.
//
#import "WebserviceClient.h"
#import "WebServiceConstants.h"
#import "Reachability.h"
@implementation WebserviceClient
-(void)awakeFromNib {
updateTimer = [NSTimer scheduledTimerWithTimeInterval: 4
target: self
selector: @selector(tick:)
userInfo: nil
repeats: YES];
isRequestRunning = NO;
isNetworkAvailable = NO;
[self checkNetworkAvailability];
}
- (void)tick:(NSTimer *)theTimer {
if(isNetworkAvailable && !isRequestRunning) {
[self updateDomain];
} else {
// else for logging only
if(!isNetworkAvailable) {
NSLog(@"no ip update, 'cause network unavailable");
}
if(isRequestRunning) {
NSLog(@"no ip update, 'cause of active request");
}
}
}
-(BOOL)updateDomain {
usersIPv4 = [self fetchIPv4];
NSString *storedIPv4 = [[NSUserDefaults standardUserDefaults] stringForKey:@"value.ip.ipv4"];
if(storedIPv4 == nil) {
[[NSUserDefaults standardUserDefaults] setObject:usersIPv4 forKey:@"value.ip.ipv4"];
}
BOOL updateResult = NO;
if([self checkUpdateNeeded]) {
NSLog(@"update resource: %@", WS_RESOURCE);
updateResult = [self doWebServiceUpdate];
} else {
NSLog(@"no update needed");
}
return updateResult;
}
-(void)checkNetworkAvailability {
// Allocate a reachability object
Reachability* reach = [Reachability reachabilityWithHostname:WS_BASE];
// Set the blocks
reach.reachableBlock = ^(Reachability*reach)
{
NSLog(@"%@ REACHABLE", WS_BASE);
isNetworkAvailable = YES;
};
reach.unreachableBlock = ^(Reachability*reach)
{
NSLog(@"%@ UNREACHABLE", WS_BASE);
isNetworkAvailable = NO;
};
// Start the notifier, which will cause the reachability object to retain itself!
[reach startNotifier];
}
-(BOOL)checkUpdateNeeded {
NSString *storedIPv4 = [[NSUserDefaults standardUserDefaults] stringForKey:@"value.ip.ipv4"];
NSString *fetchedIPv4 = usersIPv4;
//return YES;
if(storedIPv4 == nil) {
NSLog(@"stored IPv4 NULL");
return YES;
} else if(fetchedIPv4 == nil) {
NSLog(@"fetched IPv4 NULL");
return NO;
} else {
BOOL changed = ![storedIPv4 isEqualToString:fetchedIPv4];
NSLog(@"compare stored %@ with %@. Changed: %@", storedIPv4, fetchedIPv4, (changed ? @"yes" : @"no"));
return changed;
}
}
-(BOOL)doWebServiceUpdate {
isRequestRunning = YES;
NSString *settingTempName = [[NSUserDefaults standardUserDefaults] stringForKey:@"setting.name"];
NSString *settingTempToken = [[NSUserDefaults standardUserDefaults] stringForKey:@"setting.token"];
if([settingTempName length] > 0 && [settingTempToken length] > 0) {
NSLog(@"update ip to %@", usersIPv4);
NSURL *url = [NSURL URLWithString:WS_RESOURCE];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSDictionary *tmp = [[NSDictionary alloc] initWithObjectsAndKeys:
settingTempName, @"domain",
settingTempToken, @"token",
nil];
NSError *error;
NSData *postData = [NSJSONSerialization dataWithJSONObject:tmp options:0 error:&error];
[request setHTTPBody:postData];
/*NSData *resultData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *strData = [[NSString alloc]initWithData:resultData encoding:NSUTF8StringEncoding];
NSLog(@"resultData: %@", strData);*/
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *resultData, NSError *error) {
NSString *strData = [[NSString alloc]initWithData:resultData encoding:NSUTF8StringEncoding];
NSLog(@"resultData: %@", strData);
// locally save posted ip
[[NSUserDefaults standardUserDefaults] setObject:usersIPv4 forKey:@"value.ip.ipv4"];
isRequestRunning = NO;
}];
return YES;
} else {
return NO;
}
}
-(NSString *)fetchIPv4 {
NSURL *myIpAdress = [NSURL URLWithString:WS_GET_USERS_IP_SERVICE];
NSString *contentOfURL = [NSString stringWithContentsOfURL:myIpAdress encoding:NSUTF8StringEncoding error:NULL];
NSString *contentTrimmed = [contentOfURL stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
//NSLog(@"fetched IPv4: %@", contentTrimmed);
return contentTrimmed;
}
@end