Saturday 27 July 2013

NSDate from NSString. Fetch Date from string.

+(NSDate*)dateFromString:(NSString*)dateStr
{
    // Choose your format according to date string
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"LLLL d,YYYY"];
    NSDate *date = [dateFormat dateFromString:dateStr];
    NSLog(@"String:%@ convert to date:%@",dateStr, date.description);

    return date;
    
}

Friday 19 July 2013

Check view controller is visible or not. UIViewController and UINavigationController


if (viewController.isViewLoaded && viewController.view.window)
    // viewController is visible
 else  // viewController is not visible


UIViewController


1.) isViewLoaded

Returns a Boolean value indicating whether the view is currently loaded into memory.
- (BOOL)isViewLoaded
Return Value
A Boolean value indicating whether the view is currently loaded into memory.
Discussion
Calling this method reports whether the view is loaded. Unlike the view property, it does not attempt to load the view if it is not already in memory.

2.) viewController.view.window

If  view  is currently visible the its window property is non-nil. So we check viewController.view.window.
Calling the view method loads the view(if not yet loaded), so we call isViewLoaded before it.

UINavigationController 


In UINavigationController we can use its visibleViewController property.

visibleViewController

The view controller associated with the currently visible view in the navigation interface. (read-only)
@property(nonatomic, readonly, retain) UIViewController *visibleViewController
Discussion
The currently visible view can belong either to the view controller at the top of the navigation stack or to a view controller that was presented modally.
We can compare this with our viewController and find whether its visible or not.

Tuesday 16 July 2013

UILabel top aligned. Align text to top left. The text is displayed in the vertical center of the label? NSTextAlignment.


 UILabel if text in label is too short to fit in the number of lines used for that label, the text is displayed in the vertical center of the label.






To vertically align the text at the top of the UILabel

    _titleLabel.text = [self._myArray objectAtIndex:indexPath.row]; // get text array.


    [_titleLabel setNumberOfLines:0]; 
    // 


    [_titleLabel sizeToFit];




Monday 15 July 2013

Compare two NSDates.


We can use "compare" function of "NSComparisonResult" Class to get order of the NSDate.
switch ([dateOne compare:dateTwo]){case NSOrderedAscending:    NSLog(@"NSOrderedAscending");    break; case NSOrderedSame:            NSLog(@"NSOrderedSame");             break;case NSOrderedDescending:  NSLog(@"NSOrderedDescending");   break;}


or if we want to compare only date year month and day, we can use.


NSCalendar and NSDateComponents.// Get the current calendarNSCalendar* calendar = [NSCalendar currentCalendar];// Set the flags you want to match unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnitNSDayCalendarUnit;// Set the componentsNSDateComponents* comp1 = [calendar components:unitFlags fromDate:dateOne];NSDateComponents* comp2 = [calendar components:unitFlags fromDate:dateTwo];// Compare the date components.if ([comp1 day]==[comp2 day] && [comp1 month]==[comp2 month] && [comp1 year]==[comp2 year])NSLog(@"Dates match.");

Thursday 11 July 2013

Strike out the text in UILabel. Cut the text with line iOS.


In iOS 6 we can use "NSMutableAttributedString" for use more different styles.

        NSString* cutText = @"This Line is strike out.";

        NSMutableAttributedString *titleString = [[NSMutableAttributedString alloc] initWithString:cutText];

        // making text property to strike text- NSStrikethroughStyleAttributeName
        [titleString addAttribute: NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger: NSUnderlineStyleSingle] range: NSMakeRange(0, [titleString length])];

        // using text on label
        [myTextLabel  setAttributedText: titleString];

Friday 5 July 2013

Check whether iOS device is connected to internet or not?

Download the "Reachability" Class file from apple site

 and use it to detect the internet connection follow:

+ (BOOL)connected
{
    //return NO; // force for offline testing
    Reachability *hostReach = [Reachability reachabilityForInternetConnection];
    NetworkStatus netStatus = [hostReach currentReachabilityStatus];
    return !(netStatus == NotReachable);

}



In case you don't get the file from the link use the following code



/* Copied from apple site:                                                                                                          
 File: Reachability.h                                                                                      
*/


#import <Foundation/Foundation.h>
#import <SystemConfiguration/SystemConfiguration.h>

typedef enum {
NotReachable = 0,
ReachableViaWiFi,
ReachableViaWWAN
} NetworkStatus;
#define kReachabilityChangedNotification @"kNetworkReachabilityChangedNotification"

@interface Reachability: NSObject
{
BOOL localWiFiRef;
SCNetworkReachabilityRef reachabilityRef;
}

//reachabilityWithHostName- Use to check the reachability of a particular host name. 
+ (Reachability*) reachabilityWithHostName: (NSString*) hostName;

//reachabilityWithAddress- Use to check the reachability of a particular IP address. 
+ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress;

//reachabilityForInternetConnection- checks whether the default route is available.  
//  Should be used by applications that do not connect to a particular host
+ (Reachability*) reachabilityForInternetConnection;

//reachabilityForLocalWiFi- checks whether a local wifi connection is available.
+ (Reachability*) reachabilityForLocalWiFi;

//Start listening for reachability notifications on the current run loop
- (BOOL) startNotifier;
- (void) stopNotifier;

- (NetworkStatus) currentReachabilityStatus;
//WWAN may be available, but not active until a connection has been established.
//WiFi may require a connection for VPN on Demand.
- (BOOL) connectionRequired;

@end











/* Copied from apple site:                                                                                                                  
 File: Reachability.m                                                                             
*/

#import <sys/socket.h>
#import <netinet/in.h>
#import <netinet6/in6.h>
#import <arpa/inet.h>
#import <ifaddrs.h>
#import <netdb.h>

#import <CoreFoundation/CoreFoundation.h>

#import "Reachability.h"

#define kShouldPrintReachabilityFlags 1

static void PrintReachabilityFlags(SCNetworkReachabilityFlags    flags, const char* comment)
{
#if kShouldPrintReachabilityFlags
    NSLog(@"Reachability Flag Status: %c%c %c%c%c%c%c%c%c %s\n",
(flags & kSCNetworkReachabilityFlagsIsWWAN)   ? 'W' : '-',
(flags & kSCNetworkReachabilityFlagsReachable)            ? 'R' : '-',
(flags & kSCNetworkReachabilityFlagsTransientConnection)  ? 't' : '-',
(flags & kSCNetworkReachabilityFlagsConnectionRequired)   ? 'c' : '-',
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)  ? 'C' : '-',
(flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',
(flags & kSCNetworkReachabilityFlagsConnectionOnDemand)   ? 'D' : '-',
(flags & kSCNetworkReachabilityFlagsIsLocalAddress)       ? 'l' : '-',
(flags & kSCNetworkReachabilityFlagsIsDirect)             ? 'd' : '-',
comment
);
#endif
}


@implementation Reachability
static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info)
{
#pragma unused (target, flags)
NSCAssert(info != NULL, @"info was NULL in ReachabilityCallback");
// NSCAssert([(NSObject*) info isKindOfClass: [Reachability class]], @"info was wrong class in ReachabilityCallback");

//We're on the main RunLoop, so an NSAutoreleasePool is not necessary, but is added defensively
// in case someon uses the Reachablity object in a different thread.
// NSAutoreleasePool* myPool = [[NSAutoreleasePool alloc] init];
Reachability* noteObject = (__bridge Reachability*) info;
// Post a notification to notify the client that the network reachability changed.
[[NSNotificationCenter defaultCenter] postNotificationName: kReachabilityChangedNotification object: noteObject];
// [myPool release];
}

- (BOOL) startNotifier
{
BOOL retVal = NO;
SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL};
if(SCNetworkReachabilitySetCallback(reachabilityRef, ReachabilityCallback, &context))
{
if(SCNetworkReachabilityScheduleWithRunLoop(reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode))
{
retVal = YES;
}
}
return retVal;
}

- (void) stopNotifier
{
if(reachabilityRef!= NULL)
{
SCNetworkReachabilityUnscheduleFromRunLoop(reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
}
}

- (void) dealloc
{
[self stopNotifier];
if(reachabilityRef!= NULL)
{
CFRelease(reachabilityRef);
}
// [super dealloc];
}

+ (Reachability*) reachabilityWithHostName: (NSString*) hostName;
{
Reachability* retVal = NULL;
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]);
if(reachability!= NULL)
{
retVal= [[self alloc] init];
if(retVal!= NULL)
{
retVal->reachabilityRef = reachability;
retVal->localWiFiRef = NO;
}
}
return retVal;
}

+ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress;
{
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress);
Reachability* retVal = NULL;
if(reachability!= NULL)
{
retVal= [[self alloc] init];
if(retVal!= NULL)
{
retVal->reachabilityRef = reachability;
retVal->localWiFiRef = NO;
}
}
return retVal;
}

+ (Reachability*) reachabilityForInternetConnection;
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
return [self reachabilityWithAddress: &zeroAddress];
}

+ (Reachability*) reachabilityForLocalWiFi;
{
struct sockaddr_in localWifiAddress;
bzero(&localWifiAddress, sizeof(localWifiAddress));
localWifiAddress.sin_len = sizeof(localWifiAddress);
localWifiAddress.sin_family = AF_INET;
// IN_LINKLOCALNETNUM is defined in <netinet/in.h> as 169.254.0.0
localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM);
Reachability* retVal = [self reachabilityWithAddress: &localWifiAddress];
if(retVal!= NULL)
{
retVal->localWiFiRef = YES;
}
return retVal;
}

#pragma mark Network Flag Handling

- (NetworkStatus) localWiFiStatusForFlags: (SCNetworkReachabilityFlags) flags
{
PrintReachabilityFlags(flags, "localWiFiStatusForFlags");

BOOL retVal = NotReachable;
if((flags & kSCNetworkReachabilityFlagsReachable) && (flags & kSCNetworkReachabilityFlagsIsDirect))
{
retVal = ReachableViaWiFi;
}
return retVal;
}

- (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags
{
PrintReachabilityFlags(flags, "networkStatusForFlags");
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
{
// if target host is not reachable
return NotReachable;
}

BOOL retVal = NotReachable;
if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
// if target host is reachable and no connection is required
//  then we'll assume (for now) that your on Wi-Fi
retVal = ReachableViaWiFi;
}
if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
{
// ... and the connection is on-demand (or on-traffic) if the
//     calling application is using the CFSocketStream or higher APIs

if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
{
// ... and no [user] intervention is needed
retVal = ReachableViaWiFi;
}
}
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
// ... but WWAN connections are OK if the calling application
//     is using the CFNetwork (CFSocketStream?) APIs.
retVal = ReachableViaWWAN;
}
return retVal;
}

- (BOOL) connectionRequired;
{
NSAssert(reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef");
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags))
{
return (flags & kSCNetworkReachabilityFlagsConnectionRequired);
}
return NO;
}

- (NetworkStatus) currentReachabilityStatus
{
NSAssert(reachabilityRef != NULL, @"currentNetworkStatus called with NULL reachabilityRef");
NetworkStatus retVal = NotReachable;
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags))
{
if(localWiFiRef)
{
retVal = [self localWiFiStatusForFlags: flags];
}
else
{
retVal = [self networkStatusForFlags: flags];
}
}
return retVal;
}
@end

Thursday 4 July 2013

Check for device iOS version. is device is iOS 5 or iOS 6.

+ (BOOL) isIOS5
{
    NSString *os5 = @"5.0";
    NSString *currSysVer = [[UIDevice currentDevicesystemVersion];
    
    //    currSysVer = @"5.0.1";
    if ([currSysVer compare:os5 options:NSNumericSearch] == NSOrderedAscending//lower than 4
    {
        return NO;
    }
    else if ([currSysVer compare:os5 options:NSNumericSearch] == NSOrderedDescending//5.0.1 and above
    {
        return YES;
    }
    else // IOS 5
    {
        return YES;
    }
    
    return NO;
}



+ (BOOL) isIOS6
{
    NSString *os6 = @"6.0";
    NSString *currSysVer = [[UIDevice currentDevicesystemVersion];
    
    //    currSysVer = @"6.0.1";
    if ([currSysVer compare:os6 options:NSNumericSearch] == NSOrderedAscending)
    {
        return NO;
    }
    else if ([currSysVer compare:os6 options:NSNumericSearch] == NSOrderedDescending)
    {
        return YES;
    }
    else // IOS 5
    {
        return YES;
    }
    
    return NO;
}

Check if iOS current device is having retina display?

#pragma mark- Device Check=
+ (BOOL) isRetina
{
    if([[UIScreen mainScreenrespondsToSelector:@selector(scale)])
        return [[UIScreen mainScreenscale] == 2.0 ? YES : NO;
    
    return NO;
}

Check if multitasking is available iOS device?

#pragma mark- Multitasking -
+(BOOL)multitaskingAvailable
{
UIDevice* device = [UIDevice currentDevice];
BOOL backgroundIsSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)])
   backgroundIsSupported = device.multitaskingSupported;
return backgroundIsSupported;
}

Redirect NSLog to file.

#pragma mark- Redirect NSLog to file-

+ (void)redirectNSLogToDocumentFolder
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    NSString *fileName =[NSString stringWithFormat:@"NSLogFile"];
    
    NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName];
    
    NSLog(@"Redirecting NSLog to file");
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
    

}

Get Mac Address of iOS Device.

For iOS

#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
+ (NSString *)getMacAddress {
 int                 mgmtInfoBase[6];
 char                *msgBuffer = NULL;
  size_t              length;
  unsigned char       macAddress[6];
  
struct if_msghdr    *interfaceMsgStruct;
  struct sockaddr_dl  *socketStruct;
  NSString            *errorFlag = NULL;

  // Setup the management Information Base (mib)
  mgmtInfoBase[0] = CTL_NET;        // Request network subsystem
  mgmtInfoBase[1] = AF_ROUTE;       // Routing table info
  mgmtInfoBase[2] = 0;              
  mgmtInfoBase[3] = AF_LINK;        // Request link layer information
  mgmtInfoBase[4] = NET_RT_IFLIST;  // Request all configured interfaces

  // With all configured interfaces requested, get handle index
  if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0
    errorFlag = @"if_nametoindex failure";
  else
  {
    // Get the size of the data available (store in len)
    if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0
      errorFlag = @"sysctl mgmtInfoBase failure";
    else
    {
      // Alloc memory based on above call
      if ((msgBuffer = malloc(length)) == NULL)
        errorFlag = @"buffer allocation failure";
      else
      {
        // Get system information, store in buffer
        if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0)
          errorFlag = @"sysctl msgBuffer failure";
      }
    }
  }

  // Befor going any further...
  if (errorFlag != NULL)
  {
    NSLog(@"Error: %@", errorFlag);
    return errorFlag;
  }

  // Map msgbuffer to interface message structure
  interfaceMsgStruct = (struct if_msghdr *) msgBuffer;

  // Map to link-level socket structure
  socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1);

  // Copy link layer address data in socket structure to an array
  memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6);

  // Read from char array into a string object, into traditional Mac address format
  NSString *macAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X"
                                macAddress[0], macAddress[1], macAddress[2], 
                                macAddress[3], macAddress[4], macAddress[5]];
  NSLog(@"Mac Address: %@", macAddressString);

  // Release the buffer memory
  free(msgBuffer);

  return macAddressString;
}



For Mac OS- 

download sample from
https://developer.apple.com/library/mac/#samplecode/GetPrimaryMACAddress/Introduction/Intro.html