<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mobile App Archives - Efigence</title>
	<atom:link href="https://www.efigence.com/category/mobile-app/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.efigence.com/category/mobile-app/</link>
	<description>Custom Development &#38; Design for Finance</description>
	<lastBuildDate>Tue, 03 Sep 2024 13:39:54 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>Comprehensive Strategies for Performance Enhancement in Flutter Applications</title>
		<link>https://www.efigence.com/technology/flutter-app-performance-strategies/</link>
		
		<dc:creator><![CDATA[Aleksandra Bartosiak]]></dc:creator>
		<pubDate>Mon, 22 Jan 2024 08:50:07 +0000</pubDate>
				<category><![CDATA[Mobile App]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.efigence.com/flutter-app-performance-strategies/</guid>

					<description><![CDATA[<p>The post <a href="https://www.efigence.com/technology/flutter-app-performance-strategies/">Comprehensive Strategies for Performance Enhancement in Flutter Applications</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></description>
										<content:encoded><![CDATA[
    <section id="wysiwyg_31" class="layout wysiwyg" data-block-theme="light" data-top="medium" data-bottom="medium">
        <div class="row" data-view="1">
            <div class="columns small-12">
                <p>Achieving peak performance in Flutter applications is a pursuit that requires careful planning, <a href="https://www.efigence.com/technology/effective-techniques-for-enhancing-performance-in-flutter-applications/">optimization</a>, and strategic decision-making. In this article, we present a comprehensive guide to strategies that will help you deliver smoother, more responsive, and more efficient apps. Use our tips to optimize your creations and unlock the <a href="https://www.efigence.com/technology/cost-optimization-flutter/">full potential of Flutter</a>.</p>
<h2><strong>Excessive layout nesting</strong></h2>
<p>When we talk about excessive layout nesting, we refer to the practice of layering multiple widgets, one inside the other, often leading to a complicated widget tree. While Flutter’s flexible and expressive nature permits you to <a href="https://www.efigence.com/ux-ui/developing-design-system-patterns/">create intricate layouts</a>, it’s essential to strike a balance between complexity and simplicity.</p>
<p>There are multiple drawbacks to excessive nesting:</p>
<ol>
<li>It can lead to decreased performance as Flutter must traverse a deep widget tree during the rendering process, consuming more memory and processing power.</li>
<li>It makes your code harder to read, understand, and <a href="https://www.efigence.com/services-software-maintenance/">maintain</a>.</li>
<li>It may result in unintentional bugs and hinder your ability to make quick modifications to the <a href="https://www.efigence.com/ux-ui/the-difference-between-ui-and-ux/">UI</a>.</li>
</ol>
<p>To mitigate these issues, Flutter developers should employ techniques like using layout widgets in moderation, employing the LayoutBuilder widget when necessary, and keeping a watchful eye on the widget tree’s depth. It’s crucial to prioritize the use of widgets that serve specific layout purposes, such as Column, Row, and Stack while avoiding excessive reliance on generic containers like Container and Padding.</p>
<p>By adhering to a strategy that minimizes excessive layout nesting, developers can create Flutter applications that are not only high-performing but also maintainable and adaptable, ultimately leading to a superior user experience and a streamlined <a href="https://www.efigence.com/software-development/how-to-develop-an-app-understanding-the-development-process/">development process</a>.</p>
<h2><strong>Image compression</strong></h2>
<p>Image compression in Flutter is a crucial optimization technique employed to enhance application performance and minimize resource consumption. It involves reducing the file size of images without compromising their visual quality. By effectively compressing images, Flutter developers can create applications that load faster, occupy less storage space, and conserve network bandwidth.</p>
<p>When implementing image compression in Flutter, developers can choose from a range of strategies, including lossless and lossy compression techniques. Lossless compression retains the image’s original quality while decreasing its size, making it suitable for graphics that require high fidelity. Lossy compression, on the other hand, achieves higher compression ratios by sacrificing some quality, making it more suitable for images where a slight reduction in quality is acceptable.</p>
<p>Flutter provides developers with various packages and plugins, such as the flutter_image_compress package, to facilitate image compression<a href="https://www.efigence.com/technology/flutter-app-performance-strategies/#_ftn1" name="_ftnref1"><sup>[1]</sup></a>. You can also use external tools to convert images into more efficient formats, such as WebP. These solutions enable you to adjust parameters like image format, quality, and resolution, tailoring the compression to your specific needs.</p>
<img fetchpriority="high" class="size-full wp-image-41318 aligncenter" src="https://www.efigence.com/wp-content/uploads/2024/01/WebP-Image-Format-4-1024x640-1.png" sizes="(max-width: 1024px) 100vw, 1024px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/WebP-Image-Format-4-1024x640-1.png 1024w, https://www.efigence.com/wp-content/uploads/2024/01/WebP-Image-Format-4-1024x640-1-768x480.png 768w, https://www.efigence.com/wp-content/uploads/2024/01/WebP-Image-Format-4-1024x640-1-200x125.png 200w" alt="" width="1024" height="640" />
<p>Source: https://seomelbourne.com/seo-optimisation/webp-image-format-speed-up-website/</p>
<p>Moreover, responsive design techniques can be combined with image compression to load images of different resolutions and sizes based on the device’s screen size and resolution. This further optimizes performance by reducing unnecessary data transfer and rendering of oversized images.</p>
<h2><strong>Lazy loading</strong></h2>
<p>This strategy helps manage and improve the performance of your applications by deferring the loading of images and data until they are actually needed. This approach is particularly useful when dealing with extensive lists or grids of items, such as those found in news feeds, galleries, or data-heavy applications.</p>
<p>In Flutter, lazy loading of images and data works by loading content on-demand as it comes into the user’s view rather than preloading everything at once. This strategy conserves resources, reduces data usage, and speeds up the initial app loading time. Lazy loading is particularly advantageous when dealing with large datasets or remote resources. By fetching data incrementally, you avoid overwhelming the device’s memory.</p>
<p>A popular example of a mobile application using infinite scroll is Instagram:</p>
<img class="alignnone size-full wp-image-41317" src="https://www.efigence.com/wp-content/uploads/2024/01/What-Does-Infinite-Scroll-Mean-for-AdWord-Users_-blog_.png" sizes="(max-width: 1329px) 100vw, 1329px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/What-Does-Infinite-Scroll-Mean-for-AdWord-Users_-blog_.png 1329w, https://www.efigence.com/wp-content/uploads/2024/01/What-Does-Infinite-Scroll-Mean-for-AdWord-Users_-blog_-768x454.png 768w, https://www.efigence.com/wp-content/uploads/2024/01/What-Does-Infinite-Scroll-Mean-for-AdWord-Users_-blog_-200x118.png 200w" alt="" width="1329" height="785" />
<p>Source: <a href="https://peppermintcreate.com/what-does-infinite-scroll-mean-for-adword-users/" rel="nofollow">https://peppermintcreate.com/what-does-infinite-scroll-mean-for-adword-users/</a></p>
<h2><strong>Minimizing memory usage</strong></h2>
<p>To minimize memory usage and prevent memory leaks, developers should focus on proper resource disposal, such as closing streams and controllers when they are no longer needed. Additionally, using Flutter’s static analysis tool and memory profiling tools can help identify and address memory-related issues.</p>
<p>It’s crucial to avoid global variables and singletons that may lead to long-lived objects in memory and to consider using efficient image-loading techniques, stateless widgets, and isolates for heavy computations.</p>
<h2><strong>Code splitting</strong></h2>
<p>Code splitting is a technique used in Flutter <a href="https://www.efigence.com/technology/flutter-performance-optimization-tools/">to optimize application performance</a> by dividing the codebase into smaller, more manageable chunks. The goal is to load only the necessary code and assets, reducing the initial load time and memory usage.</p>
<p>A common approach to code splitting in Flutter is to break down the app into modules or features, each containing its own set of code, assets, and dependencies. These modules can be loaded dynamically when needed, allowing you to delay the loading of less frequently used features until they are actually required.</p>
<p>By splitting your codebase into smaller, logical units, you can achieve several benefits. First, it reduces the initial app load time, as only the essential code is loaded upfront. This is particularly advantageous in scenarios where users expect a quick app launch. Second, memory consumption is optimized because unnecessary code and assets are not loaded into memory until requested. Finally, it improves code maintainability by enforcing a clear and modular structure, making it easier to <a href="https://www.efigence.com/services/mobile-development/">develop and maintain your application</a>.</p>
<p>In Flutter, code splitting is often implemented using the previously mentioned concept of lazy loading. This is particularly useful when dealing with large applications with many screens, widgets, and resources.</p>
<h2><strong>Caching and local storage</strong></h2>
<p>Caching involves storing frequently accessed data, such as images, API responses, or other resources, in a local cache. It can be in-memory or on-disk and allows your application to quickly retrieve data without the need to fetch it from a remote server repeatedly.</p>
<p>Local storage, on the other hand, refers to the storage of persistent data on the device itself. It is especially useful for retaining user preferences, settings, and app-specific data. Flutter provides the shared_preferences package for straightforward key-value storage and the sqflite package for working with SQLite databases, allowing you to store structured data locally.</p>
<p>Combining caching and local storage can significantly enhance your application’s performance. By caching frequently used data, you reduce the need for frequent network requests, which can be time-consuming and resource-intensive. Local storage enables you to store data that should persist across app sessions, improving the user experience by preserving user preferences and application state.</p>
<h2><strong>7.   </strong><strong>Multithreading</strong></h2>
<p>It is a crucial technique in Flutter for optimizing performance and responsiveness in applications. It involves running multiple threads of execution at the same time, allowing tasks to be performed in parallel. While Dart, the language used in Flutter, has built-in support for asynchronous programming, multithreading provides an additional level of control over concurrent operations.</p>
<p>In Flutter, multithreading is often used to perform time-consuming tasks without blocking the user interface (UI). This is critical to maintain the app’s responsiveness. By moving tasks like data fetching, image processing, or complex computations to separate threads, the main UI thread remains free to handle user interactions and maintain a smooth user experience.</p>
<p>Multithreading in Flutter is particularly beneficial for tasks like decoding images, deconstructing complex data, and performing long computations. By running these tasks in separate threads, you ensure that the UI remains responsive and the user experience is smooth, even when dealing with resource-intensive operations.</p>
<p>However, it’s important to manage communication between threads carefully to prevent data race conditions and other concurrency-related issues, ensuring that multithreading enhances your application’s performance and doesn’t introduce new problems.</p>
<h2><strong>State management</strong></h2>
<p>State management is a fundamental concept in Flutter that revolves around efficiently handling and updating the data and user interface of an application. It’s essential for building responsive and dynamic applications and avoiding unnecessary re-rendering. Flutter offers various state management techniques, allowing developers to choose the one that best fits their project requirements.</p>
<p>At its core, state management involves managing and sharing the application’s state or data between different parts of the application, such as widgets, screens, or modules. The state can be categorized into two main types:</p>
<ul>
<li>Local State – concerns data that is specific to a particular widget or a small portion of the application. Widgets manage their local state using the State object, which allows them to update and refresh their own content without affecting other parts of the application. This is often suitable for simple applications or small, self-contained widgets.</li>
<li>Global State – also known as app-wide state, refers to data that needs to be shared and accessed across multiple widgets, screens, or even the entire application. Managing the global state effectively is essential for complex applications. Flutter offers various management solutions to handle global state, including Provider, Riverpod, BLoC, and GetX.</li>
</ul>
<h2><strong>Performance testing</strong></h2>
<p>One primary aspect of performance testing in Flutter is assessing the app’s rendering speed. This involves measuring how quickly the app can render its user interface, taking into account factors like the frame rate (measured in frames per second, or FPS) and the time taken to build and display each frame. Performance testing tools and packages, such as the built-in Flutter DevTools, help developers monitor rendering performance and identify areas that may need improvement.</p>
<p>Another key consideration in performance testing is evaluating the app’s memory usage. Monitoring memory consumption helps identify potential memory leaks and resource inefficiencies. You can use Flutter DevTools and memory profiling to analyze memory allocation and ensure that the app releases resources appropriately, preventing crashes and slowdowns.</p>
<p><img class="alignnone size-full wp-image-41316" src="https://www.efigence.com/wp-content/uploads/2024/01/devtools.png" sizes="(max-width: 1441px) 100vw, 1441px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/devtools.png 1441w, https://www.efigence.com/wp-content/uploads/2024/01/devtools-768x521.png 768w, https://www.efigence.com/wp-content/uploads/2024/01/devtools-200x136.png 200w" alt="" width="1441" height="977" />Source: https://dart.dev/tools/dart-devtools</p>
<p>Network performance is also crucial in Flutter applications. Performance testing involves examining the app’s behavior when interacting with remote servers or APIs. It assesses response times, data transfer efficiency, and error handling under various network conditions, ensuring that the app provides a seamless experience for users, even in less-than-ideal network environments.</p>
<p>Performance testing further extends to app startup times, navigation speed between screens, and responsiveness to user interactions. It also helps catch and fix any issues early in the development cycle, <a href="https://www.efigence.com/technology/project-risk/">reducing the risk</a> of performance-related problems in the final product. These aspects are vital for delivering a snappy and engaging user experience.</p>
<h2><strong>Animation optimization</strong></h2>
<p>One fundamental principle of animation optimization in Flutter is to minimize the use of heavy or excessive animations. Overloading an application with too many such elements can lead to performance issues. It’s important to use animations purposefully and avoid redundant or distracting effects that do not contribute to the user experience.</p>
<p>To optimize animations in Flutter, consider the following:</p>
<ul>
<li>Use tween-based animations: They allow you to specify the beginning and ending states of an animation, enabling precise control over the animation’s behavior.</li>
<li>Custom easing curves: Use them sparingly to achieve specific visual effects, but keep in mind that complex curves can impact performance.</li>
<li>Minimize the number of animations: Reducing the number of animations (especially complex ones) helps maintain a fluid user interface.</li>
<li>Frame rate considerations: For smooth animations, it’s generally recommended to target a frame rate of 60 FPS, but for less critical animations, you can use lower frame rates to conserve resources.</li>
<li>Use GPU-based animations: They allow applications to maintain high frame rates, offload graphic-intensive tasks from the CPU, and implement complex visual effects efficiently.</li>
</ul>
<h2><strong>Minimizing the use of external resources</strong></h2>
<p>This approach involves reducing reliance on external services, assets, and dependencies, which can lead to improved performance, reduced loading times, and greater control over your application.</p>
<p>One way to achieve this is by reducing external network requests. Fetching data from external APIs or servers can introduce latency and dependency on external services. By minimizing the number of network requests, you not only speed up data retrieval but also reduce the risk of network-related issues that can disrupt the user experience. Consider caching data locally to further decrease the need for repeated network requests.</p>
<p>When it comes to external assets, such as images or fonts, keeping them to a minimum can optimize your app’s size and loading speed. Utilizing techniques like image compression, vector graphics, and loading assets on-demand (lazy loading) can help manage external assets more efficiently.</p>
<p>Another aspect to consider is the moderate use of third-party libraries and dependencies. While Flutter has a rich ecosystem of packages and plugins, excessive reliance on external dependencies can bloat your app, increase maintenance complexity, and introduce compatibility challenges. It’s essential to evaluate whether the benefits of a particular dependency outweigh the costs and potential risks.</p>
<h2><strong>Opting in to new Flutter features</strong></h2>
<p>Opting into new Flutter features is an essential aspect of staying up-to-date with the latest enhancements and capabilities offered by the framework. It allows developers to leverage new features, improvements, and APIs that can streamline development and enhance application performance.</p>
<p>Flutter frequently releases updates and new versions with experimental features and improvements. To opt into these new features, developers can start by updating their Flutter SDK to the latest version. This ensures access to the most recent advancements and fixes. An interesting example is Flutter 2.0, which introduced null safety, a feature that helps eliminate a whole class of bugs.</p>
<p>Once updated, developers can selectively enable new features as needed in their Flutter applications. This can be done through feature flags and configuration options. These flags are typically provided by the Flutter team or specific packages and allow developers to experiment with new features while maintaining backward compatibility with older versions of Flutter.</p>
<img class="alignnone size-full wp-image-41315" src="https://www.efigence.com/wp-content/uploads/2024/01/image-10.png" sizes="(max-width: 1600px) 100vw, 1600px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/image-10.png 1600w, https://www.efigence.com/wp-content/uploads/2024/01/image-10-768x433.png 768w, https://www.efigence.com/wp-content/uploads/2024/01/image-10-1536x866.png 1536w, https://www.efigence.com/wp-content/uploads/2024/01/image-10-1240x700.png 1240w, https://www.efigence.com/wp-content/uploads/2024/01/image-10-200x113.png 200w" alt="" width="1600" height="902" />
<p>Source: <a href="https://developers.googleblog.com/2021/03/announcing-flutter-2.html" rel="nofollow">https://developers.googleblog.com/2021/03/announcing-flutter-2.html</a></p>
<h2><strong>Monitoring and error reporting</strong></h2>
<p>To effectively monitor your Flutter application, you can use various tools and strategies. These include integrating monitoring services like Firebase Performance Monitoring or Sentry, which provide real-time insights into app performance, network requests, and error tracking. Such services allow you to collect valuable data, monitor the app’s behavior, and identify performance bottlenecks.</p>
<p>In addition to third-party services, Flutter provides built-in tools for performance monitoring, such as Flutter DevTools. This suite of tools offers insights into the app’s rendering performance, memory usage, and network activity, allowing developers to identify and address issues that may impact the user experience.</p>
<p>Error reporting is a critical part of monitoring, as it helps you understand when and why your app encounters issues. Flutter developers can integrate error reporting services like Firebase Crashlytics or Sentry, which capture error logs, exceptions, and stack traces. This data is vital for diagnosing and resolving issues, as it provides detailed information about the context in which errors occur.</p>
<img class="alignnone size-full wp-image-41314" src="https://www.efigence.com/wp-content/uploads/2024/01/1_cJ8AIA1va0O8FJ4l7WoivA.webp" sizes="(max-width: 1600px) 100vw, 1600px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/1_cJ8AIA1va0O8FJ4l7WoivA.webp 1600w, https://www.efigence.com/wp-content/uploads/2024/01/1_cJ8AIA1va0O8FJ4l7WoivA-768x357.webp 768w, https://www.efigence.com/wp-content/uploads/2024/01/1_cJ8AIA1va0O8FJ4l7WoivA-1536x713.webp 1536w, https://www.efigence.com/wp-content/uploads/2024/01/1_cJ8AIA1va0O8FJ4l7WoivA-200x93.webp 200w" alt="" width="1600" height="743" />
<p>Source: <a href="https://medium.com/@jesuseguncaleb/why-you-need-firebase-crashlytics-in-your-flutter-apps-b4ef2eb4525" rel="nofollow">https://medium.com/@jesuseguncaleb/why-you-need-firebase-crashlytics-in-your-flutter-apps-b4ef2eb4525</a></p>
<h2><strong>Minimizing the use of external plugins</strong></h2>
<p>When you minimize the use of external plugins, you get a more concise and independent codebase. This can facilitate the maintenance of your project, as you have fewer external integrations to manage and update.</p>
<p>Furthermore, you gain greater control over the <a href="https://www.efigence.com/ux-ui-design/">functionality of your application</a>. Relying less on external plugins means that you’re not bound by the limitations or update schedules of those packages. You can tailor your app’s behavior more precisely to your specific requirements.</p>
<p>However, it’s essential to strike a balance between minimizing external plugins and leveraging the rich ecosystem of Flutter packages. Some third-party plugins can significantly speed up development and offer valuable features that would be time-consuming to implement from scratch. So, choose only high-quality and well-optimized plugins for Flutter.</p>
<h2><strong>Optimizing a Flutter application for specific platforms</strong></h2>
<p>Each platform, such as Android and iOS, has its own unique characteristics and performance considerations. By tailoring your app to the specifics of the target platform, you can enhance the user experience and make the app feel native on each platform.</p>
<p>One of the differences between Android and iOS is that they handle rendering and <a href="https://www.efigence.com/technology/how-motion-design-support-ux-in-mobile-app/">animations</a> differently. Understanding these nuances and addressing them appropriately is essential to delivering the best performance and user experience on each platform. If you develop an application for both Android and iOS, remember to tailor optimizations to the specific solution.</p>
<p>These are just basic strategies for performance enhancement in Flutter applications. They will help you effectively optimize your creations and unlock their full potential. Apply them to ensure exceptional experiences for your users!</p>
            </div>
        </div>
    </section>



<div id="simple-translate" class="simple-translate-system-theme">
<div>
<div class="simple-translate-button isShow" style="background-image: url('chrome-extension://cllnohpbfenopiakdcjmjcbaeapmkcdl/icons/512.png'); height: 22px; width: 22px; top: 40px; left: 364px;"></div>
<div class="simple-translate-panel " style="width: 300px; height: 200px; top: 0px; left: 0px; font-size: 13px;">
<div class="simple-translate-result-wrapper" style="overflow: hidden;">
<div class="simple-translate-move" draggable="true"></div>
<div class="simple-translate-result-contents">
<p class="simple-translate-candidate" dir="auto">
</div>
</div>
</div>
</div>
</div><p>The post <a href="https://www.efigence.com/technology/flutter-app-performance-strategies/">Comprehensive Strategies for Performance Enhancement in Flutter Applications</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Optimization of Flutter Applications from a Business Benefits Perspective. Cost of Optimization vs. Benefits</title>
		<link>https://www.efigence.com/technology/cost-optimization-flutter/</link>
		
		<dc:creator><![CDATA[Aleksandra Bartosiak]]></dc:creator>
		<pubDate>Thu, 18 Jan 2024 14:03:00 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[Mobile App]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.efigence.com/cost-optimization-flutter/</guid>

					<description><![CDATA[<p>The post <a href="https://www.efigence.com/technology/cost-optimization-flutter/">Optimization of Flutter Applications from a Business Benefits Perspective. Cost of Optimization vs. Benefits</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></description>
										<content:encoded><![CDATA[
    <section id="wysiwyg_92" class="layout wysiwyg" data-block-theme="light" data-top="medium" data-bottom="medium">
        <div class="row" data-view="1">
            <div class="columns small-12">
                <p><strong>Flutter, Google’s open-source UI software development toolkit, has revolutionized mobile app development with its promise of creating stunning, high-performance applications across multiple platforms. However, building an app is just the first step. To truly maximize the potential of a Flutter application, optimizing it for performance, efficiency, and user satisfaction is essential. In this article, we delve into the critical realm of optimizing Flutter applications from a business perspective.</strong></p>
<h2><strong>How Flutter works</strong></h2>
<p>Flutter, a dynamic<a href="https://www.efigence.com/technology/open-source-enterprise-or-enterprise-open-source-how-to-choose-a-cms/"> open-source</a> UI toolkit developed by Google, stands as a beacon in the realm of <a href="https://www.efigence.com/technology/kmm-hybrid-development-strategies/">multi-platform</a> application development. Its core essence lies in harmonizing the <a href="https://www.efigence.com/software-development/how-to-develop-an-app-understanding-the-development-process/">process of crafting applications</a> that resonate with diverse platforms while using a singular codebase. Flutter has swiftly gained traction within the developer community and the business landscape, offering an efficient and unified solution for cross-platform <a href="https://www.efigence.com/services/mobile-development/">app development</a>.</p>
<p>At Flutter’s heart lies the concept of unification through simplicity. Imagine crafting an application where a single codebase becomes the architectural blueprint for both the iOS and Android ecosystems. This not only speeds up the <a href="https://www.efigence.com/technology/software-product-development/">development cycle</a> but also minimizes the complexities associated with managing separate codebases, ultimately enhancing efficiency and productivity.</p>
<p>Flutter makes it possible to easily create mobile apps and effectively improve them. The paramount importance of optimization lies in its ability to directly influence a mobile application’s success and adoption. A well-optimized application becomes a magnet for users, tempting them with swift responsiveness, an <a href="https://www.efigence.com/ux-ui-design/">intuitive interface, and an immersive experience</a>. On the other hand, a poorly optimized app can repel users due to sluggish performance, frequent crashes, and excessive resource consumption.</p>
<p>Optimization also plays an important role in managing the costs associated with app development and <a href="https://www.efigence.com/services-software-maintenance/">maintenance</a>. By identifying bottlenecks and areas for improvement early in the development process, businesses can save valuable time and resources. This leads to faster development cycles, quicker bug fixes, and a reduction in long-term maintenance costs.</p>
<h2><strong>Why optimization is essential for business</strong></h2>
<p>Optimization emerges as a critical concept related to fine-tuning the inner workings of a high-performance engine. This process involves crafting an application to operate at its best capacity, ensuring efficiency, speed, and a seamless user experience.</p>
<p>One of the key aspects of mobile apps’ optimization is user satisfaction. The CX Trends Report says that more than 90% of consumers want to spend more time with brands that offer streamlined customer experiences<a href="applewebdata://94D2A5DC-E1F0-4CCE-9C8A-3CE1C6FA71DC#_ftn1" name="_ftnref1"><sup>[1]</sup></a>.</p>
<p>User satisfaction directly influences their engagement. A satisfied user is more likely to interact with the app regularly, delve deeper into its features, and invest more time in the application. This heightened engagement often translates into invaluable feedback, enabling developers to refine and enhance the app, thus fostering a continuous cycle of improvement.</p>
<p>Moreover, user satisfaction significantly impacts a crucial aspect of a mobile app’s presence: app store ratings and reviews. Positive user experiences lead to better rates, bolstering the app’s visibility and attracting more users. On the other hand, a dissatisfied user base can tarnish an app’s reputation, resulting in adverse effects on its overall success and adoption.</p>
<p>Furthermore, a content and satisfied user base is more likely to monetize the app effectively. Happy users are inclined to make in-app purchases, opt for premium subscriptions, or engage with advertisements. Thus, user satisfaction directly contributes to the app’s revenue stream and, by extension, the business’s financial success. An interesting example is Starbucks mobile app, which has led to a 26% increase in transactions<a href="applewebdata://94D2A5DC-E1F0-4CCE-9C8A-3CE1C6FA71DC#_ftn2" name="_ftnref2"><sup>[2]</sup></a>.</p>
<p><img class="wp-image-41254 aligncenter" src="https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.58.29.png" sizes="(max-width: 640px) 100vw, 640px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.58.29.png 2228w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.58.29-768x408.png 768w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.58.29-1536x816.png 1536w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.58.29-2048x1088.png 2048w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.58.29-1800x957.png 1800w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.58.29-200x106.png 200w" alt="" width="640" height="340" /><br />
Source: https://www.indigo9digital.com/blog/starbucksmobileapps</p>
<p>In general, effective optimization lays the foundation for strong user retention. Users who find value and satisfaction in an app are more inclined to remain loyal and continue using it over an extended period. This consistent user base ensures stability and growth for the app, a key factor in its long-term success.</p>
<h3><strong>Optimization as a key factor in the competitive mobile apps market</strong></h3>
<p>New apps are downloaded 255 billion times a year. Moreover, daily app usage is 5 hours per user. No wonder that total revenue in the mobile applications market is projected to reach US$752,57bn in 2027<a href="applewebdata://94D2A5DC-E1F0-4CCE-9C8A-3CE1C6FA71DC#_ftn3" name="_ftnref3"><sup>[3]</sup></a>.</p>
<p>In this competitive market landscape, user expectations are at an all-time high. Consumers demand swift and seamless experiences from the applications they use. An optimized mobile app meets these expectations head-on, offering faster load times, smooth interactions, and efficient use of device resources. This translates into a competitive advantage by attracting and retaining users who seek superior performance and a positive experience.</p>
<p>On the flip side, maintaining unoptimized applications can be financially burdensome. These applications are often plagued with performance issues, leading to higher bounce rates, lower user retention, and increased frustration. The subsequent need for extensive customer support and the constant cycle of fixing bugs and optimizing features can result in significant costs. Additionally, unoptimized apps are more likely to face negative reviews and reduced app store ratings, further impacting their market competitiveness.</p>
<h2><strong>Costs of optimization</strong></h2>
<p>Since we have already mentioned the costs of optimization, let’s take a closer look at the most important factors in this matter. The expenses can vary based on the size and complexity of the application, the level of optimization required, the geographic location of the development team, and the chosen optimization strategies. They include mainly:</p>
<h3><strong>Development time associated with optimization</strong></h3>
<p>Optimizing a mobile app is a time-consuming process that involves multiple stages, such as identifying optimization areas, implementing changes, conducting tests, and iterating based on the results. The time required can vary based on factors like the complexity of the app, the extent of optimization needed, and the size of the development team. Optimization can range from a few weeks to several months, impacting the overall development timeline of the app.</p>
<h3><strong>Human resources</strong></h3>
<p>When it comes to human resources, optimizing a mobile app demands a strategic approach. One option is to bolster the team by hiring specialized professionals who possess expertise in app optimization. These specialists, such as performance engineers, user experience (UX) designers, and quality assurance (QA) personnel, come with a cost, encompassing salaries, benefits, and recruitment expenses.</p>
<p>Alternatively, existing development teams can be upskilled through training initiatives. This training involves investment in workshops, seminars, online courses, or external trainers who impart the necessary skills and knowledge in optimization techniques.</p>
<h3><strong>Tools or external services</strong></h3>
<p>The optimization journey also entails financial commitments for the essential tools and external services. <a href="https://www.efigence.com/technology/flutter-performance-optimization-tools/">Optimization tools</a> play a significant role, facilitating performance monitoring, code analysis, and user experience assessments. These tools, however, come at a cost, involving licensing fees or subscription charges. Additionally, optimizing a mobile app might require the assistance of third-party services. These services can range from security audits and code reviews to performance testing.</p>
<p>Though they add to the costs, these external services are often necessary for thorough and comprehensive optimization, ensuring the app adheres to industry standards and performs at its best.</p>
<h2><strong>Business benefits from optimization</strong></h2>
<p>Despite the costs you have to bear, optimization can result in many priceless benefits for your mobile app. The most important advantages are:</p>
<h3><strong>Improved application performance</strong></h3>
<p>Improved performance, a core benefit of mobile app optimization, revolves around speed, responsiveness, and efficient execution of tasks. Optimizing an app fine-tunes its speed, making it faster to load and navigate. This heightened efficiency ensures smooth interactions within the app, from tapping buttons to scrolling through content, cultivating a satisfying user experience.</p>
<p>Additionally, optimization improves resource usage, reducing strain on the device’s memory and battery. It maintains consistency across diverse devices, regardless of specifications, promoting a reliable app that rarely crashes. This improved performance significantly influences user retention, keeping users engaged and returning for a seamless and enjoyable app experience.</p>
<p>An interesting example of optimizing an app for a better performance is Instagram for Android. In 2014, the developers managed to cut its start time in half, making it one of the fastest-starting apps on the market<a href="applewebdata://94D2A5DC-E1F0-4CCE-9C8A-3CE1C6FA71DC#_ftn4" name="_ftnref4"><sup>[4]</sup></a>.</p>
<img class="wp-image-41253 aligncenter" src="https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.54.18.png" sizes="(max-width: 752px) 100vw, 752px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.54.18.png 1336w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.54.18-768x636.png 768w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.54.18-200x166.png 200w" alt="" width="752" height="623" />
<p>Source: https://techcrunch.com/2014/11/10/instagram-discover-people/</p>
<h3><strong>Increased conversion rates and impact on revenues</strong></h3>
<p>Mobile app optimization significantly elevates conversion rates and directly influences revenue generation. By streamlining the user journey, enhancing the user experience, and making processes more efficient, optimization prompts users to seamlessly move through the conversion funnel.</p>
<p>Whether it’s making a purchase, signing up, or engaging with key app features, a well-optimized app nudges users towards these desired actions. A user encountering a smooth, intuitive process is more likely to complete the desired action, boosting conversion rates and translating into tangible revenue growth.</p>
<p>The positive impact on revenues is substantial. Higher conversion rates mean more users convert from visitors to customers, resulting in increased sales, subscriptions, or ad interactions. Moreover, satisfied users due to a well-optimized app are more likely to make repeat purchases and become loyal customers, providing a steady revenue stream over time.</p>
<p>One way to drive app revenue is through subscription optimization. It is used, for example, by Spotify, which offers skipping six songs per hour for free. When a user exceeds this limit, they get a message to upgrade to a premium account. Having a well-thought-out subscription strategy can help you improve your app’s revenue.</p>
<p><img class="alignnone wp-image-41252" src="https://www.efigence.com/wp-content/uploads/2024/01/spotify_premium.png" sizes="(max-width: 372px) 100vw, 372px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/spotify_premium.png 1080w, https://www.efigence.com/wp-content/uploads/2024/01/spotify_premium-768x1365.png 768w, https://www.efigence.com/wp-content/uploads/2024/01/spotify_premium-864x1536.png 864w, https://www.efigence.com/wp-content/uploads/2024/01/spotify_premium-675x1200.png 675w, https://www.efigence.com/wp-content/uploads/2024/01/spotify_premium-113x200.png 113w" alt="" width="372" height="661" /><br />
Source: https://www.swrve.com/resources/weblog/driving-app-revenue-through-subscription-optimization</p>
<h3><strong>Reduction in customer support costs</strong></h3>
<p>An optimized app is less likely to encounter glitches, errors, or confusing interfaces, leading to a decreased need for users to seek assistance. This reduction in support requests translates into cost savings as fewer resources and manpower are needed to handle customer inquiries, complaints, or technical problems.</p>
<p>Furthermore, app optimization often involves incorporating self-help features and intuitive designs that guide users effectively. Interactive tutorials, tooltips, and FAQs can be integrated to proactively address common concerns and queries within the app itself, reducing the need for external customer support. One example of an app that offers self-help features to users is Duolingo, which employs solutions such as interactive tutorials, in-app language tips, and practice opportunities.</p>
<img class="alignnone wp-image-41251" src="https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.50.09.png" sizes="(max-width: 840px) 100vw, 840px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.50.09.png 1336w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.50.09-768x569.png 768w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-15.50.09-200x148.png 200w" alt="" width="840" height="623" />
<p>Source: https://blog.duolingo.com/introducing-tips/</p>
<h3><strong>High ratings in app stores as a factor attracting new users</strong></h3>
<p>App Store Optimization (ASO) is a strategic approach focused on maximizing an app’s visibility and discoverability within app stores. It involves optimizing various elements associated with an app’s listing to enhance its ranking in search results and increase its appeal to potential users. This optimization process includes several key components, such as keywords, app title and description, icon and visuals, user reviews, and ratings.</p>
<p>Moreover, app store optimization entails cultivating a positive user perception through compelling visuals and engaging descriptions. A well-designed app icon, appealing screenshots, and an attractive app description can captivate users, encouraging them to click through to the app’s page. Positive user reviews and high ratings also play a crucial role, instilling confidence in potential users and influencing their decision to download the app.</p>
<p>A well-planned ASO campaign was run by Headspace, a meditation and mindfulness mobile app. It resulted in, among other things, a 40% increase in visibility and an 18% increase in installs via search<a href="applewebdata://94D2A5DC-E1F0-4CCE-9C8A-3CE1C6FA71DC#_ftn5" name="_ftnref5"><sup>[5]</sup></a>.</p>
<p><img class="alignnone size-full wp-image-41247" src="https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-11.38.55.png" sizes="(max-width: 1626px) 100vw, 1626px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-11.38.55.png 1626w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-11.38.55-768x623.png 768w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-11.38.55-1536x1245.png 1536w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-11.38.55-1480x1200.png 1480w, https://www.efigence.com/wp-content/uploads/2024/01/Screenshot-2024-01-18-at-11.38.55-200x162.png 200w" alt="" width="1626" height="1318" />Source: https://apps.apple.com/us/app/headspace-sleep-meditation/id493145008</p>
<h3><strong>Maintaining a competitive edge in the market</strong></h3>
<p>With millions of apps vying for attention, it’s essential to stand out. Optimizing an app allows developers to fine-tune its performance, user interface, and overall user experience. A smooth, <a href="https://www.efigence.com/ux-ui/design-system-business-impact/">intuitive app</a> with fast load times and minimal crashes attracts and retains users, setting it apart from competitors with poor performance. Moreover, optimization can uncover valuable insights into user behavior and preferences, enabling developers to adapt and innovate continuously to stay ahead of the curve.</p>
<p>A good example of an app standing out in the market is… Tinder. It revolutionized the dating landscape by introducing a simple yet highly engaging swipe mechanism to connect users. Its intuitive interface, gamified user experience, and effective matchmaking algorithms captured the attention of millions of users worldwide. The app successfully addressed the need for a modern, efficient, and entertaining dating platform, setting itself apart from traditional dating websites and applications.</p>
<p><img class="alignnone wp-image-41246 aligncenter" src="https://www.efigence.com/wp-content/uploads/2024/01/tinder-profile-update-1-scaled.webp" sizes="(max-width: 846px) 100vw, 846px" srcset="https://www.efigence.com/wp-content/uploads/2024/01/tinder-profile-update-1-scaled.webp 2560w, https://www.efigence.com/wp-content/uploads/2024/01/tinder-profile-update-1-768x512.webp 768w, https://www.efigence.com/wp-content/uploads/2024/01/tinder-profile-update-1-1536x1024.webp 1536w, https://www.efigence.com/wp-content/uploads/2024/01/tinder-profile-update-1-2048x1365.webp 2048w, https://www.efigence.com/wp-content/uploads/2024/01/tinder-profile-update-1-1800x1200.webp 1800w, https://www.efigence.com/wp-content/uploads/2024/01/tinder-profile-update-1-200x133.webp 200w" alt="" width="846" height="564" />Source: https://www.digitaltrends.com/mobile/tinder-profile-update-relationship-type-pronouns-badges-news/</p>
<h2><strong>Tools and Methods for Optimization</strong></h2>
<p><a href="https://www.efigence.com/technology/flutter-app-performance-strategies/">Using Flutter</a> for mobile app optimization gives you a lot of unique tools and methods to keep improving your application. They enhance performance, user experience, and overall efficiency. Here are some key techniques commonly used:</p>
<ul>
<li>Flutter DevTools is an essential tool for profiling and debugging Flutter apps. It provides insights into app performance, memory usage, and rendering. Developers can identify bottlenecks, optimize code, and enhance app responsiveness using this tool.</li>
<li>Flutter Inspector is <a href="https://www.efigence.com/technology/flutter-react-native-integration/">integrated within Flutter</a> and allows developers to visualize and inspect the widget hierarchy of the app. It aids in identifying redundant or inefficient widgets, optimizing the widget tree, and improving app rendering performance.</li>
<li>Code splitting and lazy loading are the techniques that help load only the necessary code and assets when required, reducing the initial load time of the app. This enhances app startup performance and user experience.</li>
<li>Asset optimization is crucial for reducing app size and enhancing load times. Techniques like image compression and using adaptive icons contribute to a more efficient app.</li>
<li>State management is essential for optimizing how the app manages and updates the state. Choosing an efficient state management approach, like Provider, Riverpod, or Bloc, minimizes unnecessary widget rebuilds, enhancing app performance.</li>
</ul>
<p>When optimizing apps, it’s important to follow the best practices used by successful developers and brands. Effective solutions include:</p>
<ul>
<li>Minimizing widget rebuilds – employ const constructors and utilize the const keyword wherever possible to create stateless widgets. This minimizes unnecessary rebuilds and enhances app performance.</li>
<li>Using keys wisely – this will help you update and manage the widget tree, especially in cases where widgets are reordered or reused.</li>
<li>Optimizing images – utilize image formats like WebP, JPEG 2000, or JPEG XR for images to reduce their size without compromising quality. Leverage tools like ImageOptim or TinyPNG to compress images further.</li>
<li>Delaying initializations – postpone non-essential initializations and heavy computations until they are needed, improving app startup speed.</li>
<li>Managing memory effectively – be cautious of memory leaks by releasing resources when they are no longer needed. Use the dispose() method to clean up resources and avoid unnecessary memory consumption.</li>
<li>Optimizing fonts – use system fonts or custom fonts with a limited set of characters to reduce font file sizes and improve app load times.</li>
<li>Reducing UI redraws – minimize unnecessary UI redraws by limiting state changes and utilizing tools like the const constructor and memorization to memorize expensive calculations.</li>
</ul>
<p>Optimizing applications in Flutter is not merely a technical endeavor but a strategic business move. By prioritizing optimization, businesses can amplify user satisfaction, streamline operations, reduce costs, and outpace competitors.</p>
<p>All of these benefits have their prices, of course. Optimization requires not only money but also time and appropriate skills. Businesses need to hire or train specialists, as well as use proper tools and external services. Nevertheless, such investments pay off! Optimized apps gain improved performance, increased conversion rates, higher ratings, and competitiveness on the market. Thanks to Flutter, developers can also reduce apps’ unnecessary costs.</p>
<p>Don’t hesitate to invest in optimization! Improving mobile apps in Flutter will undoubtedly pave your path to long-term business success.</p>
            </div>
        </div>
    </section>



<div id="simple-translate" class="simple-translate-system-theme">
<div>
<div class="simple-translate-button isShow" style="background-image: url('chrome-extension://cllnohpbfenopiakdcjmjcbaeapmkcdl/icons/512.png'); height: 22px; width: 22px; top: 40px; left: 364px;"></div>
<div class="simple-translate-panel " style="width: 300px; height: 200px; top: 0px; left: 0px; font-size: 13px;">
<div class="simple-translate-result-wrapper" style="overflow: hidden;">
<div class="simple-translate-move" draggable="true"></div>
<div class="simple-translate-result-contents">
<p class="simple-translate-candidate" dir="auto">
</div>
</div>
</div>
</div>
</div><p>The post <a href="https://www.efigence.com/technology/cost-optimization-flutter/">Optimization of Flutter Applications from a Business Benefits Perspective. Cost of Optimization vs. Benefits</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Mobile Application Security Essentials: A Comprehensive Guide for Flutter Apps</title>
		<link>https://www.efigence.com/technology/flutter-app-security-guide/</link>
		
		<dc:creator><![CDATA[Aleksandra Bartosiak]]></dc:creator>
		<pubDate>Fri, 29 Dec 2023 04:11:47 +0000</pubDate>
				<category><![CDATA[Mobile App]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.efigence.com/flutter-app-security-guide/</guid>

					<description><![CDATA[<p>The post <a href="https://www.efigence.com/technology/flutter-app-security-guide/">Mobile Application Security Essentials: A Comprehensive Guide for Flutter Apps</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></description>
										<content:encoded><![CDATA[
    <section id="wysiwyg_80" class="layout wysiwyg" data-block-theme="light" data-top="medium" data-bottom="medium">
        <div class="row" data-view="1">
            <div class="columns small-12">
                <p><b><span data-contrast="auto">Today, we are witnessing a significant increase in the popularity of mobile applications, driven by the growth of smartphones and mobile devices. Communication, entertainment, management, access to information from all over the world, financial services, health, and other aspects of daily life can be more or less related to mobile tools, and people of all ages are increasingly open to taking such a chance.</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">But there is a dark side to the story: as the popularity of <a href="https://www.efigence.com/services/mobile-development/">mobile apps</a> grows, so does the number of threats, and keeping users safe is one of the most essential tasks companies face, especially as cybercriminals become more sophisticated in their methods of fraud.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Methods to protect against these types of threats must be customized to the kind of application because while many of the general principles of design and management remain the same, specific implementations and security strategies can vary by technology and platform.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">In this short guide, we will focus on applications developed with <a href="https://www.efigence.com/technology/effective-techniques-for-enhancing-performance-in-flutter-applications/">Flutter</a>, a <a href="https://www.efigence.com/software-development/the-future-of-frontend-frameworks/">framework</a> from Google.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2 aria-level="2"><b><span data-contrast="auto">Key Security Threats – the most common examples</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">Understanding potential threats is the first step to protecting your applications. Unfortunately, there are numerous of them, and the creativity of criminals can be surprising – malware, phishing, man-in-the-middle (MitM), or authentication attacks are just a few examples. Fortunately, user education is also increasing, and more awareness means better data protection. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2><b><span data-contrast="auto">Among the most crucial security issues highlighted by respondents were:</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"><img class="alignnone size-full wp-image-40879" src="https://www.efigence.com/wp-content/uploads/2023/12/1_3-1.png" sizes="(max-width: 897px) 100vw, 897px" srcset="https://www.efigence.com/wp-content/uploads/2023/12/1_3-1.png 897w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-1-768x558.png 768w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-1-200x145.png 200w" alt="" width="897" height="652" /><br />
</span></p>
<p><span data-contrast="none">Source: </span><a href="https://www.statista.com/statistics/1381432/mobile-app-usage-cyber-threats-consumers-worldwide/" rel="nofollow"><span data-contrast="none">https://www.statista.com/statistics/1381432/mobile-app-usage-cyber-threats-consumers-worldwide/</span></a><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">However, users are the last line of defense, and it is up to application developers and programmers to keep the software secure. So, let’s take a look at the most common threats an application can be exposed to:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Man-in-the-Middle (MitM)</span></b> <b><span data-contrast="auto">attacks </span></b><span data-contrast="auto">– the threat involves intercepting and possibly modifying communications between two parties without being a participant in those conversations. Such an attack usually aims to capture sensitive data, such as login details, credit card information, or other confidential messages.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">In-memory data attacks – </span></b><span data-contrast="auto">the attack aims to gain access to sensitive data (e.g., passwords, credit card numbers, personal information) that is temporarily stored in the system or application memory (RAM).</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Threats related to authentication –</span></b><span data-contrast="auto"> authentication is the process of verifying the identity of a user or system. It is a crucial element in ensuring the security of any IT system, but it is also vulnerable to various types of attack – from brute force, where an attempt is made to guess a password by entering multiple combinations, to phishing, where an attempt is made to extract data by impersonating other people or institutions (such as <a href="https://www.efigence.com/banking/peopay-4-0-a-new-version-of-bank-pekaos-mobile-application-designed-in-cooperation-with-efigence/">banks</a>).</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">Sometimes, drawing a clear line between the different types of threats is easy; other times, it can be a matter of using several techniques simultaneously (a perfect example is the combination of man-in-the-middle and phishing).</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Unfortunately, we are seeing an increased trend in the different types of threats, and the worry is mainly caused by periodic spikes, which can mean testing new attacker software.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<img class="alignnone size-full wp-image-40871" src="https://www.efigence.com/wp-content/uploads/2023/12/1_3-7.png" sizes="(max-width: 1161px) 100vw, 1161px" srcset="https://www.efigence.com/wp-content/uploads/2023/12/1_3-7.png 1161w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-7-768x431.png 768w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-7-200x112.png 200w" alt="" width="1161" height="652" />
<p><span data-contrast="none">Source: </span><a href="https://securityboulevard.com/2023/05/man-in-the-middle-mitm-attacks-reaching-inboxes-increase-35-since-2022/" rel="nofollow"><span data-contrast="none">https://securityboulevard.com/2023/05/man-in-the-middle-mitm-attacks-reaching-inboxes-increase-35-since-2022/</span></a><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">While the sheer number of attacks and their increasing sophistication may be a cause for concern, another side of the coin is the <a href="https://www.efigence.com/technology/project-risk/">risk</a> associated with scaling applications, which can introduce new weaknesses.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Why? The answer is simple – as the number of users, functionality, and integration with additional systems and services increases, the application architecture becomes more complex and challenging to monitor, and connecting to other systems, such as payment systems or databases, can create new entry points for potential attackers.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">That’s why working from the bottom up is essential, laying the groundwork for future expansion.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2><b><span data-contrast="auto">Data Protection – how to secure users’ data</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">Data protection and quick response to possible security problems are the factors that most strongly influence the audience’s trust. And without it, it is difficult to talk about the application’s success.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"><img class="size-full wp-image-40870 aligncenter" src="https://www.efigence.com/wp-content/uploads/2023/12/1_3-6.png" sizes="(max-width: 1161px) 100vw, 1161px" srcset="https://www.efigence.com/wp-content/uploads/2023/12/1_3-6.png 1161w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-6-768x769.png 768w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-6-1000x1000.png 1000w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-6-350x350.png 350w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-6-200x200.png 200w" alt="" width="1161" height="1162" /></span></p>
<p><span data-contrast="none">Source: </span><a href="https://www.mckinsey.com/capabilities/risk-and-resilience/our-insights/the-consumer-data-opportunity-and-the-privacy-imperative" rel="nofollow"><span data-contrast="none">https://www.mckinsey.com/capabilities/risk-and-resilience/our-insights/the-consumer-data-opportunity-and-the-privacy-imperative</span></a><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">So, how can you effectively protect sensitive data? Implementing multiple defenses is best, as each acts as an additional firewall against potential threats. What are the options?</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">There are many, but we will focus on the most important ones:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h3 aria-level="3"><b><span data-contrast="auto">DATA ENCRYPTION</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h3>
<p><span data-contrast="auto">Step one is data encryption – without it, you cannot even think about application security. Data encryption makes private information unreadable to outsiders, greatly increasing safety. And while it’s not a once-and-for-all solution, as it also needs to be monitored and updated, it is a foundation. Without data encryption, any hacker can easily access the data.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">It might seem that ensuring data security is a priority for every company, yet we continue to hear stories about data breaches.</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"><img class="size-full wp-image-40869 aligncenter" src="https://www.efigence.com/wp-content/uploads/2023/12/1_3-5.png" sizes="(max-width: 1028px) 100vw, 1028px" srcset="https://www.efigence.com/wp-content/uploads/2023/12/1_3-5.png 1028w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-5-768x599.png 768w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-5-200x156.png 200w" alt="" width="1028" height="802" /> </span></p>
<p><span data-contrast="none">Source: <a href="https://www.statista.com/chart/2540/data-breaches/" rel="nofollow">https://www.statista.com/chart/2540/data-breaches/ </a></span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">While the biggest breaches in this area happened a few or a dozen years ago, when security was taken lightly, it’s easy to imagine the consequences of such a leak today! That’s why preventing data leaks is so important.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">To avoid unpleasant situations, remember the following:</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Regular updates</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Multifactor authentication</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Strong password policies</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Education – both for employees and users</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<h3 aria-level="3"><b><span data-contrast="auto">SECURE SESSION MANAGEMENT</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h3>
<p><span data-contrast="auto">Users who log into an application are given a kind of “access ticket”. This allows them to use the application freely but opens another door to various dangers. How do you counter them?</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">The base is the secure storage of access tokens, i.e., the use of mechanisms such as HTTP-only cookies, which restrict access to the server only, or the introduction of a short expiration time for access tokens, which makes them useful only for a short time.</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">In the second case, there may be a problem with an authorized user having to log in again after some time, but this inconvenience can be easily solved by introducing refresh tokens, which allow the user to extend the session without having to log in again, while still maintaining a high level of security.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h3 aria-level="3"><b><span data-contrast="auto">AUTHENTICATION AND AUTHORIZATION</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h3>
<p><span data-contrast="auto">Authentication and authorization play a key role not only in <a href="https://www.efigence.com/technology/flutter-performance-optimization-tools/">applications developed in Flutter</a> but in all digital systems and applications, and more and more developers are making users aware of this aspect. </span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Why? Because applications often process and store sensitive data, such as users’ personal information or <a href="https://www.efigence.com/services-digital-banking-platform/">financial data</a> (e.g., payment card numbers). With authentication, only authorized people can access this data. Moreover, authentication can be used to customize the <a href="https://www.efigence.com/technology/how-motion-design-support-ux-in-mobile-app/">in-app experience</a>, offering users tailored content or features for a more satisfying experience.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">What are the best practices for secure user logins and password management? In our experience, these are the most effective:</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Two-factor authentication (2FA),</span></b><span data-contrast="auto"> where, in addition to a password, the user must provide a second verification code that can be generated by the application or sent via SMS or email. That way, even if a third party gets the password, they can’t log in without the second code.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Strong passwords</span></b><span data-contrast="auto"> that force the user to create a combination of letters, numbers, and symbols.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Automatic lockout</span></b><span data-contrast="auto"> after multiple failed access attempts.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Audit and monitor the application status</span></b><span data-contrast="auto"> so that as the application evolves and new features are added, the authorization system can be adjusted to meet growing needs.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<h3 aria-level="3"><b><span data-contrast="auto">ATTACKS AND THE DEFENSE AGAINST THEM</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h3>
<p><span data-contrast="auto">Even the best security system cannot completely protect an application from at least attempted attacks from the outside, that is why it’s so important to be prepared to respond quickly in an emergency. The worst thing to happen during a cyberattack is panic and chaotic action.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">So how can you prepare? First of all, procedures. To implement them, however, you need to know what you are defending against and how to do it, so here is a summary of the most common threats and examples of how to counter them.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h3><b><span data-contrast="auto">MITM ATTACKS</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h3>
<p><span data-contrast="auto">Man-in-the-middle attacks intercept communications between two parties without their knowledge and can lead to phishing for sensitive data. The solution? Encryption and two-factor authentication will make the attackers’ job harder. It also is worthwhile to make users aware of such behavior, for example, by warning them not to click on suspicious links.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h3><b><span data-contrast="auto">XSS AND CSRF ATTACKS</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h3>
<p><span data-contrast="auto">Cross-site scripting (XSS) involves inserting malicious scripts into pages that can then bypass specific user access controls. On the other hand, Cross-Site Request Forgery (CSRF) is an attack in which an attacker forces the victim’s browser to perform unwanted actions on the web application in which the victim is logged in. These two threats are often confused, but the specifics of the danger are less critical in the context of our article, which is primarily about protection.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">So, how can you protect against these types of attacks? The use of tokens, which must be sent with every request to ensure that it comes from a valid source, and a Content Security Policy (CSP), which limits the possibility of malicious scripts, work well.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h3><b><span data-contrast="auto">IN-MEMORY DATA ATTACKS</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h3>
<p><span data-contrast="auto">In mobile applications, data stored on the device, such as passwords or private keys, can be vulnerable to attacks that have earned the term in-memory data attacks. This is where Flutter’s standard solutions, including the flutter_secure_storage plugin, provide secure storage for keys and other sensitive information.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">It’s also a good idea to limit the amount of time-sensitive data stored and to implement the encryption and authentication mentioned earlier.</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">By keeping these practices in mind, we can increase the security of our mobile applications developed in Flutter and protect our users’ sensitive data. Of course, the above examples are not exhaustive but are the most common. But again, the key is to provide multi-layered security, from encryption to system monitoring and updating.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2 aria-level="2"><b><span data-contrast="auto">Security testing</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">Most applications are <a href="https://www.efigence.com/software-development/how-to-develop-an-app-understanding-the-development-process/">developed in stages</a>, with user feedback guiding the way. However, this principle does not apply to security, as gaps in this area can not only discourage users from using the application but can also lead to severe consequences, including legal ones.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">That’s why </span><b><span data-contrast="auto">it’s so important to test your security and, at a minimum, perform penetration tests and risk assessments. Working with <a href="https://www.efigence.com/technology/cost-optimization-flutter/">Flutter</a>, many of these tests can be automated, allowing you to manage your system more efficiently and react quickly when irregularities are detected.</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Where to start? With a risk assessment – think about what data your application processes, where it is stored, what functions are most critical, and what components may be vulnerable to attack. We hope this article will help you make that assessment!</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">The next step is to determine the testing scope, i.e., the elements of the application to be tested. We know from experience that it can be difficult for developers to specify the testing area objectively, so sometimes, it is worth hiring an external company to perform a professional audit and point out possible threats and vulnerabilities.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Finally, documentation. While no one likes “paperwork,” carefully documented results allow you to work more efficiently, set a course of action, and monitor progress.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">A lot of work? Yes, but we mentioned above that you can use many tools to make this phase easier. Among the most popular are:</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">The SonarQube plugin</span></b><span data-contrast="auto"> can help you write cleaner, more secure code.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">OWASP ZAP and/or Burp Suite</span></b><span data-contrast="auto"> for real-time security testing.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Dependabot </span></b><span data-contrast="auto">to help monitor dependencies in a project for various vulnerabilities.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">The list of available plugins is much longer, and many useful solutions can be found </span><a href="https://docs.flutter.dev/packages-and-plugins" rel="nofollow"><b><span data-contrast="none">here</span></b></a><span data-contrast="auto">.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<h2 aria-level="2"><b><span data-contrast="auto">Platform security</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">We’ve written a lot about the role of updates in keeping applications secure, but it takes two to tango, and not all users are eager for updates and will reject them indefinitely. This applies not only to updates to the applications themselves but even to operating systems, as a study conducted by Apple some time ago brilliantly demonstrated.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"><img class="size-full wp-image-40868 aligncenter" src="https://www.efigence.com/wp-content/uploads/2023/12/1_3-4.png" sizes="(max-width: 1161px) 100vw, 1161px" srcset="https://www.efigence.com/wp-content/uploads/2023/12/1_3-4.png 1161w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-4-768x531.png 768w, https://www.efigence.com/wp-content/uploads/2023/12/1_3-4-200x138.png 200w" alt="" width="1161" height="802" /> </span></p>
<p><span data-contrast="none">Source: </span><a href="https://venturebeat.com/mobile/as-ios-13-hits-50-adoption-android-fragmentation-keeps-getting-worse/" rel="nofollow"><span data-contrast="none">https://venturebeat.com/mobile/as-ios-13-hits-50-adoption-android-fragmentation-keeps-getting-worse/</span></a><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Such fragmentation is a real problem because it stratifies the security management process. Hence the importance of taking countermeasures. This can be done in various ways – and again, juggling several of them works best.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Consistent versioning – communicate what the (new) version brings to the application, what it improves, or what bugs it fixes.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">When a critical security update is available, send notifications to users to inform them of the need to update.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Before releasing an update, test it in a production environment to ensure you are not introducing new bugs or security vulnerabilities.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Use official distribution channels – always publish your applications to official stores, such as Google Play or the Apple App Store, to minimize the risk of third-party modification.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">Respond to threats when the monitoring system detects a problem, even if it means temporarily disabling certain app features.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" aria-setsize="-1" data-aria-posinset="6" data-aria-level="1"><span data-contrast="auto">Regularly review server and application logs for unexpected or suspicious activity, analyze them, and respond to unwanted activity.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<h2 aria-level="2"><b><span data-contrast="auto">Challenges and best practices in mobile application security</span></b><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></h2>
<p><span data-contrast="auto">Mobile application security is not only key to protecting user data, it is also critical to a company’s reputation. In the digital age, where security breaches are highly publicized and can result in significant financial and reputational losses, organizations must pay close attention to the security of their applications. And the list of potential threats continues to grow.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">While many risks and protections are common to all mobile applications, the specifics of Flutter require attention to the unique challenges of this platform. Due to the cross-platform nature of Flutter, developers need to be aware of both iOS and Android specifics and the potential risks associated with middleware interpreting Dart code.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">Our company has many years of experience in this field – if you need help to increase the security of your application, </span></b><a href="https://www.efigence.com/contact/"><b><span data-contrast="none">contact us!</span></b></a><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:240}"> </span></p>
            </div>
        </div>
    </section>



<div id="simple-translate" class="simple-translate-system-theme">
<div>
<div class="simple-translate-button isShow" style="background-image: url('chrome-extension://cllnohpbfenopiakdcjmjcbaeapmkcdl/icons/512.png'); height: 22px; width: 22px; top: 40px; left: 364px;"></div>
<div class="simple-translate-panel " style="width: 300px; height: 200px; top: 0px; left: 0px; font-size: 13px;">
<div class="simple-translate-result-wrapper" style="overflow: hidden;">
<div class="simple-translate-move" draggable="true"></div>
<div class="simple-translate-result-contents">
<p class="simple-translate-candidate" dir="auto">
</div>
</div>
</div>
</div>
</div><p>The post <a href="https://www.efigence.com/technology/flutter-app-security-guide/">Mobile Application Security Essentials: A Comprehensive Guide for Flutter Apps</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Develop an App</title>
		<link>https://www.efigence.com/software-development/how-to-develop-an-app-understanding-the-development-process/</link>
		
		<dc:creator><![CDATA[Aleksandra Bartosiak]]></dc:creator>
		<pubDate>Thu, 07 May 2020 11:05:57 +0000</pubDate>
				<category><![CDATA[Mobile App]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.efigence.com/how-to-develop-an-app-understanding-the-development-process/</guid>

					<description><![CDATA[<p>The post <a href="https://www.efigence.com/software-development/how-to-develop-an-app-understanding-the-development-process/">How to Develop an App</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></description>
										<content:encoded><![CDATA[
    <section id="wysiwyg_83" class="layout wysiwyg" data-block-theme="light" data-top="medium" data-bottom="medium">
        <div class="row" data-view="1">
            <div class="columns small-12">
                <section id="content_block-0" class="layout content_block" data-pt="large" data-pb="small" data-background="white" data-order="0">
<div class="row align-left seen in-view" data-view="0">
<div class="small-12 columns text-left">
<div class="sub-content">
<h2 class="seen in-view" data-view="0">If your company is getting ready to create an app or make a significant upgrade to something you already have, it is best to begin with a basic understanding of the application development life cycle. While you are likely to count on a development firm or team to develop the app, it will be up to you to oversee the entire process and ensure that things go as planned. Experts along the way will take care of details in their area of specialization. However, a general overview will give you the confidence to choose the right people for the job and ensure the launch of your app is a success.</h2>
</div>
</div>
</div>
</section>
<section id="wysiwyg_block-1" class="layout wysiwyg_block" data-pt="small" data-pb="large" data-background="white" data-order="1">
<div class="row align-left seen" data-view="0">
<div class="small-12 columns">
<div class="block">
<p>Whether you have questions about how to develop an app for iPhone, Android, or any other platform, the general <a href="https://www.efigence.com/services-custom-software-development/">applications development</a> life cycle is the same. There are several ways to outline the process. They are mostly the same but may include a varying number of steps depending on the level of detail that is included. For our purposes, there are eight steps: <a href="https://www.efigence.com/services/user-experience-research/">research</a>, goal setting, project planning, wireframing, <a href="https://www.efigence.com/ux-ui/the-difference-between-ui-and-ux/">prototyping</a>, development, testing, and launching.</p>
<h2>App Development Process, Step One: Research</h2>
<p>Most people with questions about how to develop an app already have an idea. Often that idea needs some clarification and refinement, but it almost always needs <a href="https://www.efigence.com/ux-ui/user-research-methods-in-times-of-crisis/">research</a>. The research is essential because it sets up the rest of the process. The exact type of research will depend on the kind of app and the intended user. You will start with clarifying questions like, “Is this app for existing customers, or is it designed to draw people into a relationship with our organization?”</p>
<p>The research will need to be internal and external. Internal research will examine buyer personas and sales funnels. In contrast, external research will look at things like consumer trends, competition, and download and purchase data from other apps.</p>
<h2>Step Two of Developing an App: Goal Setting</h2>
<p>If you ask an <a href="https://www.efigence.com/software-development/outsourcing-software-development/">app development firm</a> how to develop an app, one of their first questions should be, what are your goals? With your idea and research in hand, it is time to begin to lay out what you expect your app to do in relation to your overarching goals. How will this help your current customers, draw new customers, or raise awareness? What are some “must-haves” in terms of features? At the end of this process, what will success look like for your new app?</p>
<h2>Step Three of the Mobile App Development Process: Project Planning</h2>
<p>As a client, you likely have some idea in mind about when you think your app will be available in app stores. Only by understanding the full project can you anticipate how long it will take and what challenges along the way may delay the rollout. In developing the project plan, the roadmap to completion is created with objectives, timelines, and benchmarks. This is how you and the team will know if things are going according to plan.</p>
<h2>Step Four of the Applications Development Life Cycle: Wireframing</h2>
<p>With clear goals and a plan in hand, it is time to start bringing the app the life on paper. This begins with sketching out images of the final product. This step is more than a chance for you to see a glimpse of the creation. It helps designers understand future challenges in the app development process and possible limitations in functionality. Wireframing is a more precise version of the sketch and begins to demonstrate how the app will function.</p>
<h2>Step Five of the App Development Process: Prototyping</h2>
<p>In some cases, it is feasible to create a limited rough version of the app so that the developers and sometimes the client have a chance to see how the app will work. This prototype will be far from the finished product in terms of polish and functionality. However, it will give everyone a chance to get their hands on the app to be sure everything is headed in the right direction.</p>
<h2>Step Six of Developing an App: Development</h2>
<p>If you ask someone how to develop an app for iPhone or Android, this is the part of the process they will likely think of. This step is where you will count on a team of experts. These specialists include <a href="https://www.efigence.com/ux-ui-design/">a user experience (UX) designer, a user interface (UI) designer</a>, coding experts, and people with specific knowledge of Apple and Android devices. This step is the most complex and often the longest part of the app development process. If you want to know how long does it take to develop an app, know that most of the time will be spent in this step. A project manager will oversee the work of the full team at this point. This leader will likely use modern project management tools and practices like Agile to create multiple iterations of the application to work out bugs and continue to add functionality. As a client, you may be involved in different aspects of this process, especially as new versions of the app are complete are ready for user feedback.</p>
<h2>Step Seven of Mobile App Development: Testing</h2>
<p>The thought of launching a new app is exciting, but launching one full of bugs can create a negative impression of your business. This can work against the reason you created it in the first place. Testing will be an integrated part of the development process, with tests be running on each iteration and with the addition of each feature. However, there is also a final comprehensive testing phase where the team will rigorously test the app for functionality, usability, and performance. It will also be tested on <a href="https://www.efigence.com/services/mobile-development/">different platforms such as iOS and Android</a> and different models of devices. Testing will also include getting the app into the hands of users with the chance to hear their feedback for possible necessary modifications or improvements.</p>
<h2>Step 8 of Developing an App: Launching</h2>
<p>This step is where everything comes together. However, if done wrong, you will not see the maximum impact and return from your investment. The biggest question your team will face here is how to get your app on as many mobile devices as possible. How this is accomplished will depend on the primary audience of the app. If you created it to improve the experience of existing customers, you likely already have channels to get the word out. If, instead, the app was designed to be a part of your sales funnel and draw people into a relationship with potential customers, getting the word out will be more challenging. Your team will ensure that your app is available in the appropriate app stores. However, more work will be needed to promote it to your target customers. App store optimization will help people find your app. However, it will take a comprehensive marketing plan that includes your website, social media, paid advertising, and even influencer marketing.</p>
</div>
</div>
</div>
</section>
            </div>
        </div>
    </section>



<div id="simple-translate" class="simple-translate-system-theme">
<div>
<div class="simple-translate-button isShow" style="background-image: url('chrome-extension://cllnohpbfenopiakdcjmjcbaeapmkcdl/icons/512.png'); height: 22px; width: 22px; top: 40px; left: 364px;"></div>
<div class="simple-translate-panel " style="width: 300px; height: 200px; top: 0px; left: 0px; font-size: 13px;">
<div class="simple-translate-result-wrapper" style="overflow: hidden;">
<div class="simple-translate-move" draggable="true"></div>
<div class="simple-translate-result-contents">
<p class="simple-translate-candidate" dir="auto">
</div>
</div>
</div>
</div>
</div><p>The post <a href="https://www.efigence.com/software-development/how-to-develop-an-app-understanding-the-development-process/">How to Develop an App</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Future Of Frontend Frameworks</title>
		<link>https://www.efigence.com/software-development/the-future-of-frontend-frameworks/</link>
		
		<dc:creator><![CDATA[Aleksandra Bartosiak]]></dc:creator>
		<pubDate>Mon, 27 Jan 2020 09:12:42 +0000</pubDate>
				<category><![CDATA[Frontend]]></category>
		<category><![CDATA[Mobile App]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://www.efigence.com/the-future-of-frontend-frameworks/</guid>

					<description><![CDATA[<p>The post <a href="https://www.efigence.com/software-development/the-future-of-frontend-frameworks/">The Future Of Frontend Frameworks</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></description>
										<content:encoded><![CDATA[
    <section id="wysiwyg_87" class="layout wysiwyg" data-block-theme="light" data-top="medium" data-bottom="medium">
        <div class="row" data-view="1">
            <div class="columns small-12">
                <section id="content_block-0" class="layout content_block" data-pt="large" data-pb="small" data-background="white" data-order="0">
<div class="row align-left seen in-view" data-view="0">
<div class="small-12 columns text-left">
<div class="sub-content">
<h2 class="seen in-view" data-view="0">Frontend technologies have always been evolving and changing. From creating webpages based almost entirely on tables we moved to complex, responsive single-page applications.</h2>
</div>
</div>
</div>
</section>
<section id="wysiwyg_block-1" class="layout wysiwyg_block" data-pt="small" data-pb="large" data-background="white" data-order="1">
<div class="row align-left in-view seen" data-view="0">
<div class="small-12 columns">
<div class="block">
<p>JavaScript started to play more and more an important part across the years, handling basic functionality for the website at first, and becoming a crucial foundation as of today.</p>
<h2>The past… up to now</h2>
<p>Over the years, many tools were created which helped to speed up web development. From jQuery (it was used to build the first version of Gmail by the way), to Backbone (the first framework that allowed the creation of a single-page app), <a href="https://www.efigence.com/services/angularjs/">AngularJS</a> (the first framework that provided two-way binding and real-time HTML markup updates) to Knockout, Meteor and finally, the ones that are being talked about over and over: <a href="https://www.efigence.com/services/react/">React</a>, <a href="https://www.efigence.com/services/angular/">Angular</a> and <a href="https://www.efigence.com/services/vue-js/">VueJS</a>. I bet discussions about those three happen to you on a daily basis.</p>
<h2>The present and the future</h2>
<p>Alright, let’s put forward some forecasts about the future of frontend frameworks. To smart guess, speculate and place our bets correctly, we’ll need some analysis of the current situation. There’s no future without the present (pretty sure I’m plagiarising Paulo Coelho now…). What do we have today then? Do you happen to be familiar with that drinking game, that one where you have to come up with a word that isn’t part of a name of any JavaScript tool/framework/lib? If it is, you drink. An example: I came up with the word “castle”, but… there is Castle.js in the npm repository: (<a href="https://www.npmjs.com/package/castle.js/v/1.0.11" rel="nofollow">https://www.npmjs.com/package/castle.js/v/1.0.11</a>). So… I’ve lost already.</p>
<p>Don’t play this game. It’s dangerous.</p>
<p>Despite that, it does prove a point. There is plenty of JS stuff and there is much more if we extend to frontend stuff. Depending on your use case, you can find something suitable for you. Frameworks are an answer to developers’ needs that are often dictated by business needs. Those business needs are a response to what a user may need and how to make money fulfilling that. What also comes into play are the devices and the proportion of their usage. According to <a href="https://statcounter.com/" rel="nofollow">Statcounter.com</a>, the usage of mobile devices has eclipsed and surpassed the desktop:</p>
<img class="alignnone size-full wp-image-4175 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/desktopvsmobile.jpg" alt="desktopvsmobqle" width="2234" height="1164" />
<p>Even without a graph, based on daily observation, one prediction is easy: <a href="https://www.efigence.com/technology/future-technology-predictions-interfaces-move-towards-multimodal-and-subconscious/">the future is mobile</a>. Because of that, we will take a look at how to create a native app nowadays and how it may become even easier soon. But first… Let’s look at the hottest frameworks right now that try to meet our demands for creating a web application. Just for the record, here is the Google Trends filter used for <a href="https://trends.google.com/trends/explore?cat=422&amp;date=today%205-y&amp;q=react,angular,vue" rel="nofollow">this comparison:</a><br />
<img class="alignnone size-full wp-image-4349 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/google-trends.jpg" alt="google_trends" width="867" height="187" /><br />
<img class="alignnone size-full wp-image-4358 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/google_trends.jpg" alt="" width="1110" height="256" /><br />
As you can see, React took the biggest part of the cake overtaking Angular around May 18′. Vue JS was speeding up fast, but slowed down a bit last year. It has more stars on GitHub than the others though. Angular, although still strong, is falling further and further behind React. But what they offer us right now and what in the near future?</p>
<h2>Angular</h2>
<img class="alignnone wp-image-4199 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/angular.jpg" alt="angular" width="180" height="180" />
<p>The one that is the most complex, sophisticated and difficult-to-learn compared to the other two. However, it does provide a whole platform to develop an app with. No additional libraries are needed for things like routing or global state management. It is based on Typescript (a big advantage) and made by Google. Perfect for big enterprise projects.<br />
With Angular, the future looks bright and you can see it for yourself right now. In version 8.0 there is a new rendering engine available called Ivy and it can provide up to 40% less bundle size and that tackles the biggest Angular disadvantage. It will be integrated as default in Angular 9.0 but it is possible to switch it on in the current version. Ivy will provide faster build times and an open door to cool new features like higher order components and component lazy-loading.</p>
<h2>React</h2>
<img class="alignnone wp-image-4310 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/react-2-500x354-1.jpg" alt="react" width="200" height="141" />
<p>Made by Facebook, perhaps it does not provide as many tools as Angular (we need some libraries to achieve the same level of functionality). However it is faster, lighter and easier to learn. React uses virtual DOM for DOM manipulation (Angular doesn’t do that). It is well supported and reliable. It has to be. It is used by Instagram, WhatsApp and Netflix (among many others).<br />
2019 was a crucial year for React. The major changes were React Hooks, React.Lazy and Suspense. Some new, experimental features for the future are:</p>
<ul>
<li>Concurrent Mode, which will allow an app to adjust to the user’s device and network speed by making the rendering interruptible. React in Concurrent Mode will be able to interrupt an ongoing update to do something more important, and then come back to what it was doing earlier.</li>
<li>Suspense for Data Fetching – we will be able start the rendering before fetching data finishes. It will suspend rendered component and proceed to the following ones and then come back again to check if the data is ready.</li>
</ul>
<p>It is very possible that React will stay in first place in terms of popularity.</p>
<h2>Vue</h2>
<img class="alignnone size-full wp-image-4286 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/128px-Vue.js_Logo_2.png" alt="vue.js" width="128" height="111" />
<p>Have you heard anyone complaining about Vue.js? Well, I haven’t. It is the most convenient framework, for both learning and usage. Gaining popularity and love from the open source community since the very beginning, Vue is the new and better AngularJS. Doing things similarly, but better in every way. It is not a coincidence. The creator of Vue, Evan You, did actually work on AngularJS. Vue.js is maintained by him and his team. It is an exception among the previously mentioned frameworks. They are both backed by huge companies. Vue is not. This may be perceived as a drawback, but for many – it isn’t. What about the future? In 2020 the new version will be released – Vue 3.0. It will be completely rewritten, based on Typescript and even more lightweight with API for creating observables. That’s huge. After the release, the Vue based repo count will go nowhere but up. There are several major changes scheduled for each of the top frameworks. The developer teams are not taking it easy. Looking at the tendencies right now, it is also noticeable that Typescript is going to be implemented more and more vastly, allowing developers to appreciate better code maintenance and control. There is a real possibility that soon, more projects will be with, rather than without Typescript (I didn’t mention it, but you can use it with React too). Another thing worth noting here is the browser support. Internet Explorer 11 support declines over time. As an example – it is announced that Vue.JS 3.0 will support IE11 but in a separate build with the same reactivity limitations of Vue 2.X. It won’t be a surprise to see many statements about ditching IE11 support entirely in various websites/web apps/tools. And that’s a good thing for developers. Focusing on new features is always more productive.</p>
<h2>Svelte</h2>
<img class="alignnone wp-image-4280 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/svelte2-380x380-1.png" alt="svelte" width="200" height="200" />
<p>Well yes, I didn’t put it on the graph. My prediction is that I’d have to if I were writing this in 2021. Svelte is not that new, although since version 3 it has gained a lot of popularity. It is a framework that provides reactive components, but the approach is different. SvelteJS, which runs at build time, relocates all the work into a compile step having itself about 4KB gzipped. You can write 40% less code comparing to React and have faster, reactive components without virtual DOM. It’s perfect for small applications (not much other functionality), but definitely worth testing out and keeping track of in the near future.</p>
<h2>Mobile app development</h2>
<p>As I mentioned earlier, the future is mobile. At the beginning, there wasn’t much choice in mobile app development. For Android we had to use Java and Android Studio and for iOS there was Swift or objective C and Xcode. Now we have a plenty of options. We could, for example, develop a Progressive Web App (PWA). It will work instantly after the user adds it to the device’s home screen. With a single code base from a framework like React or Angular you can access native features through Service Workers. What’s interesting – PWA made by Twitter was used longer with more content viewed since it was made a default mobile web experience. When you need an extra lightweight app which could run everywhere, whose performance is not so heavy and uses only basic native features, then this is the perfect solution for you. If not, there are also…</p>
<h3>Hybrid Apps</h3>
<p>Having the same, or sharing most of the code base, hybrid app frameworks are today’s answer to the question of how to develop an app for both Android and iOS. The answer is different depending on the approach. And there are quite a few approaches. Below, you can see some of the most popular:</p>
<h2>Ionic</h2>
<img class="alignnone size-full wp-image-4289 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/200px-Ionic_Logo.png" alt="iconic" width="200" height="67" />
<p>It was the first hybrid framework. Technology-wise it is quite close to PWAs because your app will be based on HTML/CSS/JS. The idea is quite simple – Ionic just wraps a web app made with Angular inside a native app giving it access to native features. It is not the best approach if we look at performance but quite fast nevertheless. The new version 4.0 will bring some key features like:</p>
<ul>
<li>transition to being a universal framework for the web, iOS, Android and desktop</li>
<li>web components</li>
<li>React and VueJS support</li>
<li>performance improvements and a single code base for PWAs/apps/web apps/desktop thanks to transitioning from Cordova to Capacitor (cross-platform app runtimes)</li>
</ul>
<p>Some predictions were made that Ionic will soon be redundant. Well, after this newest release, I don’t think so.</p>
<h2>Flutter</h2>
<p><img class="alignnone wp-image-4292 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/flutter-logo.png" alt="flutter" width="200" height="100" /><br />
The freshest one here, Flutter is relatively new and growing rapidly. Its setbacks are the Dart language Flutter is based on (you’ll have to learn it) and well… being new. These are relatively minor when set against big Google support (they are the authors) and functionality that allows developers to use lots of native widgets and pre-made components. More focused on Android at first, iOS support is catching up. Moreover, the Dart language will look very familiar to somebody who already knows JavaScript. It compiles to the native code of the chosen device. Also, contrary to <a href="https://www.efigence.com/services/react-native/">React Native</a>, all device functionalities are accessible via Flutter core plugins, not by community-made third party ones. Flutter looks very promising for the future and is a very interesting choice now. Especially considering the growing community and planned support for other platforms, like the web, macOS and Fuchsia.</p>
<h2>React Native</h2>
<img class="alignnone wp-image-4301 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/react-12.55.10-500x261-1.jpg" alt="react" width="200" height="105" />
<p>This Facebook version of React offers many pre-build components to create your native app with. Then, the React Native toolchain will compile an app from them as a result. The ease of use contrasts here with some stuck moments that you may encounter using React Native. In some cases you’ll face the necessity of making some workarounds. Thankfully, you can turn to the community with a issues that you encounter – most often, there lies a solution. Many third-party packages are available, though not all of them can be compatible with the newest version of React Native or Android or iOS itself. Being aware of the situation will spare you some headaches. Fortunately, the React Native team and the community work hard to make developers lives easier. In 2019 many updates were released. The newest one, React Native Doctor is a tool made by the community to help with troubleshooting and fixing errors with the development environment. It even gives you links to what you’re missing. In 2020 React Native will be enriched by a new renderer (named Fabric) and the architecture is going to be rebuilt. It will be possible for JavaScript to affect the Native state synchronously (previously it was async). That will fix some issues and give developers more control over changes inside the app.</p>
<h2>NativeScript</h2>
<img class="alignnone wp-image-4304 resetimage" src="https://www.efigence.com/wp-content/uploads/2023/09/NativeScript_logo-150x150-1.png" alt="native_script" width="150" height="150" />
<p>NativeScript is something similar to React Native. In this open-source framework, you can have native components markup alongside JavaScript. It is possible to use NativeScript with Angular, VueJS and plain JS. It also allows you to work with the latest native APIs. You won’t have to wait for plugins to begin support for a new feature. <a href="https://www.efigence.com/services/nativescript/">NativeScript apps</a> can run on native devices directly. There’s no browser interaction or cross-compiling required. NS aims for a ratio of 90% common code between the iOS and Android platforms and the output result is a fully native app. Alongside core modules, you also have over 700 plugins to choose from. Some disadvantages of this framework? Well, the app size is bigger and performance slower than the previously mentioned React Native. The roadmap for the future presents us an ambitious approach from the NativeScript team. Their plan is to extend NS functionality to Android Auto and iOS CarPlay. Support of desktop apps is also planned and the longest shots consist of providing AR/VR app building blocks, wearables support and more.</p>
<p><strong>Read also: </strong><a href="https://www.efigence.com/software-development/classic-headless-or-hybrid-cms-maybe-all-of-them-together/">Classic, headless or hybrid CMS? Maybe all of them together?</a></p>
<h2>The future</h2>
<p>The future looks quite optimistic. Since ECMAScript 2015 (and even earlier) many tools were presented to the frontend world. Communities and companies are not stopping in pursuit of delivering solutions that meet developers’ needs. The most popular frameworks are being improved constantly. Some of them are on the verge of crucial changes during 2020, which will make them even more useful. There is a noticeable trend to create an application for many platforms with as much common codebase as possible. The “cross-platform” term will not only apply to the iOS/Android, but to web, desktop, wearable devices and more.</p>
<h3>The future is… fluid?</h3>
<p>Or full of freedom. Yes, I’m using some odd words here, but I’m not trying to sell you any stuff. These words match quite well to a bigger picture that I would like to present. Future frontend development will be more fluid because of versatility and a wide range of options. Being fluid, if it comes to being platform independent, having responsive design (from a watch to a monitor), great performance or even being language independent. JavaScript still will be there, but more often compiled from TypeScript, although… there is also WebAssembly, which can be output from a compilation from a low-level source language like C/C++. Heavy performing JavaScript applications are able to use WebAssembly functions and benefit from that. What it could offer the framework world is a new level of performance. On top of that, there are Web Workers, which introduce the potential of multi-threading to JavaScript without aid from WebAssembly.</p>
<p>Having all of this while devices become more powerful over time gives us (among other perks) virtual or augumented reality that becomes more interesting and popular than today or performance-demanding games for the web. I don’t know about you, but all those new (and improved existing) possibilities leave me quite excited about the future. And what could be more exciting than that? Well… taking a part, smaller or bigger, in building it together of course.</p>
</div>
</div>
</div>
</section>
            </div>
        </div>
    </section>

<p>The post <a href="https://www.efigence.com/software-development/the-future-of-frontend-frameworks/">The Future Of Frontend Frameworks</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Using JCR</title>
		<link>https://www.efigence.com/software-development/using-jcr/</link>
		
		<dc:creator><![CDATA[Aleksandra Bartosiak]]></dc:creator>
		<pubDate>Wed, 11 Dec 2019 10:58:40 +0000</pubDate>
				<category><![CDATA[Mobile App]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[DXP]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.efigence.com/using-jcr/</guid>

					<description><![CDATA[<p>The post <a href="https://www.efigence.com/software-development/using-jcr/">Using JCR</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></description>
										<content:encoded><![CDATA[
    <section id="wysiwyg_60" class="layout wysiwyg" data-block-theme="light" data-top="medium" data-bottom="medium">
        <div class="row" data-view="1">
            <div class="columns small-12">
                <section id="content_block-0" class="layout content_block" data-pt="large" data-pb="small" data-background="white" data-order="0">
<div class="row align-left seen" data-view="0">
<div class="small-12 columns text-left">
<div class="sub-content">
<h2 class="seen" data-view="0">A Content Repository API for Java (JCR) is a specification form Java application programming interface (API) to access content repositories. Data in JCR is kept in a tree of nodes with a hierarchical structure.</h2>
</div>
</div>
</div>
</section>
<section id="wysiwyg_block-1" class="layout wysiwyg_block" data-pt="small" data-pb="large" data-background="white" data-order="1">
<div class="row align-left in-view seen" data-view="0">
<div class="small-12 columns">
<div class="block">
<p>One of the open source implementations available is Apache Jackrabbit. This implementation is used by multiple Content Management Systems (CMS) like Magnolia, Jahia or Hippo CMS.</p>
<h2><b>Apache Jackrabbit</b></h2>
<p>Apache Jackrabbit is used in multiple CMS, so understanding its flow of data will be helpful in understanding its usage in other systems. The following information and more can be found on this page:<span class="Apple-converted-space">  </span><a href="https://jackrabbit.apache.org/jcr/first-hops.html" rel="nofollow">https://jackrabbit.apache.org/jcr/first-hops.html</a></p>
<h2><b>Dictionary</b></h2>
<p>In Apache JackRabbit there are some key words that are worth knowing:</p>
<ul>
<li>Repository – an area prepared by JackRabbit where data is stored with a set of operations to access\modify it</li>
<li>Node – a single unit of a JCR tree stored in a repository can have multiple subnodes (child nodes) and properties</li>
<li>Root node – a node without a parent</li>
<li>Property – stored parameters of a node</li>
<li>Workspace – an area in a repository, helpful when there is need to separate nodes structures from each other</li>
<li>Session – a session opened in a chosen repository and workspace after login. Depending on the login, permissions may differ e.g. an anonymous user cannot save a new node.</li>
</ul>
<h2><b>Installation</b></h2>
<p>One of the easiest ways to install is by adding a few dependencies to a pom file using the Apache Maven management tool.</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">dependencies</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">!&#8211; The JCR API &#8212;</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">dependency</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">groupId</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text">javax.</span><span class="enlighter-m3">jcr</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/groupId</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">artifactId</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text">jcr</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/artifactId</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">version</span><span class="enlighter-g1">&gt;</span><span class="enlighter-n0">2.0</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/version</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/dependency</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">!&#8211; Jackrabbit content repository &#8212;</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">dependency</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">groupId</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text">org.</span><span class="enlighter-m3">apache</span><span class="enlighter-text">.</span><span class="enlighter-m3">jackrabbit</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/groupId</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">artifactId</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text">jackrabbit-core</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/artifactId</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">version</span><span class="enlighter-g1">&gt;</span><span class="enlighter-n0">2.12</span><span class="enlighter-text">.</span><span class="enlighter-m3">1</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/version</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/dependency</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/dependencies</span><span class="enlighter-g1">&gt;</span></div>
</div>
</div>
</div>
</div>
<p>Adding both dependencies allows the use of JCR functionalities with a basic configuration. It’s enough for basic usage.</p>
<h2><b>Usage</b></h2>
<p>Usage of JCR is mainly focused on two goals – searching data and modifying nodes. There are examples of practical uses of Apache JackRabbit on the following page:</p>
<p><a href="https://jackrabbit.apache.org/jcr/first-hops.html" rel="nofollow">https://jackrabbit.apache.org/jcr/first-hops.html</a></p>
<p>So as to not copy the whole tutorial, only the key points will be mentioned in following paragraphs.</p>
<h2><b>Login/logout</b></h2>
<p>To gain access to operations on nodes the user needs to be logged in and a session needs to be created. It is possible to log in in the repository for example.:</p>
<p>As an anonymous user to the default workspace:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">Session session = repository.</span><span class="enlighter-m3">login</span><span class="enlighter-g1">(</span><span class="enlighter-k1">new</span> <span class="enlighter-m0">GuestCredentials</span><span class="enlighter-g1">())</span><span class="enlighter-text">;</span></div>
</div>
</div>
</div>
</div>
<p>As default admin user to the customWorkspace workspace:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">Session session = repository.</span><span class="enlighter-m3">login</span><span class="enlighter-g1">(</span><span class="enlighter-k1">new</span> <span class="enlighter-m0">SimpleCredentials</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;admin&#8221;</span><span class="enlighter-text">, </span><span class="enlighter-s0">&#8220;admin&#8221;</span><span class="enlighter-text">.</span><span class="enlighter-m1">toCharArray</span><span class="enlighter-g1">())</span><span class="enlighter-text">, </span><span class="enlighter-s0">&#8220;customWorkspace&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
</div>
</div>
</div>
<p>The repository can be created on the spot by using the static method JcrUtils.getRepository(), but using JNDI or configuration to create it is better practice.</p>
<p>After finishing, the work session should be closed by:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">session.</span><span class="enlighter-m3">logout</span><span class="enlighter-g1">()</span></div>
</div>
</div>
</div>
</div>
<h2><b>Searching data</b></h2>
<p>The session allows the user to get the required nodes from the workspace. There are multiple ways of doing that, but most common are through subnodes/parents, by path and by query.</p>
<p>The first one is used by obtaining a parent node or subnodes of a given node and using them.</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">Node parent = givenNode.</span><span class="enlighter-m3">getParent</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">NodeIterator subNodes = givenNode.</span><span class="enlighter-m3">getNodes</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
</div>
</div>
</div>
<p>The second one is simply by using the getNode method from a node already found, eg:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">Node rootNode = session.</span><span class="enlighter-m3">getRootNode</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">Node searchedNode = rootNode.</span><span class="enlighter-m3">getNode</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;node1/subNode/searchedNode&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
</div>
</div>
</div>
<p>The last one is more complex, by using a query:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">String query = „select </span><span class="enlighter-g0">*</span><span class="enlighter-text"> from </span><span class="enlighter-g1">[</span><span class="enlighter-text">primitive_type</span><span class="enlighter-g1">]</span><span class="enlighter-text">”; QueryResult qr = session.</span><span class="enlighter-m3">getWorkspace</span><span class="enlighter-g1">()</span><span class="enlighter-text">.</span><span class="enlighter-m3">getQueryManager</span><span class="enlighter-g1">()</span><span class="enlighter-text"> .</span><span class="enlighter-m1">createQuery</span><span class="enlighter-g1">(</span><span class="enlighter-text">query, </span><span class="enlighter-s0">&#8220;JCR-SQL2&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">.</span><span class="enlighter-m3">execute</span><span class="enlighter-g1">()</span><span class="enlighter-text">; NodeIterator searchedNodes = qr.</span><span class="enlighter-m3">getNodes</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
</div>
</div>
</div>
<p>Firstly it’s necessary to get queryManager from the workspace, to create the query and then execute it.</p>
<p>The default language used is JCR-SQL2. It allows the creation of complex queries like adding conditions. The result of the query is returned in the form of an iterator.</p>
<p>After obtaining the required node, the easiest way to get its properties is by using the getProperty() method. It enables retrieval of an instance of property class. Getting the value is done by using a specific method like getString()</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">Property propertyInstance = rootNode.</span><span class="enlighter-m3">getProperty</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;propertyName&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">String propertyValue = propertyInstance.</span><span class="enlighter-m3">getString</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
</div>
</div>
</div>
<p><strong>Read also:</strong> <a href="https://www.efigence.com/software-development/benefits-of-immutability-in-software-development/">Benefits of immutability in a software development</a></p>
<h2><b>Changing nodes</b></h2>
<p>A session is needed to operate on nodes, but to modify them there is an additional need for permission. Methods are quite intuitive like:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">node.</span><span class="enlighter-m3">addNode</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;nodeName&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">node.</span><span class="enlighter-m3">remove</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">node.</span><span class="enlighter-m3">setProperty</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;propertyName&#8221;</span><span class="enlighter-text">, </span><span class="enlighter-s0">&#8220;propertyValue&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">node.</span><span class="enlighter-m3">setProperty</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;propertyName&#8221;</span><span class="enlighter-text">, </span><span class="enlighter-g1">(</span><span class="enlighter-text">Value</span><span class="enlighter-g1">)</span><span class="enlighter-k1">null</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">node.</span><span class="enlighter-m3">getProperty</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;propertyName&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">.</span><span class="enlighter-m3">remove</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
</div>
</div>
</div>
<p>The last two are to remove the property from the node. That can be trickier.</p>
<p>The most important part of editing the JCR tree is saving modifications made in session. It is done by using</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">session.</span><span class="enlighter-m3">save</span><span class="enlighter-g1">()</span></div>
</div>
</div>
</div>
</div>
<p>Without that, the method status of the JCR tree will not change.</p>
<h2><b>JCR in Magnolia</b></h2>
<p>A good example of a Content Management System using the JCR mechanism is Magnolia CMS. It is a system which allows users to easily configure the frontend and <a href="https://www.efigence.com/services/backend-development/">backend</a> part of an application. JCR nodes are skillfully used to keep both configuration and content readable for developers and non-technical users, making it easy to develop.</p>
<p>Magnolia keeps the JCR Session inside a Magnolia context (MgnlContext class), hides the login/logout mechanism from direct access and hides pure Apache JackRabbit methods in a prepared set of classes for easier use. It is possible to avoid using them, but it is worth knowing about them.</p>
<h2><b>Prepared classes</b></h2>
<p>Most of the functions in Apache JackRabbit used to obtain information from the node tree use RepositoryException. To avoid<span class="Apple-converted-space">  </span>handling in Magnolia (info.magnolia.magnolia-core:6.0) there is set of classes with methods which take care of it.</p>
<p>They are named with the JCR object name and the Util part, such as:</p>
<ul>
<li>NodeUtil</li>
<li>PropertyUtil</li>
<li>SessionUtil</li>
</ul>
<p>What’s more, these classes give the user additional, sometimes more complex, functionalities e.g., NodeUtil with the method getSiblingsBefore allows the extraction of sibling nodes that are before the chosen node in the iterator of all siblings.</p>
<h2><b>Queries</b></h2>
<p>In a situation when there is a need to find a node of a specific type and there is no node given with a link to that node, like parent-child, there is the possibility of searching via query. In Magnolia there is already a prepared class QueryUtil which facilitates the finding of required nodes by multiple search method implementation. In the most basic one only the workspace name and query statement are necessary to get nodes in the form of an iterator. The default query language is JCR-SQL2.</p>
<h2><b>Testing</b></h2>
<p>In Magnolia there is a prepared set of classes that <a href="https://www.efigence.com/technology/software-qa-tests/">helps testing</a>. It is possible to add them by using a dependency:</p>
<div>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">dependency</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">groupId</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text">info.</span><span class="enlighter-m3">magnolia</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/groupId</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">artifactId</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text">magnolia-core</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/artifactId</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">version</span><span class="enlighter-g1">&gt;{</span><span class="enlighter-text">Version</span><span class="enlighter-g1">}&lt;</span><span class="enlighter-text">/version</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">type</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text">test-jar</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/type</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">scope</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text">test</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/scope</span><span class="enlighter-g1">&gt;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">&lt;</span><span class="enlighter-text">/dependency</span><span class="enlighter-g1">&gt;</span></div>
</div>
</div>
</div>
</div>
</div>
<p>They help to focus on creating only objects needed for the test and disregarding context, users etc. They are named with a Mock part and JCR name such as:</p>
<ul>
<li>MockNode</li>
<li>MockProperty</li>
<li>MockSession</li>
<li>MockWorkspace</li>
<li>MockQuery</li>
</ul>
<p>An example test method:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">@Test</span></div>
</div>
<div class="">
<div><span class="enlighter-text">public </span><span class="enlighter-k1">void</span> <span class="enlighter-m0">should_get_type</span><span class="enlighter-g1">()</span> <span class="enlighter-g1">{</span></div>
</div>
<div class="">
<div><span class="enlighter-c0">//given</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> MockNode node = </span><span class="enlighter-k1">new</span> <span class="enlighter-m0">MockNode</span><span class="enlighter-g1">(</span><span class="enlighter-text">name, </span><span class="enlighter-s0">&#8220;pageType&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> TestedClass testedClass = </span><span class="enlighter-k1">new</span> <span class="enlighter-m0">TestedClass</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-c0">//when</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> String type = testedClass.</span><span class="enlighter-m3">getType</span><span class="enlighter-g1">(</span><span class="enlighter-text">node</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-c0">//then</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> Assertions.</span><span class="enlighter-m3">assertEquals</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;pageType&#8221;</span><span class="enlighter-text">, s</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">}</span></div>
</div>
</div>
</div>
</div>
<p>Moreover, there are classes to help quickly create a JCR structure like the method createSubnodes of the NodeTestUtill class which allows the loading of structure from file. An example of usage:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">MockNode page = </span><span class="enlighter-k1">new</span> <span class="enlighter-m0">MockNode</span><span class="enlighter-g1">(</span><span class="enlighter-text">name, </span><span class="enlighter-s0">&#8220;mgnl:page&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">NodeTestUtil.</span><span class="enlighter-m3">createSubnodes</span><span class="enlighter-g1">(</span><span class="enlighter-text">page, </span><span class="enlighter-m0">getClass</span><span class="enlighter-g1">()</span><span class="enlighter-text">.</span><span class="enlighter-m3">getResourceAsStream</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;/model/page.properties&#8221;</span><span class="enlighter-g1">))</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-k1">return</span><span class="enlighter-text"> page;</span></div>
</div>
</div>
</div>
</div>
<p>with page.properties:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">/form.@type = mgnl:area</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n0">0.</span><span class="enlighter-text">@type = mgnl:component</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n0">0.</span><span class="enlighter-m3">mgnl</span><span class="enlighter-text">\:template = customTemplate</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n1">0</span><span class="enlighter-text">/processors.@type = mgnl:contentNode</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n1">0</span><span class="enlighter-text">/processors/</span><span class="enlighter-n0">0.</span><span class="enlighter-text">@type = mgnl:component</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n1">0</span><span class="enlighter-text">/processors/</span><span class="enlighter-n0">0.</span><span class="enlighter-m3">processorType</span><span class="enlighter-text"> = processor1</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n1">0</span><span class="enlighter-text">/fieldsets.@type = mgnl:area</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n1">0</span><span class="enlighter-text">/fieldsets/</span><span class="enlighter-n0">0.</span><span class="enlighter-text">@type = mgnl:component</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n1">0</span><span class="enlighter-text">/fieldsets/</span><span class="enlighter-n1">0</span><span class="enlighter-text">/fields.@type = mgnl:area</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n1">0</span><span class="enlighter-text">/fieldsets/</span><span class="enlighter-n0">1.</span><span class="enlighter-text">@type = mgnl:component</span></div>
</div>
<div class="">
<div><span class="enlighter-text">/form/</span><span class="enlighter-n1">0</span><span class="enlighter-text">/fieldsets/</span><span class="enlighter-n1">1</span><span class="enlighter-text">/fields.@type = mgnl:area</span></div>
</div>
</div>
</div>
</div>
<p>More information about testing can be found in documentation on the following page: <a href="https://academy.magnolia-cms.com/display/DEV/Unit+tests" target="_blank" rel="noopener noreferrer nofollow">https://academy.magnolia-cms.com/display/DEV/Unit+tests</a></p>
</div>
</div>
</div>
</section>
            </div>
        </div>
    </section>



<div id="simple-translate" class="simple-translate-system-theme">
<div>
<div class="simple-translate-button isShow" style="background-image: url('chrome-extension://cllnohpbfenopiakdcjmjcbaeapmkcdl/icons/512.png'); height: 22px; width: 22px; top: 40px; left: 364px;"></div>
<div class="simple-translate-panel " style="width: 300px; height: 200px; top: 0px; left: 0px; font-size: 13px;">
<div class="simple-translate-result-wrapper" style="overflow: hidden;">
<div class="simple-translate-move" draggable="true"></div>
<div class="simple-translate-result-contents">
<p class="simple-translate-candidate" dir="auto">
</div>
</div>
</div>
</div>
</div><p>The post <a href="https://www.efigence.com/software-development/using-jcr/">Using JCR</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Benefits of Immutability in a Software Development</title>
		<link>https://www.efigence.com/software-development/benefits-of-immutability-in-software-development/</link>
		
		<dc:creator><![CDATA[Aleksandra Bartosiak]]></dc:creator>
		<pubDate>Tue, 15 Jan 2019 11:14:33 +0000</pubDate>
				<category><![CDATA[Frontend]]></category>
		<category><![CDATA[Mobile App]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">https://www.efigence.com/benefits-of-immutability-in-software-development/</guid>

					<description><![CDATA[<p>The post <a href="https://www.efigence.com/software-development/benefits-of-immutability-in-software-development/">Benefits of Immutability in a Software Development</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></description>
										<content:encoded><![CDATA[
    <section id="wysiwyg_33" class="layout wysiwyg" data-block-theme="light" data-top="medium" data-bottom="medium">
        <div class="row" data-view="1">
            <div class="columns small-12">
                <section id="content_block-0" class="layout content_block" data-pt="large" data-pb="small" data-background="white" data-order="0">
<div class="row align-left seen" data-view="0">
<div class="small-12 columns text-left">
<div class="sub-content">
<h2 class="seen" data-view="0">The idea of immutability is widely spread. However, I think it is quite rarely used in real programming among Java developers. In this article, I’m going to explain the benefits of immutable objects.</h2>
</div>
</div>
</div>
</section>
<section id="wysiwyg_block-1" class="layout wysiwyg_block" data-pt="small" data-pb="large" data-background="white" data-order="1">
<div class="row align-left seen in-view" data-view="0">
<div class="small-12 columns">
<div class="block">
<p>The first advantage of immutability is avoiding side effects. Let’s take a look at an example:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">public static double </span><span class="enlighter-m0">average</span><span class="enlighter-g1">(</span><span class="enlighter-text">Collection</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">Double</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text"> numbers</span><span class="enlighter-g1">)</span></div>
</div>
</div>
</div>
</div>
<p>When we look at the signature of the method, it seems that everything is OK. The method takes a collection of doubles and returns an average. However, nothing prevents a developer from implementing the method in this way:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">public static double </span><span class="enlighter-m0">average</span><span class="enlighter-g1">(</span><span class="enlighter-text">Collection</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">Double</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text"> numbers</span><span class="enlighter-g1">)</span> <span class="enlighter-g1">{</span></div>
</div>
<div class="">
<div><span class="enlighter-k1">if</span> <span class="enlighter-g1">(</span><span class="enlighter-text">numbers == </span><span class="enlighter-k1">null</span> <span class="enlighter-g0">||</span><span class="enlighter-text"> numbers.</span><span class="enlighter-m3">isEmpty</span><span class="enlighter-g1">())</span> <span class="enlighter-g1">{</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> throw </span><span class="enlighter-k1">new</span> <span class="enlighter-m0">IllegalArgumentException</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">}</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> double average = numbers.</span><span class="enlighter-m3">stream</span><span class="enlighter-g1">()</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> .</span><span class="enlighter-m1">mapToDouble</span><span class="enlighter-g1">(</span><span class="enlighter-text">Double::doubleValue</span><span class="enlighter-g1">)</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> .</span><span class="enlighter-m1">average</span><span class="enlighter-g1">()</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> .</span><span class="enlighter-m1">getAsDouble</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> numbers.</span><span class="enlighter-m3">clear</span><span class="enlighter-g1">()</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-k1">return</span><span class="enlighter-text"> average;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">}</span></div>
</div>
</div>
</div>
</div>
<p>Therefore, this method is not a pure function. It doesn’t have a boundary between arguments and the result, because an argument is changed as well. In order to ensure nothing like that will happen we should pass an immutable collection.</p>
<p>Another reason why immutability is great is connected with different collections. Let’s assume that we have a Point class:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">@Data</span></div>
</div>
<div class="">
<div><span class="enlighter-text">@AllArgsConstructor</span></div>
</div>
<div class="">
<div><span class="enlighter-text">public </span><span class="enlighter-k1">class</span><span class="enlighter-text"> Point </span><span class="enlighter-g1">{</span></div>
</div>
<div class="">
<div><span class="enlighter-text"> private int x,y;</span></div>
</div>
<div class="">
<div><span class="enlighter-g1">}</span></div>
</div>
</div>
</div>
</div>
<p>What will happen if we put an instance of the Point class into HashMap and later on we change the value of x or y? Let’s check:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">Map</span><span class="enlighter-g1">&lt;</span><span class="enlighter-text">Point, String</span><span class="enlighter-g1">&gt;</span><span class="enlighter-text"> pointLabelMap = </span><span class="enlighter-k1">new</span><span class="enlighter-text"> HashMap</span><span class="enlighter-g1">&lt;&gt;()</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">Point point = </span><span class="enlighter-k1">new</span> <span class="enlighter-m0">Point</span><span class="enlighter-g1">(</span><span class="enlighter-n1">3</span><span class="enlighter-text">, </span><span class="enlighter-n1">4</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">pointLabelMap.</span><span class="enlighter-m3">put</span><span class="enlighter-g1">(</span><span class="enlighter-text">point, </span><span class="enlighter-s0">&#8220;Mutable point&#8221;</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">System.</span><span class="enlighter-m3">out</span><span class="enlighter-text">.</span><span class="enlighter-m3">println</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;Label: &#8220;</span><span class="enlighter-text"> + pointLabelMap.</span><span class="enlighter-m3">get</span><span class="enlighter-g1">(</span><span class="enlighter-text">point</span><span class="enlighter-g1">))</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">point.</span><span class="enlighter-m3">setX</span><span class="enlighter-g1">(</span><span class="enlighter-n1">0</span><span class="enlighter-g1">)</span><span class="enlighter-text">;</span></div>
</div>
<div class="">
<div><span class="enlighter-text">System.</span><span class="enlighter-m3">out</span><span class="enlighter-text">.</span><span class="enlighter-m3">println</span><span class="enlighter-g1">(</span><span class="enlighter-s0">&#8220;Label: &#8220;</span><span class="enlighter-text"> + pointLabelMap.</span><span class="enlighter-m3">get</span><span class="enlighter-g1">(</span><span class="enlighter-text">point</span><span class="enlighter-g1">))</span><span class="enlighter-text">;</span></div>
</div>
</div>
</div>
</div>
<p>And this is the result:</p>
<div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-l-generic enlighter-hover enlighter-linenumbers ">
<div class="enlighter-code">
<div class="enlighter">
<div class="">
<div><span class="enlighter-text">Label: Mutable point</span></div>
</div>
<div class="">
<div><span class="enlighter-text">Label: </span><span class="enlighter-k1">null</span></div>
</div>
</div>
</div>
</div>
<p>After the point instance had been changed, the hashcode of that object was different, therefore it couldn’t be found in HashMap (a bucket not found). Similar side effects can be observed when it comes to using tree-based structures like TreeMap. Once an object was put in a structure. The order of objects is not changed if the object was modified. Because of that, it is highly recommended to use an immutable object as a key in map structures.</p>
<p><strong>Read also: </strong><a href="https://www.efigence.com/software-development/java-vs-javascript-whats-the-difference/">What is the distinction between Java and JavaScript?</a></p>
<p>Another gain from immutability is the fact that we don’t need any more defensive copies. I’m pretty sure that a lot of programmers who remember java.util.Calendar and java.util.Date remember how they had to make a lot of copies of those objects. For instance, let’s assume that we need to create a DTO class which represents delivery data. And we have a field which tells us when we, a client, should expect items to be delivered. Usage of java.util.Date calendar will force us to create a defensive copy of the date. It’s because it can be used later on in some other computations.</p>
<p>Many people will say that creating immutable objects will lead to a garbage collector overhead. However, this is not true at all. The first reason is that we don’t need defensive copies. As I pointed out before. And it is much easier to delete an object from a heap than an old one.  When we create a new object, which has almost all references as an old object and one or a few new references to new objects, it is better than having an older object which has references to new objects. We are also able to use an object pool and flyweight pattern to manage those value objects. We all know a very good example: String class.</p>
<p>The last benefit I would like to describe is thread-safety – objects which are immutable are perfectly thread-safe. There are no race conditions on the mutating state of the object, and the final keyword ensures visibility for other threads.</p>
<p>Of course, there are areas where immutability is not the best option. The first of them is GUI – where mutation of a state and a graphical interface go naturally together. Sometimes we also need mutable objects when we use concurrency. For instance, the BlockingQueue class should be mutable in order to work correctly. Mutable data structures are often very useful when we need high performance. There are more situations when mutability is better than <a href="https://www.efigence.com/software-development/why-is-immutability-so-important-in-react/">immutability</a>. However, I still believe that immutability is great when it comes to proceeding data e.g. in business applications.</p>
<p>I hope I’ve persuaded you to change your way of thinking about using immutability and to take full advantage of its the benefits.</p>
</div>
</div>
</div>
</section>
            </div>
        </div>
    </section>

<p>The post <a href="https://www.efigence.com/software-development/benefits-of-immutability-in-software-development/">Benefits of Immutability in a Software Development</a> appeared first on <a href="https://www.efigence.com">Efigence</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
