有一段时间没有更新博客了,今天更新一篇关于最近工作中用到的一个功能,先简单描述一下:我们知道,测试人员在测试客户端产品时,当出现问题或者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. HDUOJ---hello Kiki

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. Ulipad Python输入先后输出问题

    print "Enter a interger"number=input() 在菜单栏 python-----设置参数----在Parameters:那栏加个参数 -u , 就可以 ...

  3. RHEL7 -- nmcli的使用

    查看网络设备的状态: # nmcli dev status DEVICE TYPE STATE ens32 --ethernet connected eth1 --ethernet disconnec ...

  4. PLSQL_统计信息系列09_统计信息在不同数据库中迁移

    2014-01-05 Created By BaoXinjian

  5. Python type() 函数

    描述 type() 函数如果你只有第一个参数则返回对象的类型,三个参数返回新的类型对象.类似isinstance() isinstance() 与 type() 区别: type() 不会认为子类是一 ...

  6. mysql按日/周/月统计

    一.mysql按日统计 ) count ' and start_time > '2017-06-28' group by days; 二.mysql按周统计 ) ' group by weeks ...

  7. python函数中参数是如何传递的?

    python中一切皆对象,函数中参数传递的是对象的引用. 1在函数中改变变量指向的对象,即指向不同对象. 当在函数中修改传递进来的变量指向另一个对象时,实参的对象不会改变. >>> ...

  8. 手机端上传图片及java后台接收和ajaxForm提交

    有很多微信开发的项目在手机端需要传图片,但是又不想调用微信的上传图片接口,于是采取了如下做法: 使用ajaxForm提交文件所需js:jquery.form.js 页面代码: <%@ page ...

  9. OpenGl学习glMatrixMode()函数理解

    glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项 ...

  10. nginx + django on windows

    It's quite simple to run django on nginx on windows. Here are some key steps to follow - 1. Download ...