有一段时间没有更新博客了,今天更新一篇关于最近工作中用到的一个功能,先简单描述一下:我们知道,测试人员在测试客户端产品时,当出现问题或者BUG的时候,都得先对页面截图,然后从相册中选择截图,加上一段描述放到TD库或者直接通过邮件发给开发人员,以方便开发人员进行修改,过程繁琐。通过下面功能的介绍,您可以很方便的让测试人员遇到BUG的时候,摇一摇设备,然后自动截图并保存到应用的沙盒之中。截图保存到沙盒之后,您可以自定义一个问题反馈的页面,对问题进行描述(描述可使用第三方平台,如讯飞语音,实现语音录入的效果)之后,将描述信息和页面截图一起发送给开发人员(可以是邮件,也可以是直接发送到后台)。

  下面来看看功能是怎么实现的。

  首先,定义了一个category:ShakeAndCutter

  UIViewController+ShakeAndCutter.h文件源码:

#import <UIKit/UIKit.h>

@interface UIViewController (ShakeAndCutter)

@end

  UIViewController+ShakeAndCutter.m文件源码:

 #import "UIViewController+ShakeAndCutter.h"
#import <QuartzCore/QuartzCore.h>
#import "TestFeedbackViewController.h" @implementation UIViewController (ShakeAndCutter) - (BOOL)canBecomeFirstResponder
{
return YES;
} #pragma mark - 摇一摇动作处理 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"began");
} - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"cancel");
} - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"end");
[self cutterViewToDocument]; // 这里是自定义的问题反馈页面,也可以直接跳转到系统邮件发送的页面
TestFeedbackViewController *testFeedbackViewController = [[[TestFeedbackViewController alloc] initWithNibName:@"TestFeedbackViewController" bundle:nil] autorelease];
[self.navigationController pushViewController:testFeedbackViewController animated:YES];
} #pragma mark - 截屏处理 - (void)cutterViewToDocument
{
UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow]; UIGraphicsBeginImageContext(screenWindow.frame.size);
[screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); NSData *screenShotPNG = UIImagePNGRepresentation(screenShot);
NSError *error = nil;
[screenShotPNG writeToFile:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"error.png"] options:NSAtomicWrite error:&error];
} @end

  至此,摇一摇和截图功能就已经完成了,那么在应用中怎么使用呢?

  • 对于IOS6.0以上的设备,只需要在项目的pch文件中引进头文件#import "UIViewController+ShakeAndCutter.h"即可(我在IOS6.0.1、IOS6.1.5、IOS7.0.6设备上已经测试过),这样测试工作完成之后,您只需要将这行代码注释或者删除就可以了;
  • 对于IOS6.0以下的设备,在需要实现摇一摇效果的页面,有可能要加入如下代码(手头没有IOS6.0以下的设备,如果大家有的话,帮忙验证一下,非常感谢):

  1.viewDidLoad方法中,添加两行代码:

 [[UIApplication sharedApplication] setApplicationSupportsShakeToEdit:YES];
[self becomeFirstResponder];

2.viewDidAppear方法中,添加一行代码:

 [self becomeFirstResponder];

3.viewDidDisappear方法中,添加一行代码:

 [self resignFirstResponder];

  当然,以上的功能,您也可以实现其他的效果:比如说用户问题的反馈等等,具体可以根据应用的需求而定。

  

  这里,再附上发送到邮件功能的示例代码:

  MailViewController.h文件源码:

 #import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#import<MessageUI/MFMailComposeViewController.h> @interface MailViewController : UIViewController<MFMailComposeViewControllerDelegate,
MFMessageComposeViewControllerDelegate>
{
UIButton *shareToMailButton;
} @end

  MailViewController.m文件源码:

 #import "MailViewController.h"
#import "Constants.h" @interface MailViewController () @end @implementation MailViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
} - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view. self.title = @"Bug反馈"; shareToMailButton = [self buttonWithFrame:CGRectMake(, , , ) action:@selector(btnClicked:) withTag:];
[shareToMailButton setTitle:@"Bug反馈" forState:UIControlStateNormal];
} - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} #pragma mark - 自定义方法 - (void)btnClicked:(id)sender
{
UIButton *btnSender = (UIButton *)sender; switch (btnSender.tag)
{
case : // 分享到邮箱
{
[self showMailPicker];
break;
}
default:
break;
}
} /*******************************************************************************
* 方法名称:buttonWithFrame:action:
* 功能描述:初始化页面按钮,并添加到页面视图
* 输入参数:
* 输出参数:
******************************************************************************/
- (UIButton *)buttonWithFrame:(CGRect)frame action:(SEL)action withTag:(int)tag
{
UIImage *buttonBackgroundImage = [[UIImage imageNamed:@"button_background.png"] stretchableImageWithLeftCapWidth: topCapHeight:];
UIImage *disabledButtonBackgroundImage = [[UIImage imageNamed:@"button_background_disabled.png"] stretchableImageWithLeftCapWidth: topCapHeight:]; UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = frame;
[button setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal];
[button setBackgroundImage:disabledButtonBackgroundImage forState:UIControlStateDisabled];
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
[button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
button.tag = tag;
[self.view addSubview:button]; return button;
} - (void)showMailPicker
{
Class mailClass = (NSClassFromString(@"MFMailComposeViewController")); if (mailClass !=nil)
{
if ([mailClass canSendMail])
{
[self displayMailComposerSheet];
}
else
{
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@""message:@"设备不支持邮件功能" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil];
[alert show];
[alert release];
}
}
else
{ } } - (void)displayMailComposerSheet
{
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; // 设置picker的委托方法,完成之后会自动调用成功或失败的方法
picker.mailComposeDelegate = self;
// 添加主题
[picker setSubject:@"Bug反馈"];
// 添加收件人
NSArray *toRecipients = [NSArray arrayWithObject:@"279352257@qq.com"];
// 说明:也可以添加多个收件人,代码如下所示:
// NSArray *toRecipients = [NSArray arrayWithObjects:@"one@qq.com",@"two@qq.com",nil];
// 添加抄送
// NSArray *ccRecipients = [NSArray arrayWithObjects:@"second@qq.com",@"third@qq.com", nil];
// 添加密送
// NSArray *bccRecipients = [NSArray arrayWithObject:@"fourth@qq.com"]; [picker setToRecipients:toRecipients];
// [picker setCcRecipients:ccRecipients];
// [picker setBccRecipients:bccRecipients];
// 发送图片附件(其他格式的附件,可以都先转化称NSData类型,然后设置相应的mimeType即可,如txt类型为@"text/txt",doc类型为@"text/doc",pdf类型为@"file/pdf"等等)
NSData *myData = [NSData dataWithContentsOfFile:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"error.png"]];
[picker addAttachmentData:myData mimeType:@"image/jpeg" fileName:@"error.png"];
NSString *emailBody = [NSString stringWithFormat:@"<p>文字没有全部显示</p>"]; // 直接在HTML代码中写入图片的地址
// NSString *emailBody = [NSString stringWithFormat:@"<img src='http://p2.so.qhimg.com/t0130e3288d86929b97.jpg' /><p>我分享了图片</p>"]; [picker setMessageBody:emailBody isHTML:YES];
[self presentModalViewController:picker animated:YES];
[picker release];
} - (void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
switch (result)
{
case MFMailComposeResultCancelled:
NSLog(@"Result: Mail sending canceled"); // 邮件发送取消
break;
case MFMailComposeResultSaved:
NSLog(@"Result: Mail saved"); // 邮件保存成功
break;
case MFMailComposeResultSent:
NSLog(@"Result: Mail sent"); // 邮件发送成功
break;
case MFMailComposeResultFailed:
NSLog(@"Result: Mail sending failed"); // 邮件发送失败
break;
default:
NSLog(@"Result: Mail not sent");
break;
}
[self dismissModalViewControllerAnimated:YES];
} - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
NSLog(@"messageComposeViewController");
} @end

IOS中摇一摇实现截屏(可实现问题反馈的功能)的更多相关文章

  1. iOS 中对各种视图的截屏以及分享

    1.一个第三方的工具,主要是对表视图.滚动视图.视图的扩展,用法也很简单 image = [tableview screenshot]; 2.然后将截的图片分享出去,在分享的时候,因为多个地方用到了截 ...

  2. iOS开发 代码 或 <Home+Power>截屏

      1. 截屏的两种简单方法, 注意这两种截图方法,都必须在视图完全加载完成后才能截图,即在 viewDidAppear 方法之后截屏,否则无法得到想要的截屏效果 (1) 利用绘图方法 renderI ...

  3. iOS开发之如何修改Mac截屏保存路径

    如何修改Mac截屏保存路径   MAC OS X系统默认的截图路径是桌面文件夹,默认的截图格式是 PNG 图片格式,如何自定义设置呢? 截图保存路径 打开终端(Terminal)并输入如下命令: de ...

  4. react native 中实现个别页面禁止截屏

    这里主要用到了原生模块,下面贴出FlagSecureModule.java的代码 package com.studyproj.flagsecure; import android.util.Log; ...

  5. IOS 上架要求视频及屏幕截屏

    客户提供上架的资料 1.IOS 上架要求视频演示,录制一段视频,上传到优酷,需要url连接. 2.手机截屏,每个尺寸5张.5s/6/6p *5=15张.截屏图片分辨率. iPhone4s手机 3.5I ...

  6. IOS中调用系统的电话、短信、邮件、浏览功能

    iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...

  7. IOS中实现图片点击全屏预览

    //// ViewController.m// XWZoomImageView//// Created by xiao on 15/11/13.// Copyright © 2015年 xiao. A ...

  8. iOS中正确的截屏姿势

    昨天写了个用到截屏功能的插件,结果问题不断,今天终于解决好了,把debug过程中所有尝试过的截屏方法都贴出来吧- 第一种 这是iOS 3时代开始就被使用的方法,它被废止于iOS 7.iOS的私有方法, ...

  9. iOS中的截屏(屏幕截屏及scrollView或tableView的全部截屏)

    iOS中的截屏(屏幕截屏及scrollView或tableView的全部截屏) 2017.03.16 12:18* 字数 52 阅读 563评论 4喜欢 2 1. 截取屏幕尺寸大小的图片并保存至相册 ...

随机推荐

  1. java多线程(二)之实现Runnable接口

    一.java多线程方式2: 实现Runnable接口 好处:a. 可以避免由于java单继承带来的局限性. b. 适合多个相同的程序的代码去处理同一个资源的情况, 把线程与程序的代码, 数据有效分离, ...

  2. Android开发学习之SQLite数据存取浅析

    一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...

  3. 什么是IIS应用程序池

    IIS应用程序池是将一个或多个应用程序链接到一个或多个工作进程集合的配置.因为应用程序池中的应用程序与其他应用程序被工作进程边界分隔,所以某个应用程序池中的应用程序不会受到其他应用程序池中应用程序所产 ...

  4. 最短路径 - 弗洛伊德(Floyd)算法

    为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是一个简单的3个顶点的连通网图. 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点 ...

  5. C语言sprintf与sscanf函数

    1.前言 我们经常涉及到数字与字符串之间的转换,例如将32位无符号整数的ip地址转换为点分十进制的ip地址字符串,或者反过来.从给定的字符串中提取相关内容,例如给定一个地址:http://www.bo ...

  6. [转载]Class-AB Amplifier 笔记

    Class-AB Amplifier 笔记 Reading Notes from Mikko Loikkanen “Design and Compensation of High Performanc ...

  7. django的hello world 项目

    一.新建一个django项目bester: django-admin startproject bester 二.在bester项目中建一个叫polls的应用程序: cd bester/ python ...

  8. 进程的处理器亲和性和 vCPU 的绑定(查看cpu信息,超线程等)

    通常情况下,在 SMP 系统中,Linux 内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个 CPU 上执行.一个进程在前一个执行时间是在 cpuM(M 为系统中的某 CPU 的 ID) ...

  9. 一些通用性的haproxy调优tips

    一.硬件和系统 haproxy是单线程,非阻塞,事件驱动,所以会最大化利用单个CPU内核,选择haproxy的硬件时要关注如下:   1.选择CPU的时候,选择高主频,大缓存的型号,比内核数更重要 2 ...

  10. FZU Problem 2030 括号问题

    Problem Description 给出一个字符串,其中包括3种字符: ‘(‘, ‘)’, ‘?’.其中?表示这个字符可以是’(‘也可以是’)’. 现在给出字符串S,你可以在’?’处填写’(‘ 或 ...