2015-04-25 11:45:57 soindy 阅读数 8917

原因: 使用 NSDate *date = [NSDate date]; 获取的时间是标注的UTC时间,和北京时间相差8小时.将UTC时间转成当地的时间只需要设置  NSTimeZone *zone = [NSTimeZone systemTimeZone];

1.给NSDate设置时区

    NSDate *date = [NSDate date];

    NSTimeZone *zone = [NSTimeZone systemTimeZone];

    NSInteger interval = [zone secondsFromGMTForDate: date];

    NSDate *localeDate = [date  dateByAddingTimeInterval: interval];

2.给NSDateFormatter设置时区

    NSDateFormatter *formater = [[NSDateFormatter alloc]init];

    [formater setDateFormat:@"yyyyMMdd"];

    [formater setTimeZone:[NSTimeZone localTimeZone]];

    NSDate *date = [formater dateFromString:dateStr];



2016-06-26 00:05:07 chenzuhuan478 阅读数 481

这篇文章主要介绍在iOS7 -iOS8.0和iOS9.0无界面获取通讯录信息的方法.下面我们逐个介绍。

iOS7 - iOS8 无界面获取通讯录信息

首页要导入库:AddressBookUI 和 AddressBook

授权:

        ABAuthorizationStatus status =ABAddressBookGetAuthorizationStatus();

        

        switch (status) {

            casekABAuthorizationStatusNotDetermined:

            

            casekABAuthorizationStatusRestricted:

            {

                //参数1通讯录对象  参数2block 回调

                

                ABAddressBookRef book =   ABAddressBookCreateWithOptions(NULL, NULL);

                

                //申请授权

                

                ABAddressBookRequestAccessWithCompletion(book, ^(bool granted,CFErrorRef error) {

                    

                    if (granted) {

                       NSLog(@"授权成功");

                    }else{

                        

                       NSLog(@"授权失败");                        

                    }

                    

                });

            }

                break;

//系统关闭了该App通讯录权限

            casekABAuthorizationStatusDenied:

            {

                   NSLog(@"没有权限");

            }

                break;

            casekABAuthorizationStatusAuthorized:

            {

                //已经授权过了,可以进行下一步操作

                

            }

                break;

                

            default:

                break;

        }


获取通讯录信息

- (NSMutableArray *)getContacts

{

    //获取联系人信息

    NSMutableArray *phoneNumbers = [[NSMutableArrayalloc]init];

    

    ABAddressBookRef book =  ABAddressBookCreateWithOptions(NULL,NULL);

    

    CFArrayRef  allpeople = ABAddressBookCopyArrayOfAllPeople(book);

    

    CFIndex count =  CFArrayGetCount(allpeople);

    

    for (CFIndex i =0; i <count ; i++) {

        

        ABRecordRef record =   CFArrayGetValueAtIndex(allpeople, i);

        

        CFStringRef strFirst =  ABRecordCopyValue(record,kABPersonFirstNameProperty);

        

        CFStringRef strmdills =  ABRecordCopyValue(record,kABPersonMiddleNameProperty);

        

        CFStringRef strfamily =  ABRecordCopyValue(record,kABPersonLastNameProperty);

        

        NSString *str =[NSStringstringWithFormat:@"%@%@%@",(__bridge_transferNSString *)strfamily,(__bridge_transferNSString *)strmdills,(__bridge_transferNSString *)strFirst];

        

//        NSLog(@"%@",str);

        

        //电话号码

        

        ABMultiValueRef multivalue = ABRecordCopyValue(record,kABPersonPhoneProperty);

        

       

        NSMutableArray *phoneMut = [[NSMutableArrayalloc]init];

        

        

        for (CFIndex i =0; i <ABMultiValueGetCount(multivalue); i++) {

            

            CFStringRef phoneStr =   ABMultiValueCopyValueAtIndex(multivalue, i);

            

//            NSLog(@"phoneStr = %@",phoneStr);

            

            NSString *phone = (__bridge_transfer NSString *)(phoneStr);

            //该方法为去掉-()等符号方法

           NSString *aamyphone =  [ContactsformatPhoneNumber:phone];

            

           

                //通讯录模型只包含了名字和电话号码

                ContactPhoneModel *phone1 = [[ContactPhoneModelalloc]init];

                phone1.name = str;

                

                phone1.phone = aamyphone;

                [phoneNumbers addObject:phone1];


                

           

            //            NSLog(@"格式化:%@",aamyphone);

//            NSLog(@"%@",phone);

            CFRelease(phoneStr);

        }

        CFRelease(strfamily);

        CFRelease(strmdills);

        CFRelease(strFirst);

        

        

        

        

    }

    CFRelease(allpeople);

    

    

    

    return phoneNumbers;

}


去除号码格式

//去除号码格式

+ (NSString *)formatPhoneNumber:(NSString*)number

{

    number = [number stringByReplacingOccurrencesOfString:@"-"withString:@""];

    number = [number stringByReplacingOccurrencesOfString:@" "withString:@""];

    number = [number stringByReplacingOccurrencesOfString:@"("withString:@""];

    number = [number stringByReplacingOccurrencesOfString:@")"withString:@""];

    number = [number stringByReplacingOccurrencesOfString:@" "withString:@""];

    

    NSInteger len = number.length;

    if (len < 6)

    {

        return number;

    }

    

    if ([[numbersubstringToIndex:2]isEqualToString:@"86"])

    {

        number = [number substringFromIndex:2];

    }

    elseif ([[numbersubstringToIndex:3]isEqualToString:@"+86"])

    {

        number = [number substringFromIndex:3];

    }

    elseif ([[numbersubstringToIndex:4]isEqualToString:@"0086"])

    {

        number = [number substringFromIndex:4];

    }

    elseif ([[numbersubstringToIndex:5]isEqualToString:@"12593"])

    {

        number = [number substringFromIndex:5];

    }

    elseif ([[numbersubstringToIndex:5]isEqualToString:@"17951"])

    {

        number = [number substringFromIndex:5];

    }

    else if (len ==16 && [[numbersubstringToIndex:6]isEqualToString:@"125201"])

    {

        number = [number substringFromIndex:5];

    }

    

    return number;

}



iOS 9 通讯录所用方法

授权:

CNAuthorizationStatus status = [CNContactStoreauthorizationStatusForEntityType:CNEntityTypeContacts];

        

        //如果没有授权过需要请求用户的授权

        

        CNContactStore *store = [[CNContactStorealloc]init];

        

        cn.store = store;

        

        

        switch (status) {

            caseCNAuthorizationStatusNotDetermined:

            

            caseCNAuthorizationStatusRestricted:

            {

                //请求授权

                

                [store requestAccessForEntityType:CNEntityTypeContactscompletionHandler:^(BOOL granted,NSError *_Nullable error) {

                    

                    

                    

                    if (granted) {

                        

                       

                     NSLog(@"授权成功");

                        

                       

                    }else{

                        

                        NSLog(@"授权失败");

                    

                    

                    

                }];

            }

                break;

            caseCNAuthorizationStatusDenied:

            {

               

NSLog(@"没有权限");

            }

                break;

            caseCNAuthorizationStatusAuthorized:

            {

               //已经授权可以进行下一步操作

            }

                break;

                

            default:

                break;

        }



获取通讯录信息:

- (NSMutableArray *)ios9GetContacts

{

    //name  phone

    //该方法包含了需要获取信息的类型,可根据自己的需要选择添加类型

    CNContactFetchRequest *request = [[CNContactFetchRequestalloc]initWithKeysToFetch:@[CNContactGivenNameKey,CNContactPhoneNumbersKey,CNContactMiddleNameKey,CNContactFamilyNameKey]];

    

    NSMutableArray *phoneNumbers = [[NSMutableArrayalloc]init];

    

    //参数封装查询请求

    

    [self.storeenumerateContactsWithFetchRequest: requesterror:nilusingBlock:^(CNContact *_Nonnull contact,BOOL *_Nonnull stop) {

        

        

        

        

        

        

        for (CNLabeledValue * labeledValuein contact.phoneNumbers) {

            

            CNPhoneNumber *num = labeledValue.value;

            

//            NSLog(@"num = %@",num.stringValue);

//            

//            NSLog(@"num111 = %@",[num valueForKey:@"digits"]);

            

            

            //联系人模型

                ContactPhoneModel *phone = [[ContactPhoneModelalloc]init];

                phone.name =[NSStringstringWithFormat:@"%@%@%@" ,contact.familyName,contact.middleName,contact.givenName];

                phone.phone =  [ContactsformatPhoneNumber:num.stringValue];

                

                [phoneNumbers addObject:phone];


           

            

            

        }

        

        

    }];

    

    return phoneNumbers;

}



项目源码:https://github.com/WorkerHuan/myContactpppp


2014-07-30 09:15:49 u011365021 阅读数 318

NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间


好像是从ios4.1开始[NSDate date];获取的是GMT时间,这个时间和北京时间相差8个小时,以下代码可以解决这个问题


- (void)tDate

{

    NSDate *date = [NSDatedate];

    NSTimeZone *zone = [NSTimeZonesystemTimeZone];

    NSInteger interval = [zone secondsFromGMTForDate: date];

    NSDate *localeDate = [date  dateByAddingTimeInterval: interval];  

    NSLog(@"%@", localeDate);

}


2016-03-12 13:27:11 pancai2010 阅读数 354

苹果更新了ios9有一段时间了,最近总结了一下平时项目中遇到的一些ios9适配问题,分析一下ios8与ios9的不同点:

1. App Transport Security Settings

即NSAppTransportSecurity,IOS9中为了加强为了强制增强数据访问安全,默认会把 HTTP 请求,都改为 HTTPS 请求,原来的HTTP协议传输都改成TLS1.2协议进行传输,直接造成的情况就是App发请求的时候弹出网络无法连接。解决办法就是在项目的info.plist 文件里自己输入如下节点:





然后自己更新Xcode7.3后发现苹果更新成如下:


2. URLscheme

在iOS9中,如果使用URL scheme必须在"Info.plist"中将你要在外部调用的URL scheme列为白名单,否则不能使用。key叫做LSApplicationQueriesSchemes ,键值内容是

1
LSApplicationQueriesSchemes urlscheme1 urlscheme2 urlscheme3 urlscheme4

推荐一篇博客: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

其中最关键的是以下部分:

1
2
If you call the “canOpenURL” method on a URL that is not in your whitelist, it will return “NO”, even if there is an app installed that has registered to handle this scheme. A “This app is not allowed to query for scheme xxx” syslog entry will appear.
If you call the “openURL” method on a URL that is not in your whitelist, it will fail silently. A “This app is not allowed to query for scheme xxx” syslog entry will appear.

3.statusbar

以前我们为了能够实时的控制顶部statusbar的样式,可能会在喜欢使用

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

[[UIApplication sharedApplication]setStatusBarHidden:YES];

但是这么做之前需要将 info.plist 里面加上View controller-based status bar appearance BOOL值设为NO,就是把控制器控制状态栏的权限给禁了,用UIApplication来控制。

但是这种做法在iOS9不建议使用了,建议我们使用把那个BOOL值设为YES,然后用控制器的方法来管理状态栏比如。

- (UIStatusBarStyle)preferredStatusBarStyle{

    return UIStatusBarStyleLightContent;

}

4.字体

iOS9中,中文系统字体变为了专为中国设计的“苹方”,字体有轻微的加粗效果,并且最关键的是字体间隙变大了!
所以很多原本写死了width的label可能会出现“...”的情况。
包括在很多时候我们自动计算行高行宽的时候出现偏差,导致一些不可知的错误

CGSize size = [title sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}];

CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));


5.NSURLConnection

/*** DEPRECATED: The NSURLConnection class should no longer be used.  NSURLSession is the replacement for NSURLConnection ***/

IOS9后, 苹果用NSURLSession替代了NSURLConnection。如果项目以前使用过这些API,建议立即升级到基于 NSURLsession 的API的AFNetworking的版本。

6.bitcode

bitcode的理解应该是把程序编译成的一种过渡代码,然后苹果再把这个过渡代码编译成可执行的程序。bitcode也允许苹果在后期重新优化我们程序的二进制文件,有类似于App瘦身的思想。问题的原因是:某些第三方库还不支持bitcode,要不就是把这个bitcode禁用。

解决方法方法一:更新library使包含Bitcode,否则会出现以下中的警告;

1
(null): URGENT: all bitcode will be dropped because '/Users/myname/Library/Mobile Documents/com~apple~CloudDocs/foldername/appname/GoogleMobileAds.framework/GoogleMobileAds(GADSlot+AdEvents.o)' was built without bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. Note: This will be an error in the future.

解决方法方法二:把这个bitcode设为禁用



2016-09-23 14:55:44 CodingFire 阅读数 12758

对于Xcode8的发布,苹果也是来了个大的跳跃,默认最低支持的iOS版本为8.0,当然也并不是说8.0以下就直接放弃了,虽然表现出来的是这样,毕竟使用8.0以下系统的还是大有人在的,老项目要兼容iOS8以下也是可以另辟蹊径的。

首先我们要找到Xcode是通过什么来兼容iOS版本的,请打开以下路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport,在文件夹中我们能够看到Xcode支持的iOS版本,从8.0开始,唯独没有8.0以下的,所以我们第一步要做的就是把需要支持的iOS版本的配置包放进来,博主这里支持到7.0,包括7.1,下载配置包地址请看:真机配置包下载,下载下来后拖进去。

到这里并没有结束,接下来需要配置Xcode,打开以下路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
,在这里我们要改点东西,但是在这个文件夹里的东西是锁定的,首先右键‘空白部分’,点击显示简介,滑动到最下面,点击小锁打开权限,需要输入管理员密码,接着把所有的权限改为读写,第一步完成,接下来,右键SDKSettings.plist文件夹,和上面同样的操作,打开读写权限,然后双击打开SDKSettings.plist文件,如图:
这里写图片描述
这里写图片描述
在这个下面添加7.0和7.1,按照从小到大的顺序排好。接着重启电脑即可,一定要重启电脑哦,结束的时候别忘了把刚才改的权限都改回去以防不小心动了不该动的。
看Xcode里面:
这里写图片描述

已经可以看到7.0和7.1了,如果需要支持更低的版本,跟上面同样的方法,只需要添加对应的配置文件即可。

Xcode8 支持 iOS7及以下版本

博文 来自: skylin19840101

IOS 8弃用api

阅读数 1966

ios 8 适配须知

博文 来自: u012460084

IOS8定位

阅读数 590

没有更多推荐了,返回首页