一、二维码简介
什么是二维码?
二维码是用某种特定的几何图形,按一定的规律,在平面(二维方向上)分布的黑白相间的图形,来记录数据符号信息。
-
二维码使用场景
1、手机支付(扫描商品二维码,通过银行或第三方支付提供的手机端完成支付)
2、获取信息( WIFI密码、资料、名片 )
3、加好友(QQ、微信、扫一扫加好友)
4、电商(用户扫码、手机直接购物)
-
注意
1、 从iOS7开始继承了二维码的生成和读取功能
2、此前广泛使用的zbarsdk目前不支持64位处理器
3、2015年2月1号起,不支持64位处理器的APP不允许上架
二、生成二维码
导入CoreImage框架
图片处理操作的功能
通过滤镜CIFiter生成二维码
1、实例化二维码滤镜CIFiter
2、恢复滤镜的默认属性setDefaults
3、将字符串转换成NSData
4、通过KVC设置滤镜inputMessage数据
5、通过KVC设置滤镜inputCorrectionLevel(容错率)
6、获得滤镜输出的图像outputImage
7、将CIImage转换成UIImage
8、通过位图创建高清图片
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.创建滤镜对象
CIFilter *fiter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
>
// 2.设置相关属性
[fiter setDefaults];
>
// 3.设置输入数据
NSString *inputData = @"http://www.baidu.com";
NSData *data = [inputData dataUsingEncoding:NSUTF8StringEncoding];
[fiter setValue:data forKeyPath:@"inputMessage"];
>
// 4.获取输出结果
CIImage *outputImage = [fiter outputImage];
>
// 5.显示二维码
self.imageView.image = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:200];
}
>
/**
* 根据CIImage生成指定大小的UIImage
*
* @param image CIImage
* @param size 图片宽度
*/
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
{
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
>
// 1.创建bitmap;
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
>
// 2.保存bitmap到图片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
}
-
容错率
L,M,Q,H中的一个(修正率越高,扫描时间越长)
L :%7的字码可被修正
// 5.显示二维码
self.imageView.image = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:200];
}
>
/**
* 根据CIImage生成指定大小的UIImage
*
* @param image CIImage
* @param size 图片宽度
*/
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
{
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
>
// 1.创建bitmap;
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
>
// 2.保存bitmap到图片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
}
```
>------------
* ######容错率
>> L,M,Q,H中的一个(修正率越高,扫描时间越长)
L :%7的字码可被修正
M:%15的字码可被修正
Q:%25的字码可被修正
H:%30的字码可被修正
扫描二维码
1、创建捕捉会话
2、设置输入设备
3、设置输入方式和代理
4、添加一个显示的layer
5、开始扫描
6、实现代理方法,获取到扫描结果,停止扫描,移除图层
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.创建捕捉会话
AVCaptureSession *session = [[AVCaptureSession alloc] init];
>
// 2.设置输入设备
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:inputDevice];
>
// 3.设置输入方式
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
>
// 4.添加一个显示的layer
AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
>
// 5.开始扫描
[session startRunning];
}
>
#pragma mark - 获取扫描结果
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count > 0) {
AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
NSLog(@"%@", object.stringValue);
}
}
获取通讯录
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.获取授权状态
RHAuthorizationStatus status = [RHAddressBook authorizationStatus];
>
// 2.判断如果是未授权,则直接返回
if (status != RHAuthorizationStatusAuthorized) return;
>
// 3.创建通信录
RHAddressBook *addressBook = [[RHAddressBook alloc] init];
>
// 4.获取所有的联系人
NSArray *peopleArray = addressBook.people;
>
// 5.遍历所有的联系人
for (RHPerson *person in peopleArray) {
>
// 6.获取联系人的姓名
NSLog(@"%@ %@", person.firstName, person.lastName);
>
// 7.获取电话号码
RHMultiValue *phones = person.phoneNumbers;
for (int i = 0; i < phones.count; i++) {
// 8.获取电话号码和对应的Label
NSString *phoneLabel = [phones labelAtIndex:i];
NSString *phoneValue = [phones valueAtIndex:i];
>
NSLog(@"%@ %@", phoneLabel, phoneValue);
}
}
}
手机型号和空间
下载第三方框架Device-extension-master,导入UIDevice--Hardware的.h和.m文件
// 1.获取手机型号
//注意:iPhone6以后需要手动更改框架(添加判断条件,和添加枚举)
[[UIDevice currentDevice] platformString];
>
// 2.获取剩余空间和一共多少空间
[[UIDevice currentDevice] freeDiskSpace];
[[UIDevice currentDevice] totalDiskSpace];
网友评论