二维码、通讯录


一、二维码简介

  • 什么是二维码?

二维码是用某种特定的几何图形,按一定的规律,在平面(二维方向上)分布的黑白相间的图形,来记录数据符号信息。


  • 二维码使用场景

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

你可能感兴趣的:(二维码、通讯录)