<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Snatch Bugs with This Lightweight Bug-Reporting iOS Library | Infinum</title>
		<atom:link href="https://infinum.com/blog/snatch-bugs-with-bug-reporting-ios-library/feed/" rel="self" type="application/rss+xml" />
		<link>https://infinum.com/blog/snatch-bugs-with-bug-reporting-ios-library/</link>
		<description>Building digital products</description>
		<lastBuildDate>Fri, 10 Apr 2026 14:51:20 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>8032https://infinum.com/uploads/2020/01/snatch-bugs-with-bug-reporting-ios-library-0.webp</url>
				</image>
				<title>Snatch Bugs with This Lightweight Bug-Reporting iOS Library</title>
				<link>https://infinum.com/blog/snatch-bugs-with-bug-reporting-ios-library/</link>
				<pubDate>Wed, 29 Jan 2020 15:30:00 +0000</pubDate>
				<dc:creator>Damjan Dabo</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/snatch-bugs-with-bug-reporting-ios-library/</guid>
				<description>
					<![CDATA[<p>Bugsnatch is a bug-reporting iOS library that helps QA engineers exterminate even the most persistent bugs.</p>
<p>The post <a href="https://infinum.com/blog/snatch-bugs-with-bug-reporting-ios-library/">Snatch Bugs with This Lightweight Bug-Reporting iOS Library</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-266"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	The truth of life of a Quality Assurance engineer is there will always be edge-cases developers might have missed in the process of creating an iOS app, the result of which are unwanted bugs.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	To help our QAs fight the nasty pesty little bugs, we’ve created the bug-reporting <a href="https://github.com/infinum/iOS-Bugsnatch">iOS library Bugsnatch</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-99">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-100'
	>
	Improving the process of Quality Assurance</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-102">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-103'
	>
	That’s where QA engineers come into play, their sight set on snatching and exterminating those bugs early on.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-106'
	>
	Having identified a bug, a QA engineer should have an intuitive and easy-to-use method of reporting it back to the developer. At Infinum, we’ve tried multiple approaches to this, and stuck with the one we’ve created – the Bugsnatch library.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-112"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-108">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-109'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-110'
	>
	Bugsnatch is a bug-reporting iOS library written in Swift, which creates a bug report template by collecting app and device information.</p>
		<div class="blockquote__caption-wrap">
					</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-115"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-113">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-114'
	>
	In most companies, QA engineers use some project management tool to create a task describing the encountered problem.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-118"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-116">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-117'
	>
	In addition to that description, the task usually contains some kind of boilerplate device and app info, including summarized debug information. That helps developers narrow down and pinpoint the problem’s root cause. If you want to become best friends with developers, <a href="https://infinum.com/blog/how-not-to-suck-at-writing-bug-reports/">learn how not to suck at writing bug reports</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-121"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-119">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-120'
	>
	All things considered, it could take an experienced QA engineer up to a few minutes to extract and write debug info by hand in the bug report, and it isn’t just a once- or twice-a-day occurrence. This means engineers spend a lot of time writing instead of testing.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-126"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-122">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-123'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-124'
	>
	“If only there was a way to make more efficient use of QA engineers’ time” – we thought and created Bugsnatch.</p>
		<div class="blockquote__caption-wrap">
					</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-129"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-127">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-128'
	>
	Meet Bugsnatch, an expert on bug reports</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-132"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-130">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-131'
	>
	<a href="https://github.com/infinum/iOS-Bugsnatch">Bugsnatch</a> collects all debug info and empowers QA engineers to send it via email with just a few taps. In addition to the email version, there is a version of Bugsnatch which automatically syncs with the project management tool <a href="https://www.productive.io/">Productive</a>, which we use to keep track of all the work at Infinum.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-135"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-133">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-134'
	>
	Productive keeps all of the company’s business processes centralized. From resource planning and project management, to time tracking, organizing sales and profitability monitoring.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-138"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-136">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-137'
	>
	It’s also the place where QA engineers create tasks to share information about discovered bugs to developers. Let’s see how Bugsnatch helps them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-141"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-139">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-140'
	>
	What exactly Bugsnatch’s great at</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-144"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-142">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-143'
	>
	Extracting general debug info</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-147"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-145">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-146'
	>
	The main feature of Bugsnatch is extracting debug info from your apps. It covers the basic application and device info, such as:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-150"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-148">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-149'
	>
	<li>app name</li><li>app version and build number</li><li>device name</li><li>iOS version</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-153"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-151">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-152'
	>
	To see the basic setup for the email version of Bugsnatch in <code>AppDelegate</code> in action, check out this example:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-155"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">func application</span><span class="token">(</span><span class="token">_ application</span><span class="token">: </span><span class="token">UIApplication</span><span class="token">, </span><span class="token">didFinishLaunchingWithOptions launchOptions</span><span class="token">: </span><span class="token">[</span><span class="token">UIApplication.LaunchOptionsKey</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">Any</span><span class="token">]</span><span class="token" style="color: #d73a49;">?</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">Bool</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> bugsnatchConfig </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">BugsnatchConfig(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">trigger:</span><span class="token"> </span><span class="token">ScreenshotTrigger(</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">triggerActionConfig:</span><span class="token"> </span><span class="token">EmailConfig(</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">extraDebugInfoDelegate:</span><span class="token"> </span><span class="token" style="color: #005cc5;">self</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    Bugsnatch.</span><span class="token">shared</span><span class="token">.</span><span class="token">setup(</span><span class="token">config:</span><span class="token"> bugsnatchConfig</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-158"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-156">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-157'
	>
	Now that that’s done, you’re ready to go snatch some bugs.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-161"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-159">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-160'
	>
	Extracting additional debug info</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-164"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-162">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-163'
	>
	Some projects require additional debugging info, e.g. the type of user (guest or registered), user’s country or some other user setting. We’ve thought of that, which is why Bugsnatch features support for adding extra debug info dynamically.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-167"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-165">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-166'
	>
	To use it, all you need to do is conform to <code>BugsnatchExtraDebugInfoDelegate</code> and implement the computed property called <code>extraDebugInfo</code>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-170"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-168">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-169'
	>
	An example of how to do this can be seen here, in the <code>AppDelegate</code> extension:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-172"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">extension</span><span class="token"> </span><span class="token" style="color: #6f42c1;">AppDelegate</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">BugsnatchExtraDebugInfoDelegate </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">var extraDebugInfo:</span><span class="token"> </span><span class="token" style="color: #005cc5;">String</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> SessionManager.</span><span class="token">shared</span><span class="token">.</span><span class="token">user</span><span class="token">.</span><span class="token">id</span><span class="token"> </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> example dynamic info</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-175"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-173">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-174'
	>
	If you don’t need any additional debug info, just leave out the <code>extraDebugInfoDelegate</code> argument when initializing <code>BugsnatchConfig</code>, and you’re good to go.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-178"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-176">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-177'
	>
	How to trigger Bugsnatch?</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-181"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-179">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-180'
	>
	While your app is running, Bugsnatch can be triggered by any one of the available triggers at your disposal.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-184"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-182">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-183'
	>
	When configuring the Bugsnatch configuration, simply choose which trigger to use, since Bugsnatch comes out of the box with two kinds of triggers:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-187"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-185">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-186'
	>
	<li>a screenshot trigger</li><li>shake gesture trigger.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-190"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-188">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-189'
	>
	If these are not your cup of tea, you can also create custom triggers, or trigger Bugsnatch directly from your code when needed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-193"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-191">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-192'
	>
	Creating a custom trigger</h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-196"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-194">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-195'
	>
	To create a custom trigger, you will have to conform to the <code>Triggerable</code> protocol, which requires implementing a delegate of <code>TriggerDelegate</code> type.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-199"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-197">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-198'
	>
	Declaration of <code>Triggerable</code> protocol can be seen here:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-201"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token">protocol Triggerable</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">var delegate:</span><span class="token"> TriggerDelegate</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">get</span><span class="token"> </span><span class="token" style="color: #d73a49;">set</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-204"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-202">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-203'
	>
	That way, when you want to trigger Bugsnatch, the custom trigger should just call the delegates’ <code>didTrigger()</code> method.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-207"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-205">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-206'
	>
	Here you can see how it looks like for <code>ScreenshotTrigger</code> implementation:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-209"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token">class ScreenshotTrigger</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">Triggerable </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">weak</span><span class="token"> </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token">var delegate:</span><span class="token"> TriggerDelegate</span><span class="token" style="color: #d73a49;">?</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">init</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">_setup(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token">func _setup</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        NotificationCenter.</span><span class="token">default</span><span class="token">.</span><span class="token">addObserver(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">forName:</span><span class="token"> UIApplication.</span><span class="token">userDidTakeScreenshotNotification</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">object:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">queue:</span><span class="token"> .</span><span class="token">main</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token"> [</span><span class="token" style="color: #d73a49;">weak</span><span class="token"> </span><span class="token" style="color: #005cc5;">self</span><span class="token">] notification </span><span class="token" style="color: #d73a49;">in</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #005cc5;">self</span><span class="token" style="color: #d73a49;">?</span><span class="token">.</span><span class="token">delegate</span><span class="token" style="color: #d73a49;">?</span><span class="token">.</span><span class="token">didTrigger(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-212"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-210">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-211'
	>
	Taking screenshots</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-215"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-213">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-214'
	>
	An important feature of Bugsnatch is the possibility to use screenshots of your application when snatching bugs.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-218"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-216">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-217'
	>
	In the email version, screenshots are automatically attached to mail for quick dispatch.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-221"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-219">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-220'
	>
	In the Productive version, Bugsnatch automatically saves the screenshot to the device. The captured screenshots help reproduce a certain bug later on and make debugging sessions easier.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-224"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-222">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-223'
	>
	Supporting localization</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-225">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-226'
	>
	Bugsnatch contains labels and buttons with hardcoded text values. By default, these are displayed in English. If you need more language options, we’ve made this easy by supporting String localization.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-228">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-229'
	>
	When configuring Bugsnatch, you can change the String values for every label and button that will be displayed when starting the Bugsnatch library.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-233"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-231">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-232'
	>
	For supporting localization, simply pass <code>BugsnatchLocalizationConfig</code> with your own data as the <code>localization</code> argument when initializing <code>BugsnatchConfig</code>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-236"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-234">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-235'
	>
	Here you can see a simple example of changing two values:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-238"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">let</span><span class="token"> localization </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">BugsnatchLocalizationConfig(</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">titlePostfix:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">fancy bug report</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, 
</span></span><span class="line"><span class="token">    </span><span class="token">applicationName:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">App name</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">let</span><span class="token"> bugsnatchConfig </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">BugsnatchConfig(</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">trigger:</span><span class="token"> </span><span class="token">ScreenshotTrigger(</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">    </span><span class="token">triggerActionConfig:</span><span class="token"> </span><span class="token">EmailConfig(</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">    </span><span class="token">localization:</span><span class="token"> localization</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">Bugsnatch.</span><span class="token">shared</span><span class="token">.</span><span class="token">setup(</span><span class="token">config:</span><span class="token"> bugsnatchConfig</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-241"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-239">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-240'
	>
	Available in two versions</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-246"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-242">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-243'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-244'
	>
	Bugsnatch can be used in your project in one of the two available versions – email and Productive.</p>
		<div class="blockquote__caption-wrap">
					</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-249"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-247">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-248'
	>
	If you set up the email version, triggering Bugsnatch launches the native iOS email-sending form. The subject is filled with an auto-generated title, the text body is filled with debug info, and the screenshot is attached automatically.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-252"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-250">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-251'
	>
	The only thing left for the QA engineer to do is to fill in the recipient’s email address, and optionally, add further explanation of the bug.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-255"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-253">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-254'
	>
	In case the Productive version is set up, triggering Bugsnatch launches the Productive web page for creating a new task in a web view. Debug info is then automatically entered in the task creation form, and all other information related to the task, as well as the screenshot saved to the device, can be manually added.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-258"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-256">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-257'
	>
	Create better bug reports with Bugsnatch</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-261"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-259">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-260'
	>
	So, now you know about Bugsnatch, a simple but effective iOS library which helps QA engineers identify as many errors as possible and save precious minutes. It proved really useful in many of our projects and we are already exploring ways to expand and improve it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-264"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-262">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-263'
	>
	We’re excited to share it with the community, so please test it and feel free to share your improvement suggestions!</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/snatch-bugs-with-bug-reporting-ios-library/">Snatch Bugs with This Lightweight Bug-Reporting iOS Library</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>