<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Progress</title>
    <description>The latest articles on DEV Community by Progress (@progress).</description>
    <link>https://dev.to/progress</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F343%2F96cfc21b-dcf9-48c9-834d-2e6f69e6d94f.png</url>
      <title>DEV Community: Progress</title>
      <link>https://dev.to/progress</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/progress"/>
    <language>en</language>
    <item>
      <title>Testing the new Twitter API v2</title>
      <dc:creator>Jonathan Pereira</dc:creator>
      <pubDate>Fri, 21 Aug 2020 16:13:20 +0000</pubDate>
      <link>https://dev.to/progress/testing-the-new-twitter-api-v2-j27</link>
      <guid>https://dev.to/progress/testing-the-new-twitter-api-v2-j27</guid>
      <description>&lt;p&gt;For developers building apps with social interactions, the Twitter API has been one of the most used API. While it was beneficial, it had its limitations. But not for long. Twitter just &lt;a href="https://bit.ly/3iUtDjc" rel="noopener noreferrer"&gt;released the new version of the Twitter API&lt;/a&gt;, which has so much to offer. &lt;/p&gt;

&lt;h2&gt;
  
  
  What's new in Twitter API v2
&lt;/h2&gt;

&lt;p&gt;Twitter seems to have finally answered the prayers of millions of developers using the Twitter API. The new API makes it simpler to listen and analyze the active conversations on the social platform. Twitter has introduced a couple of exciting things, including new endpoints, new tweet payload, conversation identifiers, and even annotations. &lt;/p&gt;

&lt;p&gt;Having heard so much about it, we decided to take the Twitter API v2 for a spin. Luckily for us, Fiddler Everywhere can quickly test and debug APIs. SO we decided to test the Twitter API v2 on Fiddler Everywhere. &lt;/p&gt;

&lt;h2&gt;
  
  
  Fiddler Everywhere to the rescue
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcy5452kixb5l8e5ey7j9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcy5452kixb5l8e5ey7j9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
For those who haven't used &lt;a href="https://bit.ly/3j58H90" rel="noopener noreferrer"&gt;Fiddler Everywhere&lt;/a&gt; before, it can capture and inspect network requests, including API calls. It also allows you to modify the request parameters to customize the response as required. &lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Twitter API v2
&lt;/h2&gt;

&lt;p&gt;In this blog, we are going to test some of the endpoints of the new Twitter API v2 and see how it works. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1jpjk1i8xav7fh1i4kmr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1jpjk1i8xav7fh1i4kmr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Before getting started, make sure that you create a new app using the &lt;a href="https://developer.twitter.com/en" rel="noopener noreferrer"&gt;Twitter Developer Portal&lt;/a&gt; and generate the Bearer Token to authenticate the request in Fiddler Everywhere. &lt;/p&gt;

&lt;h3&gt;
  
  
  Users lookup
&lt;/h3&gt;

&lt;p&gt;The Twitter API v2 makes it simple to get publicly available user information using the &lt;code&gt;users&lt;/code&gt; endpoint. &lt;/p&gt;

&lt;p&gt;Endpoint URL: &lt;code&gt;https://api.twitter.com/2/users&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can do the following using this endpoint:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/users&lt;/code&gt; – Query multiple IDs to retrieve user information&lt;br&gt;
&lt;code&gt;/users/:id&lt;/code&gt; – Query the user ID to fetch information about a specific user&lt;br&gt;
&lt;code&gt;/users/by&lt;/code&gt; – Query the username to fetch user information&lt;/p&gt;

&lt;p&gt;For this example, we'll use the &lt;code&gt;/users/by&lt;/code&gt; endpoint. &lt;/p&gt;

&lt;p&gt;We open the Composer in Fiddler Everywhere and enter the endpoint in the request bar and set the method to GET. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F72u88u0lkwusxxfb48x3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F72u88u0lkwusxxfb48x3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
We need to provide authentication and query parameters. Under the Headers tab, add a new key-value pair called &lt;code&gt;authorization&lt;/code&gt; and the Bearer Token as the value. &lt;/p&gt;

&lt;p&gt;In the Params tab, add a key-value pair called &lt;code&gt;usernames&lt;/code&gt;. You can enter the username or multiple usernames separated by commas in the value field. &lt;/p&gt;

&lt;p&gt;Click the Execute button to see the API in action. &lt;/p&gt;

&lt;p&gt;If everything were excellent, in the Response section below, you would see the entire response in the JSON tab. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcymkngs7qq3f40df5669.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcymkngs7qq3f40df5669.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can modify the response as per your requirement by specifying the &lt;code&gt;user.fields&lt;/code&gt; parameters. &lt;/p&gt;

&lt;p&gt;I'm going to request the following fields:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Name of the user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Username on Twitter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Website URL mentioned in the profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;profile_image_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URL of the user's profile image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pinned_tweet_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tweet ID of users pinned tweet, if any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;verified&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean response indicating whether or not Twitter has verified the user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;created_at&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Date and time of account creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;public_metrics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;number of tweets, followers, following, and lists of the user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Place mentioned in the user account&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Once you hit execute, you'll notice the detailed information requested in the JSON tab of the response section. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh2nqf2dl32ug1wdubp5d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh2nqf2dl32ug1wdubp5d.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tweets lookup
&lt;/h3&gt;

&lt;p&gt;Using the &lt;code&gt;tweets&lt;/code&gt; endpoint, we can fetch tweets and information about them using the tweet ID. &lt;/p&gt;

&lt;p&gt;Endpoint URL: &lt;code&gt;https://api.twitter.com/2/tweets&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We'll open a new request tab in Fiddler Everywhere, enter this API endpoint in the request bar, and set the GET method. &lt;/p&gt;

&lt;p&gt;Again, we need to provide authentication and query parameters. You can use the same Bearer Token used in the previous request. &lt;/p&gt;

&lt;p&gt;In the Params tab, add a key-value pair called &lt;code&gt;ids&lt;/code&gt;. You can enter a tweet ID or multiple tweet IDs separated by commas in the value field. &lt;/p&gt;

&lt;p&gt;Click the Execute button to make a call to the API. &lt;/p&gt;

&lt;p&gt;You can view the tweets fetched in the JSON tab of the Response section. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsxb63pay47826jkmqpuo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsxb63pay47826jkmqpuo.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can add additional query parameters to get the required information. I'm going to add the following parameters:&lt;br&gt;
&lt;code&gt;expansions&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attachments.media_keys&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identifies the media attached to the tweet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;author_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns the user's unique identifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;entities.mentions.username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recognizes the Twitter users mentioned in the tweet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;in_reply_to_user_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provides the user ID of parent tweets author if the tweet is a reply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;referenced_tweets.id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identifies the referenced tweet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;referenced_tweets.type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identifies if the tweet is a retweet or a reply&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;text.fields&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attachments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Indicates the attachment types, if any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conversation_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns the ID of the original tweet along which includes the thread of all replies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;created_at&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Time of the tweet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;geo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Location from where the tweet originated, if available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lang&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns the language tag of the language detected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;possibly_sensitive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns a Boolean response indicating if the tweet was marked sensitive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;public_metrics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provides the engagement metrics like retweet count and like count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provides the app used for publishing the tweet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you execute the request again, you will see the requested fields. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0wphico6mmuxyn8f3hqd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0wphico6mmuxyn8f3hqd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Recent Tweets search
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;recent&lt;/code&gt; endpoint searches and fetches tweets that match the query. &lt;/p&gt;

&lt;p&gt;Endpoint URL: &lt;code&gt;https://api.twitter.com/2/tweets/search/recent&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Again, We'll open a new request tab in Fiddler Everywhere and enter this API endpoint in the request bar and set the method to GET. &lt;/p&gt;

&lt;p&gt;We need to provide authentication and query parameters. You can use the same Bearer Token used in the previous request. &lt;/p&gt;

&lt;p&gt;In the Params tab, add a key-value pair called &lt;code&gt;query&lt;/code&gt;. You can enter the query in the value field. &lt;/p&gt;

&lt;p&gt;Click the Execute button to fetch the response.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feiquaragjpqr0ghiwfal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feiquaragjpqr0ghiwfal.png" alt="Alt Text"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;You can view the tweets fetched in the JSON tab of the Response section. By default, the endpoint returns ten results from the last seven days. You can use the &lt;code&gt;max_results&lt;/code&gt; parameter to indicate the required number of results. &lt;/p&gt;

&lt;p&gt;You can use the same query parameters from above to modify the request as required. &lt;/p&gt;

&lt;p&gt;This is the response that I received. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fobitqs3zflhhiieeg5v4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fobitqs3zflhhiieeg5v4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These were some of the basic operations that you can perform using the new Twitter API v2. Next time, we'll dive into how Twitter has improved the API using NLP to &lt;em&gt;understand&lt;/em&gt; and &lt;em&gt;analyze&lt;/em&gt; tweets and how you can implement it using the API. &lt;/p&gt;

&lt;h2&gt;
  
  
  Fiddler Everywhere makes debugging fun
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbhvgg8vsrf67xbpmzoo6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbhvgg8vsrf67xbpmzoo6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are wondering what else you could do with Fiddler Everywhere, the tool comes in handy to inspect, debug, mock, and share network requests and responses. You can &lt;a href="https://bit.ly/3j58H90" rel="noopener noreferrer"&gt;download&lt;/a&gt; and try it out yourself. Fiddler Everywhere is available on macOS, Linux, and Windows systems and supports all modern browsers and processes. &lt;/p&gt;

</description>
      <category>api</category>
      <category>fiddler</category>
      <category>webdev</category>
      <category>testing</category>
    </item>
    <item>
      <title>How Fiddler Everywhere makes web debugging simpler</title>
      <dc:creator>Jonathan Pereira</dc:creator>
      <pubDate>Tue, 18 Aug 2020 10:16:31 +0000</pubDate>
      <link>https://dev.to/progress/how-fiddler-everywhere-makes-web-debugging-simpler-4j9m</link>
      <guid>https://dev.to/progress/how-fiddler-everywhere-makes-web-debugging-simpler-4j9m</guid>
      <description>&lt;p&gt;As developers – whether new or experienced, we are always afraid of bugs. These could appear in the form of unexpected results or errors in our websites and apps. Problems like these are where tools like Fiddler Everywhere have been saving time and effort. In this post, we’re going to explore some situations where Fiddler Everywhere makes debugging simpler for developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8m1338d0pf7y9gmmrkxd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8m1338d0pf7y9gmmrkxd.png" alt="Download Fiddler Everywhere Now" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fiddler Everywhere is the next generation cross-platform network debugging proxy tool, which just &lt;a href="https://bit.ly/3aiQ1Qe"&gt;came out of beta&lt;/a&gt; recently. The tool is trusted by developers for over a decade and is used to inspect and debug HTTP(S) traffic requests between your computer and the internet. If you haven’t tried it yet, &lt;a href="https://bit.ly/3gWlE4v"&gt;download it now&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identify errors
&lt;/h2&gt;

&lt;p&gt;Fiddler Everywhere inspects every request made to the server as well as the response received. As the requests come in, they are logged by Fiddler Everywhere. The request log provides you a perspective of the activity going on in the background when the browser calls your website.  &lt;/p&gt;

&lt;p&gt;If at any point, you receive an unexpected response or an error, Fiddler Everywhere can promptly point out the cause. The issue could be something as simple as a wrongly entered file name in the code. While it could be a daunting task to pinpoint the file causing the error, Fiddler Everywhere would throw a 4XX error, which then can be &lt;a href="https://bit.ly/2CrOgDQ"&gt;easily debugged&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuvh3jzjt7phhquviqbn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuvh3jzjt7phhquviqbn8.png" alt="Alt Text" width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, a 404 error would indicate that the file name does not match the available files on the server, or the file doesn’t exist. Once identified, it is much simpler to rectify the error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mock user conditions
&lt;/h2&gt;

&lt;p&gt;Fiddler Everywhere allows you to simulate situations faced by your user. For example, your user might be working on a slower internet connection or entirely offline. Fiddler Everywhere enables you to create rules that add a delay while loading the website to replicate the network latency. The same can applies to check drop requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fewxod6722kuvm8q49jci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fewxod6722kuvm8q49jci.png" alt="Alt Text" width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fiddler Everywhere also tracks the response size and time taken to be transmitted. This data can be of use to highlight files that are heavy and take longer to load.&lt;/p&gt;

&lt;p&gt;Additionally, using the Fiddler Everywhere Auto Responder you can create mocking rules for your API. This ability is especially useful when you want to test your app without the live APIs or are behind a firewall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test APIs
&lt;/h2&gt;

&lt;p&gt;The Fiddler Everywhere Composer can be used to quickly test API requests and make sure that the server responds as expected. For example, if the API fails to return a response or doesn’t provide the expected response, you can open the request in the composer, modify the headers, and execute it to test the request. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Foh21st72shjnu2or8a2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Foh21st72shjnu2or8a2n.png" alt="Alt Text" width="786" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is working fine, you should get a 2XX status, else a 4XX error if there is an issue with the HTTP request or a 5XX error if there is an issue with the server. You can identify several common problems like unauthenticated requests, invalid requests, internal server errors, and service overload.&lt;/p&gt;

&lt;p&gt;Alternatively, you can use the Fiddler Everywhere Composer to test new APIs or the API user interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Saving sessions
&lt;/h2&gt;

&lt;p&gt;Fiddler Everywhere takes the pain out of repeatedly working with web requests. Fiddler Everywhere has intuitive features that help you streamline the debugging process. The filters across every category allow us to inspect limited traffic from a particular domain, a selected browser, or even a specific file type and status code. You can add multiple filters as required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkrch25ti2mtmywem67uy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkrch25ti2mtmywem67uy.png" alt="Alt Text" width="202" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additionally, you can select individual sessions or multiple sessions. You can then save them and open them in a separate tab. Fiddler Everywhere also allows you to put notes and comments on your saved sessions. This feature is useful when you want to share the requests with your teammates, who can then continue from where you left.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try out Fiddler Everywhere
&lt;/h2&gt;

&lt;p&gt;These are some of the ways that Fiddler Everywhere is known to simplify the web debugging process. Let us know the ones that you use in the comments below.&lt;/p&gt;

&lt;p&gt;If you are new to Fiddler Everywhere, check out the video below to help you get started quickly. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/y22Zp3NR3DE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Happy debugging! &lt;/p&gt;

</description>
      <category>fiddler</category>
      <category>testing</category>
      <category>debugging</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Getting Started with Fiddler Everywhere</title>
      <dc:creator>Jonathan Pereira</dc:creator>
      <pubDate>Thu, 13 Aug 2020 16:02:32 +0000</pubDate>
      <link>https://dev.to/progress/getting-started-with-fiddler-everywhere-nj1</link>
      <guid>https://dev.to/progress/getting-started-with-fiddler-everywhere-nj1</guid>
      <description>&lt;h2&gt;
  
  
  What is Fiddler Everywhere?
&lt;/h2&gt;

&lt;p&gt;Fiddler Everywhere is a valuable tool for web debugging and monitoring. It logs all the HTTP(S) traffic between the client and the internet. The tool is handy to inspect, debug, mock, and share network requests and responses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fop887f3vwtbeyjptkuma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fop887f3vwtbeyjptkuma.png" alt="Alt Text" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Along with the primary use of acting as a web debugging proxy, Fiddler Everywhere has capabilities that make it an excellent tool for API development, performance testing, security testing, and even malware analysis.&lt;/p&gt;

&lt;p&gt;Fiddler Everywhere just &lt;a href="https://bit.ly/3aiQ1Qe"&gt;got out of beta&lt;/a&gt; and is available on Windows, macOS, and Linux and supports every browser. Additionally, it can also be made to behave as a reverse proxy, thereby allowing you to inspect traffic between mobile devices and the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Fiddler Everywhere
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Head over to the &lt;a href="https://bit.ly/3gWlE4v"&gt;Fiddler Everywhere site&lt;/a&gt; to download it.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwk23nx25crojw5gqyddt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwk23nx25crojw5gqyddt.png" alt="Alt Text" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fiddler Everywhere is available for Windows, macOS, and Linux. Choose the required platform and download and install the setup file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdmuv83dp9hfpdftajzol.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdmuv83dp9hfpdftajzol.png" alt="Alt Text" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you open Fiddler Everywhere, you need to create an account. Enter the required details and click on &lt;code&gt;Create New Account&lt;/code&gt;. Alternatively, you can sign-in using your Google account.&lt;/p&gt;

&lt;p&gt;The first thing you want to do, once you install Fiddler Everywhere is to check and enable the HTTPS traffic capture. Doing this allows you to inspect and debug web traffic, which is transmitted using the HTTPS protocol, which is quickly becoming the default standard for web development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftf0g8qi9u91iwjrym8bl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftf0g8qi9u91iwjrym8bl.png" alt="Alt Text" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To do this, click on the gear icon on the top right corner. The Setting pop-up will show. In the HTTP(S) menu, click on the &lt;code&gt;Trust root certificate&lt;/code&gt; button. Your system will request your system login credentials. After you enter and authenticate yourself, Fiddler Everywhere will automatically complete the process. Make sure to click on the checkbox next to &lt;code&gt;Capture HTTPS traffic&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you face issues with the root certificate, you can try importing and trusting it manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Navigating Fiddler Everywhere
&lt;/h2&gt;

&lt;p&gt;You are now inside Fiddler Everywhere. You can see the default view divided into two major sections – the column on the left displays the web sessions and the column on the right have the Traffic Inspector. The sidebar displays the saved sessions and requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqbfdluvvxaucjltktaa8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqbfdluvvxaucjltktaa8.png" alt="Alt Text" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before you start recording the traffic, you need to make sure that you turn on the toggle in the &lt;code&gt;Live Traffic&lt;/code&gt; tab. The tab will display &lt;code&gt;(Capturing)&lt;/code&gt; if it is working fine. You can click the toggle again to pause the recording. The tab will display &lt;code&gt;(Paused)&lt;/code&gt; when it is not capturing.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Live Traffic
&lt;/h3&gt;

&lt;p&gt;Now you can open any browser and enter the URL you want to inspect. As soon as you hit enter in the browser, you will see the web sessions getting displayed in Fiddler Everywhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwp8yc7gep7y0znnithfc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwp8yc7gep7y0znnithfc.png" alt="Alt Text" width="800" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The tool provides many insights regarding each session at a glance. For example, you can see the filetype denoted next to the request number. You can see the status code of the request and the protocol used. The host server and the URL slug of the request are also displayed. You can also see information about the request method, response size, content type, and caching. Interestingly, the process from where the request originated is also displayed – for example, browser, desktop app, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyq2abg4dlkeaz4dz89vp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyq2abg4dlkeaz4dz89vp.png" alt="Alt Text" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make things simpler, you can click on the ellipsis in the menu bar and set filters for each tab and view only the required sessions. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2kbgd1q9xxehp5du5cul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2kbgd1q9xxehp5du5cul.png" alt="Alt Text" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can right-click any session and save, remove, comment, and mark the session. Additionally, you can also share the session with others by just entering the email address.   &lt;/p&gt;

&lt;h3&gt;
  
  
  Traffic Inspectors
&lt;/h3&gt;

&lt;p&gt;If you want to scrutinize an individual request, you can select the request by clicking on it and see the details in the Inspectors tab on the right. The Inspectors tab displays two panes – the top pane shows the information on the request, and the bottom pane highlights the response. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxea02iphvqqhuxcgx3ci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxea02iphvqqhuxcgx3ci.png" alt="Alt Text" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the request pane, you can see all the headers which contain the information sent to the servers like the host name, user-agent, encoding status, and even the cookies. You can view the form data and cookie data, or you can check the text, JSON, and XML used in the request, if any.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp74koljgdg8v2shcsimj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp74koljgdg8v2shcsimj.png" alt="Alt Text" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the response pane, you can view the response headers received from the server, including the status code, access controls, and even the content length. The body of the response is available as text, JSON, or XML. If the response is an image, it is available in the image tab. Interestingly, the entire response is available as a live web page in the web tab.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Auto Responder
&lt;/h3&gt;

&lt;p&gt;The Auto Responder feature is one of the most loved features of Fiddler Everywhere. You can find this feature in the tab next to the Inspectors. The feature allows the developer to mock responses, without actually transmitting the request to a live server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fiecjx7f264qniaiami7d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fiecjx7f264qniaiami7d.png" alt="Alt Text" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can create a new rule with a match condition and an action to be performed. The term can be a host name, or the URL, or even the file type. If you want to target an URL specifically, you can also set the condition to require an exact match.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9r4au79ju3oghpnhsw8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9r4au79ju3oghpnhsw8k.png" alt="Alt Text" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The corresponding action which needs to be executed, in the event of a match, has to be provided. This action could be another URL or a filename or a redirect request. This feature can also help set breakpoints, delay (to imitate network latency), rest the connection, and even close the connection altogether.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Composer
&lt;/h3&gt;

&lt;p&gt;The composer feature — next to the “Web Sessions” tab — allows you to modify and send requests to the server. Additionally, you can create your requests and execute it with Fiddler Everywhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frrjb4lkab0o3mpytgfux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frrjb4lkab0o3mpytgfux.png" alt="Alt Text" width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To modify an existing request, you can right-click on the request in the “Web Sessions” tab and select the Composer option. The request will automatically get loaded in the Composer tab. Similarly, you can create a new request in the Composer tab directly.  &lt;/p&gt;

&lt;p&gt;In the Composer tab, you need to select the appropriate HTTP method, enter the request URL, the headers, and the request body. You can click on Execute to send the request to the server or click on Save to save it. Fiddler Everywhere supports all the available HTTP request methods.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Start debugging
&lt;/h2&gt;

&lt;p&gt;Now that you know about Fiddler Everywhere, it is time to put the tool to the test and see how it mystically makes debugging simpler. Head over to the &lt;a href="https://docs.telerik.com/fiddler-everywhere"&gt;Fiddler Everywhere documentation&lt;/a&gt; to get more information about the features. If, at any point, you feel stuck or are faced with an issue, feel free to reach out to the live &lt;a href="https://community.getfiddler.com/support/discussions"&gt;Fiddler Everywhere community&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>fiddler</category>
      <category>testing</category>
      <category>webdev</category>
      <category>debug</category>
    </item>
    <item>
      <title>From Fiddler Classic to Fiddler Everywhere</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Thu, 30 Apr 2020 19:13:37 +0000</pubDate>
      <link>https://dev.to/progress/from-fiddler-classic-to-fiddler-everywhere-4a0m</link>
      <guid>https://dev.to/progress/from-fiddler-classic-to-fiddler-everywhere-4a0m</guid>
      <description>&lt;p&gt;In the more than 15 years of Fiddler's history, it's become one of the most popular Telerik products. Fiddler has also become a victim of its own success, as it has A LOT of distinct features for A LOT of different types of users!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-classic-ui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-classic-ui.png" alt="fiddler classic ui" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Long-time users of Fiddler are ok with this, should we say, "cluttered" UI. They know where their features are and how to use them. And you know what, Fiddler is popular because &lt;em&gt;what it does, it does very well&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;There are some things that Fiddler "Classic" (what we term the current Windows-only version of Fiddler) doesn't do well though. It's not especially inviting to new users due to the aforementioned complicated UI. It also isn't easily accessible to the growing base of web and desktop developers on macOS and Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fiddler Everywhere FTW
&lt;/h2&gt;

&lt;p&gt;It's primarily out of these concerns that &lt;a href="https://www.telerik.com/fiddler-everywhere" rel="noopener noreferrer"&gt;Fiddler Everywhere&lt;/a&gt; was born. Fiddler Everywhere is a more focused implementation of Fiddler that provides access to the most-adored features of Fiddler Classic. And it works across all platforms equally well: macOS, Linux, and Windows.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Suffice it to say, &lt;a href="https://www.telerik.com/fiddler" rel="noopener noreferrer"&gt;Fiddler Classic&lt;/a&gt; isn't going anywhere. You know it, you love it, and we will continue to support it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those of you who have been using Fiddler for a long time might be curious about exactly which features are migrating to Fiddler Everywhere, where they are, and how you use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traffic Inspector
&lt;/h2&gt;

&lt;p&gt;One of the primary uses of Fiddler is to inspect HTTP/HTTPS traffic to and from browsers and desktop apps. This is a critically important feature for Fiddler users, so it was a no-brainer feature to add to Fiddler Everywhere.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Inspector in Fiddler Classic&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-classic-inspector.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-classic-inspector.png" alt="fiddler classic inspector" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fiddler (both Classic and Everywhere) can log all traffic between your device and any remote endpoint. Any application on your computer that supports a system network proxy (all modern browsers and likely any desktop app you are developing) can have its network traffic monitored and debugged.&lt;/p&gt;

&lt;p&gt;Fiddler Classic allows you to dive into the details of any specific network request, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Headers&lt;/li&gt;
&lt;li&gt;TextView&lt;/li&gt;
&lt;li&gt;SyntaxView&lt;/li&gt;
&lt;li&gt;WebForms&lt;/li&gt;
&lt;li&gt;HexView&lt;/li&gt;
&lt;li&gt;Auth&lt;/li&gt;
&lt;li&gt;Cookies&lt;/li&gt;
&lt;li&gt;Raw&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;li&gt;XML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Inspector in Fiddler Everywhere&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-everywhere-inspector.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-everywhere-inspector.png" alt="fiddler everywhere inspector" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Likewise, Fiddler Everywhere provides access to a similar set of details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Headers&lt;/li&gt;
&lt;li&gt;Text&lt;/li&gt;
&lt;li&gt;Web Forms&lt;/li&gt;
&lt;li&gt;Cookies&lt;/li&gt;
&lt;li&gt;Raw&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;li&gt;XML&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  API Composer
&lt;/h2&gt;

&lt;p&gt;Modern apps are oftentimes powered by separate remote APIs. Tools such as Postman are widely used to help test and debug these remote API endpoints.&lt;/p&gt;

&lt;p&gt;Fiddler Classic provides an API composer, similar to what can be accomplished with Postman:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;API Composer in Fiddler Classic&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-classic-composer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-classic-composer.png" alt="fiddler classic composer" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Fiddler Everywhere, we've seen how critical this piece of functionality is in your debugging workflow. So not only have we included this feature from Fiddler Classic, but we have improved upon it:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;API Composer in Fiddler Everywhere&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-everywhere-composer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-everywhere-composer.png" alt="fiddler everywhere composer" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Fiddler Everywhere, you can edit headers and add parameters to your requests. For instance, if you want to hard code in your &lt;code&gt;authorization&lt;/code&gt; test key, you can now do so!&lt;/p&gt;

&lt;h2&gt;
  
  
  Auto Responder
&lt;/h2&gt;

&lt;p&gt;One of the most useful features of Fiddler (in this writer's humble opinion) is the Auto Responder. Using Auto Responder, you can set up rules to alter specific requests and test out a myriad of debugging scenarios. You can use local file assets instead of transmitting requests to the server and answer questions like: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens if my CDN goes down?&lt;/li&gt;
&lt;li&gt;Does my app break if the remote API returns a 500 error?&lt;/li&gt;
&lt;li&gt;If images aren't served properly from the server, does it completely bonk the layout of my app?&lt;/li&gt;
&lt;li&gt;What about if there is significant latency with my remote APIs?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Auto Responder in Fiddler Classic&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-classic-autoresponder.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-classic-autoresponder.png" alt="fiddler classic auto responder" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Auto Responder is back (with a vengeance) in Fiddler Everywhere! Not only can you construct your rules in a more elegant and intuitive manner, but you can also stack and re-order rules to provide a fully customized means of responding to complicated requests.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Auto Responder in Fiddler Everywhere&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-everywhere-autoresponder.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Ffiddler-everywhere-autoresponder.png" alt="fiddler everywhere auto responder" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  But [Insert Feature Name] is Missing!?!
&lt;/h2&gt;

&lt;p&gt;Clearly Fiddler Classic is chock-full of features it has accumulated over its 15 year lifespan:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Fclassic-features.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fclassic-to-everywhere%2Fclassic-features.png" alt="fiddler classic features" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And not all of them are in Fiddler Everywhere, nor will all of them &lt;em&gt;ever&lt;/em&gt; be in Fiddler Everywhere. Does this mean you should stop using Fiddler Classic? No! In fact, you can use the two tools in parallel if you need to, especially as Fiddler Everywhere features ramp-up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Fiddler Everywhere Today
&lt;/h2&gt;

&lt;p&gt;There is quite literally no reason to wait! Especially if you are already on macOS or Linux, &lt;a href="https://www.telerik.com/fiddler-everywhere" rel="noopener noreferrer"&gt;download Fiddler Everywhere&lt;/a&gt; today and take a spin through the features available. Over the forthcoming weeks and months you will start to seeing more significant improvements in the usability and feature set of Fiddler Everywhere.&lt;/p&gt;

&lt;p&gt;Happy debugging! 🐛&lt;/p&gt;

</description>
      <category>fiddler</category>
      <category>debug</category>
      <category>proxy</category>
      <category>network</category>
    </item>
    <item>
      <title>Fiddler Everywhere is Getting a New Look</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Fri, 17 Apr 2020 13:49:11 +0000</pubDate>
      <link>https://dev.to/progress/fiddler-everywhere-is-getting-a-new-look-2cm7</link>
      <guid>https://dev.to/progress/fiddler-everywhere-is-getting-a-new-look-2cm7</guid>
      <description>&lt;p&gt;&lt;a href="https://www.telerik.com/fiddler" rel="noopener noreferrer"&gt;Fiddler&lt;/a&gt;: you know it, you love it. Some of you have even been using it for 15+ years! This venerable network debugging tool for desktop and web apps remains &lt;em&gt;one of the most popular products&lt;/em&gt; in the &lt;a href="https://www.telerik.com/" rel="noopener noreferrer"&gt;Telerik&lt;/a&gt; portfolio for good reason: it just works.&lt;/p&gt;

&lt;p&gt;But one of the top feature requests we have repeatedly received is to provide a compatible version for macOS and Linux. And that's precisely where &lt;a href="https://www.telerik.com/fiddler-everywhere" rel="noopener noreferrer"&gt;Fiddler Everywhere&lt;/a&gt; comes in!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.progress.com/campaigns/kinvey/webinar-fiddler-everywhere" rel="noopener noreferrer"&gt;Join our webinar on Thursday, April 28th&lt;/a&gt; as we dive into the new features of Fiddler Everywhere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fiddler Everywhere is the next generation of Fiddler. It was built from the ground-up to work in a cross-platform manner for macOS, Linux, and yes of course, Windows. We've taken the most-used and most-loved features from the original Fiddler (which you may see called "Fiddler Classic"), are applying some additional polish, and actively making them available in Fiddler Everywhere.&lt;/p&gt;

&lt;p&gt;In the coming weeks and months you're going to see &lt;strong&gt;a lot of activity&lt;/strong&gt; from the Fiddler team in relation to Fiddler Everywhere. We have some exciting plans in place for feature additions, expansions, and improvements. Today though, I'd like to specifically call out the new user experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can download the latest beta of Fiddler Everywhere &lt;a href="https://www.telerik.com/download/fiddler-everywhere" rel="noopener noreferrer"&gt;right here&lt;/a&gt;. And before you ask, nope, the original Fiddler isn't going anywhere!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;The NEW Fiddler Everywhere UI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Fnew-ui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Fnew-ui.png" alt="new fiddler everywhere ui" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Fiddler team is working on moving from the relatively antiquated Fiddler Everywhere UI we have today (for example):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Fold-ui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Fold-ui.png" alt="old fiddler everywhere ui" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;...to a much more engaging and intuitive experience!&lt;/p&gt;

&lt;h2&gt;
  
  
  New UX == New Features
&lt;/h2&gt;

&lt;p&gt;Along with a new UX comes a variety of new and improved features as well. For instance, to make it easier for you to manage multiple concurrent sessions and tasks, we are introducing a tabbed interface. 📑&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Ftabbed-ui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Ftabbed-ui.png" alt="fiddler everywhere tabbed ui" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Improved filtering options will make it easier for you to see only the requests you want, when you want them. 🔽&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Ffilters.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Ffilters.png" alt="fiddler everywhere filters" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can view a history of your saved sessions and request history, and easily access them. 📜&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Fsaved-sessions.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Fsaved-sessions.png" alt="fiddler everywhere saved sessions" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the &lt;em&gt;Auto Responder&lt;/em&gt; feature is getting some major improvements in its UX and functionality, allowing you to more easily debug a variety of network scenarios with your web and desktop apps.&lt;/p&gt;

&lt;p&gt;Need to test what happens when your CDN goes down? Want to swap in some local assets in place of remote files to see how your production site reacts? &lt;em&gt;Auto Responder&lt;/em&gt; to the rescue! ⛑️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Fauto-responder.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frdlauer%2Farticles%2Fmaster%2Ffiddler%2Fnew-ui%2Fauto-responder.png" alt="fiddler everywhere auto responder" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We even have a &lt;strong&gt;brand new collaboration feature&lt;/strong&gt; coming out, but you'll have to &lt;a href="https://www.progress.com/campaigns/kinvey/webinar-fiddler-everywhere" rel="noopener noreferrer"&gt;attend our webinar&lt;/a&gt; to find out more. 🤫&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Fiddler Everywhere
&lt;/h2&gt;

&lt;p&gt;We welcome you to &lt;a href="https://www.telerik.com/download/fiddler-everywhere" rel="noopener noreferrer"&gt;download Fiddler Everywhere&lt;/a&gt; for free today and get a head start on some of these features.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please note that depending on when you are reading this, the new UI we just covered may or may not be implemented, but with the auto-updating feature in place rest assured you'll get it as soon as it's available.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>fiddler</category>
      <category>proxy</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Tips for Updating NativeScript Apps on App Store and Google Play</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Thu, 26 Sep 2019 18:24:06 +0000</pubDate>
      <link>https://dev.to/progress/tips-for-updating-nativescript-apps-on-app-store-and-google-play-pf6</link>
      <guid>https://dev.to/progress/tips-for-updating-nativescript-apps-on-app-store-and-google-play-pf6</guid>
      <description>&lt;p&gt;So the time has come, once again, to make some updates to my fun little beer app I affectionately call "Hoppy".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0tciews7hkqnstot9yh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0tciews7hkqnstot9yh.png" alt="hoppy app screens" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Shameless promo:&lt;/strong&gt; You can find the app on the &lt;a href="https://apps.apple.com/us/app/hoppy-discover-beer-ratings/id1406526158?ls=1" rel="noopener noreferrer"&gt;iOS App Store&lt;/a&gt; and &lt;a href="https://play.google.com/store/apps/details?id=org.nativescript.hoppy" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;. It's 100% free, you just need a 100% free &lt;a href="https://untappd.com/" rel="noopener noreferrer"&gt;Untappd&lt;/a&gt; account to use it! Oh, it's also &lt;a href="https://github.com/rdlauer/hoppy" rel="noopener noreferrer"&gt;fully open source&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, those of you familiar with the app store submission processes know that you tend to have to &lt;em&gt;completely re-learn&lt;/em&gt; the steps nearly every time you submit an update (especially on the iOS side 🤬).&lt;/p&gt;

&lt;p&gt;Well, I'm here to provide you &lt;a href="https://www.nativescript.org/" rel="noopener noreferrer"&gt;NativeScript&lt;/a&gt; developers some shortcuts and save you some hair-pulling when publishing your app updates to the public app stores.&lt;/p&gt;

&lt;p&gt;But let's start with the easiest way to update your app: avoiding the app store submission process entirely! 🤯&lt;/p&gt;

&lt;h2&gt;
  
  
  NativeScript AppSync
&lt;/h2&gt;

&lt;p&gt;Should you discover an error or minor issue with your app in production, the normal solution to this is to generate a new build of your app and wait the hours (Google Play) or days (iOS App Store) to see your fix go live. Plus you then have to hope and pray that your users are set to automatically install app updates, lest you wait in vain for them to manually install them.&lt;/p&gt;

&lt;p&gt;What if you could push an update to your app &lt;em&gt;immediately&lt;/em&gt;, avoiding the app stores entirely? This is the basic concept behind &lt;strong&gt;NativeScript AppSync&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you've heard of &lt;a href="https://microsoft.github.io/code-push/" rel="noopener noreferrer"&gt;CodePush&lt;/a&gt; from Microsoft, you're on the right track. NativeScript AppSync is based on that very same code!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AppSync is a NativeScript plugin (available on the &lt;a href="https://market.nativescript.org/plugins/nativescript-app-sync" rel="noopener noreferrer"&gt;NativeScript Marketplace&lt;/a&gt;) and is completely free to install and use:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tns plugin add nativescript-app-sync
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;With the plugin installed, you just need to call the &lt;code&gt;AppSync.sync()&lt;/code&gt; method in your app's &lt;code&gt;app.js&lt;/code&gt; or &lt;code&gt;main.ts&lt;/code&gt; file:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { AppSync } from "nativescript-app-sync";

AppSync.sync({
  deploymentKey: "..."
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;There's a little more to it than that, so be sure to check out TJ VanToll's &lt;a href="https://www.nativescript.org/blog/enable-live-updates-of-your-ios-and-android-apps-using-nativescript-appsync" rel="noopener noreferrer"&gt;excellent blog post about NativeScript AppSync&lt;/a&gt; for the full story.&lt;/p&gt;

&lt;p&gt;Ok, back to the traditional way of updating our apps. 😭&lt;/p&gt;

&lt;h2&gt;
  
  
  Updating Your App on Google Play
&lt;/h2&gt;

&lt;p&gt;Google makes app store submission relatively easy. To create a new version, you'll need to start on the &lt;a href="https://play.google.com/apps/publish/" rel="noopener noreferrer"&gt;Google Play Console&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pick your app, go to &lt;strong&gt;Release management&lt;/strong&gt; --&amp;gt; &lt;strong&gt;App releases&lt;/strong&gt; --&amp;gt; &lt;strong&gt;Manage&lt;/strong&gt; in the &lt;em&gt;Production Track&lt;/em&gt; tile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3r720mqjf7s9u6yaqpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3r720mqjf7s9u6yaqpg.png" alt="google play update app" width="794" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From here, you simply &lt;strong&gt;Create Release&lt;/strong&gt;, add some release notes, and upload your build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Your Build for Android
&lt;/h3&gt;

&lt;p&gt;My go-to way to create a release build for Android is the following NativeScript CLI command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tns build android --release --env.snapshot --key-store-path [path to your key store] --key-store-password [key store password] --key-store-alias [key store alias] --key-store-alias-password [key store alias password] --aab --copy-to [path to where you want the aab file created]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;There's a lot to unpack in that one command, but you can find all the details of the &lt;code&gt;build&lt;/code&gt; command in &lt;a href="https://docs.nativescript.org/tooling/docs-cli/project/testing/build" rel="noopener noreferrer"&gt;this doc article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Due to Google requiring 64-bit builds of your app, I also had to alter my &lt;code&gt;app.gradle&lt;/code&gt; file and replace the &lt;code&gt;android&lt;/code&gt; section with this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android {
  defaultConfig {
    generatedDensities = []
    ndk {
      abiFilters.clear()
      abiFilters.addAll(['armeabi-v7a','arm64-v8a'])
    }
  }    
  buildTypes {
    debug {
      ndk {
        abiFilters 'x86'
      }
    }
  }
  aaptOptions {
    additionalParameters "--no-version-vectors"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;YMMV though, as this should be fixed with an upcoming version of NativeScript!&lt;/p&gt;

&lt;p&gt;With your &lt;code&gt;.aab&lt;/code&gt; file created, you will simply upload it via the Google Play Console and you should be good to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Updating Your App on iOS App Store
&lt;/h2&gt;

&lt;p&gt;Oh Apple. I love/hate you so much. You make me spend way too much time in Xcode just to create a release build of my app. Sigh.&lt;/p&gt;

&lt;p&gt;Regardless, here are my quick tips for app store glory:&lt;/p&gt;

&lt;p&gt;Xcode seems to have a hard time (sometimes) picking the correct certificate and provisioning profile for my app builds. By default, the provisioning profile is "automatically" chosen. However, I've always had to turn this setting off and instead manually pick the distribution profile I wanted to use for a release build:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fovauwlxmkddl036ueg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fovauwlxmkddl036ueg.png" alt="xcode provisioning profile selection" width="784" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you're having trouble locating the &lt;code&gt;.xcodeproj&lt;/code&gt; file for your app to open in Xcode, check the &lt;code&gt;/appname/platforms/ios&lt;/code&gt; directory!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, I create a release build of my app with the NativeScript CLI:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tns build ios --release --for-device --provision [provisioning profile id]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Hmmm...so what is this "provisioning profile id"? I've always found it best to &lt;em&gt;explicitly define&lt;/em&gt; which provisioning profile I want to use. YMMV of course, but this seems to be the safest way to create a problem-free build.&lt;/p&gt;

&lt;p&gt;"How do you get the provisioning profile id" you ask? Open the provisioning profile file you downloaded from Apple in your text editor of choice, and scroll down to the &lt;code&gt;UUID&lt;/code&gt; key. Therein lies the id:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;key&amp;gt;UUID&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee&amp;lt;/string&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;With your build created, you'll find the &lt;code&gt;.ipa&lt;/code&gt; file at &lt;code&gt;/appname/platforms/ios/build/Release-iphoneos/appname.ipa&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Head over to Apple's &lt;a href="https://developer.apple.com/app-store-connect/" rel="noopener noreferrer"&gt;App Store Connect&lt;/a&gt; site and create a new version of your app:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz270lzit53zxvmpp4uz1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz270lzit53zxvmpp4uz1.png" alt="ios app store new version" width="793" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you'll need to somehow &lt;em&gt;upload&lt;/em&gt; this newly-created build. You'd think Apple would just let you upload your build through the website. But no!&lt;/p&gt;

&lt;p&gt;To upload an app build, we've traditionally had to use a utility called Application Loader. This tool is no longer available in Xcode though, and, to be completely frank, I was not able to get my app build uploaded using the process in Xcode 11 🤷. So I went the CLI route:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xcrun altool --upload-app --type ios --file [path to ipa] --username [apple id username] --password [app-specific password]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Using this command will use the Xcode CLI tools to upload and verify your app.&lt;/p&gt;

&lt;p&gt;What's this "app-specific password" thing? Since Apple now requires two-factor auth by default, you'll have to head to &lt;a href="https://appleid.apple.com/account/manage" rel="noopener noreferrer"&gt;Apple ID Account Management&lt;/a&gt; and create an app-specific password for this step. It's actually quite easy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgtw794b4kn58tn80f3hq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgtw794b4kn58tn80f3hq.png" alt="ios apple id app-specific password" width="791" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When this is done, you should get a couple of emails from Apple notifying you about the status of your build. When you get the all-clear, head back into your developer console and select the new build as part of this new version!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7urrl30e7uycnp60ridl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7urrl30e7uycnp60ridl.jpg" alt="great success" width="355" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I Feel Your Pain
&lt;/h2&gt;

&lt;p&gt;Yep, app store approval processes can be a huge drag, no doubt. BUT, you can make your life easier in the future by giving &lt;a href="https://www.nativescript.org/blog/enable-live-updates-of-your-ios-and-android-apps-using-nativescript-appsync" rel="noopener noreferrer"&gt;NativeScript AppSync&lt;/a&gt; a try! 🤩&lt;/p&gt;

</description>
      <category>nativescript</category>
      <category>javascript</category>
      <category>mobile</category>
    </item>
    <item>
      <title>My Top 5 Tech Speaking Tips</title>
      <dc:creator>TJ VanToll</dc:creator>
      <pubDate>Wed, 21 Aug 2019 18:44:41 +0000</pubDate>
      <link>https://dev.to/progress/my-top-5-tech-speaking-tips-4dej</link>
      <guid>https://dev.to/progress/my-top-5-tech-speaking-tips-4dej</guid>
      <description>&lt;p&gt;This article is an eclectic set of speaking tips I’ve learned from giving &lt;a href="https://www.tjvantoll.com/speaking/" rel="noopener noreferrer"&gt;dozens of tech talks at conferences around the world&lt;/a&gt;. I hope these tips help new speakers prepare their first talk, and help give experienced speakers ideas to potentially improve.&lt;/p&gt;

&lt;p&gt;One thing I’ll note though: these are tips that I’ve found work for &lt;em&gt;me&lt;/em&gt;, which doesn’t necessarily mean they’ll work for you. Each speaker needs to find their own style and workflow, so try to take inspiration from these tips and don’t interpret them as hard and fast rules.&lt;/p&gt;

&lt;p&gt;With that disclaimer out of the way, on to the tips!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tip #1: Don’t worry about slide design&lt;/li&gt;
&lt;li&gt;Tip #2: Make an outline&lt;/li&gt;
&lt;li&gt;Tip #3: During slide creation, make your intro slides last&lt;/li&gt;
&lt;li&gt;Tip #4: Make the audience do stuff&lt;/li&gt;
&lt;li&gt;Tip #5: Speak—a lot&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="tip-1"&gt;Tip #1: Don’t worry about slide design&lt;/h2&gt;

&lt;p&gt;I’ve never cared about slide design and you probably shouldn’t either.&lt;/p&gt;

&lt;p&gt;I offer this as a tip because I find that new speakers spend a lot of time trying to find a good color scheme or font for their slides. Or get confused about whether to use PowerPoint, or Keynote, or something web-based.&lt;/p&gt;

&lt;p&gt;You don’t want this sort of thing to get in your way. Start with a tool you like (for me that’s PowerPoint because it’s simple), pick the blank slide template, and get started.&lt;/p&gt;

&lt;p&gt;Just to give you an idea, I typically have three types of slides that I use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design #1: Plain text
&lt;/h3&gt;

&lt;p&gt;I use simple slides with just text on them a whole lot. For colors I use black text on a white background for readability, and I use the Avenir font—but only because that was the font on some slide deck I started with years ago. It looks nice to me though.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdk60s6za5mldtv302qdl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdk60s6za5mldtv302qdl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Design #2: Screenshots
&lt;/h3&gt;

&lt;p&gt;For a lot of my slides I just take a screenshot of something and then just toss it on a slide. It works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F92v5vytlkcazp15xzpkj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F92v5vytlkcazp15xzpkj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Design #3: Bullets
&lt;/h3&gt;

&lt;p&gt;I use bulleted slides when I need to present a list, and I just use the default PowerPoint design for this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fq2e5zhavw3g0ynaq0rig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fq2e5zhavw3g0ynaq0rig.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I do occasionally mix things up, but that’s the approach I take on 95% of the slides I make. And for most cases that’s all you’ll need as well.&lt;/p&gt;

&lt;p&gt;Unless you’re an actual designer and want to spend the time to create something really unique, I’d encourage you just to pick the blank slide deck in your tool of choice and call it good enough.&lt;/p&gt;

&lt;p&gt;My second tip deals with what to do next.&lt;/p&gt;

&lt;h2 id="tip-2"&gt;Tip #2: Make an outline&lt;/h2&gt;

&lt;p&gt;I make an outline for every talk I give. The outline is dead simple, and includes only three things: the talk’s main audience takeaway, 3–4 topics that help support that takeaway, and an actionable next step.&lt;/p&gt;

&lt;p&gt;When written out that structure looks something like this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State the takeaway, aka what I want the audience to get out of the talk.&lt;/li&gt;
&lt;li&gt;Topic #1&lt;/li&gt;
&lt;li&gt;Topic #2&lt;/li&gt;
&lt;li&gt;Topic #3&lt;/li&gt;
&lt;li&gt;Topic #4 if necessary&lt;/li&gt;
&lt;li&gt;Restate the takeaway again&lt;/li&gt;
&lt;li&gt;Give an actionable next step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, below is the outline I had for a &lt;a href="https://www.tjvantoll.com/speaking/slides/AR/Montreal/ar.pdf" rel="noopener noreferrer"&gt;&lt;em&gt;Is Augmented Reality the Future?&lt;/em&gt; talk&lt;/a&gt; I recently gave in Montreal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Takeaway: AR (Augmented Reality) is cool, but still pretty hard for your average developer.&lt;/li&gt;
&lt;li&gt;Topic #1: History of AR&lt;/li&gt;
&lt;li&gt;Topic #2: AR today&lt;/li&gt;
&lt;li&gt;Topic #3: Building AR apps&lt;/li&gt;
&lt;li&gt;Restate the takeaway&lt;/li&gt;
&lt;li&gt;Provide my preferred place to get started building AR apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once I have this outline I start including the outline in my slide deck directly. Specifically, I create a slide called “Agenda” that looks something like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fb9381f381avohhfjnp94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fb9381f381avohhfjnp94.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This act of creating an outline helps you organize the talk in your head, and placing that outline in slides helps you visually see your progress creating content for each topic. Audiences like structure as well, as it helps them know what to expect from your talk, and therefore makes it easier for them to follow along.&lt;/p&gt;

&lt;p&gt;To make it even easier for the audience, I always include the same agenda slide in my deck when I transition between topics. For example, after I complete the “Brief history of AR” topic I show the slide below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fc671o4izaykpwhio1s6f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fc671o4izaykpwhio1s6f.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These slides give me a logical place to summarize the previous topic and segue to the next.&lt;/p&gt;

&lt;p&gt;Next, I create a slide that summarizes the key takeaways of my talk at the beginning and end of my talk. Here’s what that slide looked like for my AR talk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FsL6BmLt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FsL6BmLt.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I show this slide at the beginning of my talk I say something like, &lt;em&gt;“This is what I plan to prove/show you today”&lt;/em&gt;, and at the end I restate the points, and usually talk about how the topics I presented support those points.&lt;/p&gt;

&lt;p&gt;Once you have this basic outline in place you’re ready to start developing your introduction and your main content.&lt;/p&gt;

&lt;h2 id="tip-3"&gt;Tip #3: During slide creation, make your intro slides last&lt;/h2&gt;

&lt;p&gt;When creating slides most people start with the introduction, because, well, it’s the first thing you actually present. The problem is that creating compelling introductions can be hard, even for experienced speakers.&lt;/p&gt;

&lt;p&gt;And because of this, it’s really easy to waste a lot of time searching for the perfect way to introduce your topic, when in reality it’s fairly insignificant.&lt;/p&gt;

&lt;p&gt;Your introduction can be as simple as stating the following points, especially when you’re just getting started.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’m &lt;em&gt;&amp;lt;your name&amp;gt;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;State topic&lt;/li&gt;
&lt;li&gt;State audience takewaways&lt;/li&gt;
&lt;li&gt;Show agenda&lt;/li&gt;
&lt;li&gt;Start talking about topic 1.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By saving the introduction until the end you’ll have a better idea of what you might want to say to start your talk with. You can also rest assured that the bulk of your work is done.&lt;/p&gt;

&lt;p&gt;All that being said, I don’t mean to imply introductions aren’t worth spending &lt;em&gt;any&lt;/em&gt; time on, because done well they can be way to engage the audience and draw them into your talk. I would just save them for last.&lt;/p&gt;

&lt;p&gt;When you do create an introduction you need to experiment a bit and find what works for you. My go-to introduction is to telling a story that relates to my topic or the place I’m speaking. For example, to open my AR talk I told a story about my love for Pokémon GO, and how that’s what got me interested in AR in the first place.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzy4jmnpk04fp07x5vh3y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzy4jmnpk04fp07x5vh3y.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was lucky enough to give a talk in Denmark last year, and I opened with a slide with pictures of me around the area for fun.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fial3omlpspux05035974.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fial3omlpspux05035974.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have an idea for a story to tell I’d encourage you to take it and run with it. Deliver the story with confidence and have fun.&lt;/p&gt;

&lt;p&gt;But if you don’t have an idea don’t worry either. Save the intro for the end, and if you can’t think of anything, stick with the basics and get into the meat of your talk right away.&lt;/p&gt;

&lt;p&gt;And when you’re delivering the bulk of your content I have a tip for that as well.&lt;/p&gt;

&lt;h2 id="tip-4"&gt;Tip #4: Make the audience do stuff&lt;/h2&gt;

&lt;p&gt;Walk into a room halfway through a random tech talk and you’ll likely see at least half the attendees looking at their phones or laptops.&lt;/p&gt;

&lt;p&gt;The thing is, it’s hard to keep people’s attention on anything, and tech topics aren’t the world’s most engaging material. As a speaker there are a few things you can do to help keep your audience’s attention.&lt;/p&gt;

&lt;p&gt;The simplest thing you can do is poll your audience at given points in your talks. I often do this before I introduce a new topic. For example, in a talk I recently gave called &lt;em&gt;One Project. One Language. Three Apps.&lt;/em&gt; I used the slide below to introduce two frameworks, NativeScript and React Native.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhg3q2rdvcpg6mvmtw6ck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhg3q2rdvcpg6mvmtw6ck.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before I introduced each framework I asked the audience, &lt;em&gt;“How many people here are familiar with React Native”&lt;/em&gt;, and then, &lt;em&gt;“How many people here are familiar with NativeScript”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;These simple questions accomplish two things. First, it forces the audience to look up and engage with the talk, if only for a minute. Second, it helps me get a read on the room. If I see 5% of hands go up I know I need to give a thorough introduction, whereas if every hand goes up, I know a short explanation will suffice.&lt;/p&gt;

&lt;p&gt;Polling the audience is the easiest way to engage the audience, but there are a variety of more creative ways you can accomplish the same goal.&lt;/p&gt;

&lt;p&gt;For example my significant other gives talks on CSS, and one fun thing she does is include mini quizzes in her slides, like the one below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Frijzhhmzwp2suid75854.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Frijzhhmzwp2suid75854.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This again solves multiple goals. First, it forces the audience to not only pay attention, but to also really try to understand the content to get the correct answer. (It’s 600px, by the way.)&lt;/p&gt;

&lt;p&gt;Second, it gives the presenter a good sense of whether the audience is following along with the content. If you see a lot of hands going up and a lot of correct answers you know people are understanding your material.&lt;/p&gt;

&lt;p&gt;There are professional tools out there to make this sort of audience quizzing even more engaging. For example the service &lt;a href="https://kahoot.com/" rel="noopener noreferrer"&gt;Kahoot!&lt;/a&gt; makes it easy to configure quizzes that an audience can easily complete on their laptops and smartphones.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fregd84ouopifobzmjzum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fregd84ouopifobzmjzum.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overall, the specific tool or approach doesn’t really matter. What does matter is finding some way to break up the inherent monotony of a tech talk by engaging the audience.&lt;/p&gt;

&lt;h2 id="tip-5"&gt;Tip #5: Speak—a lot&lt;/h2&gt;

&lt;p&gt;The phrase &lt;em&gt;practice makes perfect&lt;/em&gt; applies more to public speaking than any other life skill. No amount of practicing in front of a mirror will prepare you for the experience of delivering a talk in front of a live audience, and the only best way to improve is continue to do just that—deliver talks, repeatedly.&lt;/p&gt;

&lt;p&gt;This doesn’t mean you have to constantly give talks at conferences around the world though. Occasionally giving a presentation at a local user group, or for a few coworkers at work, will help you learn how to be in front of an audience and deliver your material effectively.&lt;/p&gt;

&lt;p&gt;As you get more comfortable speaking you’ll want to work on how to improve the quality of your talks. And for that I have two recommendations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watch yourself on video
&lt;/h3&gt;

&lt;p&gt;Most people would choose elective surgery over watching a video of themselves presenting—myself included. But it’s extremely important, as you’ll learn things about your talks you can only see from a third-person perspective.&lt;/p&gt;

&lt;p&gt;Personally I started as a heavy &lt;em&gt;“um”&lt;/em&gt; user, which I had no idea about until I saw myself on video. Later, I developed a habit of using my hands... a lot. It was awkward. But knowing these tendencies helps me consciously think about avoiding these habits, and ultimately helps me stop repeating them in the future.&lt;/p&gt;

&lt;p&gt;It’s important. Get a friend to record you and watch the video. You’ll hate it, but it’s worth it. Promise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Find a trusted friend for feedback
&lt;/h3&gt;

&lt;p&gt;In addition to watching yourself speak, it’s good to get feedback from others as well. However here you have to be extremely careful for two reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason #1&lt;/strong&gt;: &lt;strong&gt;Some people are horrible&lt;/strong&gt;, and will leave negative feedback on your talk for silly reasons, like not liking the framework you’re using (seriously).&lt;/p&gt;

&lt;p&gt;And even if you know the feedback is unreasonable, the human brain has an unfortunate tendency to fixate on the negative, even if you get an onslaught of positive feedback to go with it.&lt;/p&gt;

&lt;p&gt;And I can say this from many personal experiences. Remember the talk I mentioned earlier that I gave in Denmark? It’s the most well received talk I’ve ever given. I’ve had random people at conferences compliment me on it; it’s shown up in all sorts of positive tweets, and has gotten numerous mentions in popular newsletters and such.&lt;/p&gt;

&lt;p&gt;This was great, until I made the classic mistake of &lt;a href="https://www.youtube.com/watch?v=AQOEZVG2WY0" rel="noopener noreferrer"&gt;reading the negative comments on the YouTube recording&lt;/a&gt;, which if I’m honest, has ruined a lot of the positive experience I had from preparing and delivering that talk.&lt;/p&gt;

&lt;p&gt;Overall, be careful asking for feedback broadly because the human brain has the not-at-all-useful tendency to heavily focus on the negative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason #2&lt;/strong&gt;: &lt;strong&gt;Most people won’t be honest&lt;/strong&gt;. If you deliver a talk to a group of friends or coworkers and ask for feedback, the vast majority of people will reply with something like &lt;em&gt;“It was good.”&lt;/em&gt; or &lt;em&gt;“I liked it.”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Although this is supportive, it’s also good to get honest feedback on how you can improve. For this you need to find that blunt person in your life that’s not afraid to tell you like it is, and will call you out on things you can improve on.&lt;/p&gt;

&lt;p&gt;The big difference between asking a friend and random people is a friend can provide context and details on things you need to work on. There’s a big difference between &lt;em&gt;“That talk sucked”&lt;/em&gt; and &lt;em&gt;“I had trouble following along in the middle part of the talk. I think you could have explained the concepts better or maybe used more examples to prove your points.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can also ask questions of your friend, like &lt;em&gt;“did you understand the first topic?”&lt;/em&gt;, or &lt;em&gt;“did I use my hands too much?”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you’re having trouble finding that blunt person in your life try being blunt yourself. I find that people that give generic &lt;em&gt;“it was good”&lt;/em&gt; feedback find much more to say if you press them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final tip: Just do it!
&lt;/h2&gt;

&lt;p&gt;Ok that’s it for now. I have a lot to say because speaking has been very important to me over the last 6–7 years of my life, and it’s opened up a ton of opportunities that I wouldn’t have had otherwise.&lt;/p&gt;

&lt;p&gt;Hopefully you found these tips helpful. If so let me know, because I could easily come up with 5 more 😉&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: If you want to see me speak in person I’ll be at &lt;a href="https://www.telerik.com/devreach" rel="noopener noreferrer"&gt;DevReach in Sofia, Bulgaria in October&lt;/a&gt;, and at at &lt;a href="https://jsmobileconf.com/" rel="noopener noreferrer"&gt;jsMobileConf in Boston in November&lt;/a&gt;. Both are great events.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>speaking</category>
    </item>
    <item>
      <title>Why ‘Sign in with Apple’ is Actually Pretty Great</title>
      <dc:creator>TJ VanToll</dc:creator>
      <pubDate>Tue, 02 Jul 2019 16:29:41 +0000</pubDate>
      <link>https://dev.to/progress/why-sign-in-with-apple-is-actually-pretty-great-31fl</link>
      <guid>https://dev.to/progress/why-sign-in-with-apple-is-actually-pretty-great-31fl</guid>
      <description>&lt;p&gt;I believe that Apple’s &lt;a href="https://www.zdnet.com/article/wwdc-2019-apple-announces-sign-in-with-apple-feature/" rel="noopener noreferrer"&gt;recently announced ‘Sign in with Apple’ workflow&lt;/a&gt; is an important step for improving the security and usability of login screens.&lt;/p&gt;

&lt;p&gt;In this article I’ll explain what ‘Sign in with Apple’ is, why I believe it’s a great thing for users, the drama around Apple’s implementation, and some of the lingering concerns I have.&lt;/p&gt;

&lt;p&gt;The crux of my argument is that Apple’s new workflow provides badly needed innovation for a process everyone hates—logging in. Even if Apple’s implementation is flawed (which we’ll get to), hopefully this effort will spur other ideas from other tech giants in response, ideally making the login process better for everyone. To show what I’m talking about let’s start with a bit of background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why passwords are the worst
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://blog.lastpass.com/2018/05/psychology-of-passwords-neglect-is-helping-hackers-win.html/" rel="noopener noreferrer"&gt;2018 survey done by LastPass&lt;/a&gt; showed that 59% of people always or mostly use the same password—everywhere. The same study found that 45% of people don’t bother changing their password when their accounts get hacked, and that 42% of people keep passwords in a file, like, a Word doc or Excel spreadsheet.&lt;/p&gt;

&lt;p&gt;As I write this article, the top-selling book in &lt;a href="https://www.amazon.com/gp/bestsellers/books/3705/ref=zg_b_bs_3705_1" rel="noopener noreferrer"&gt;Amazon’s “Internet &amp;amp; Telecommunications” category&lt;/a&gt; is the &lt;em&gt;internet address &amp;amp; password logbook&lt;/em&gt;. Sixth place in the same category is the &lt;em&gt;INTERNET PASSWORD LOGBOOK&lt;/em&gt;, which honestly has a nicer design than the top seller.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fwq6lohfpa6q8h929at6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fwq6lohfpa6q8h929at6b.png" alt="A list of best selling internet &amp;amp; telecommunications books on Amazon"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;We have failed. Failed &lt;strong&gt;hard&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As easy as it is to mock books like this, it’s important to remember that these books are solving a real problem. Using unique passwords is important, but remembering multiple passwords in your head is impossible, and not everyone has the money and tech savviness to use a password manager.&lt;/p&gt;

&lt;p&gt;Funnily enough, you can make a compelling argument that physical-password-book users are more secure than password reusers, assuming the physical-password-book users create unique passwords for each service they use.&lt;/p&gt;

&lt;p&gt;Regardless, the sheer existence of these books is indicative of just how broken the login process is for most users today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making login better
&lt;/h2&gt;

&lt;p&gt;Everyone knows the current way we log in is not ideal, and plenty of tech companies have tried to make this process better. One big improvement to login screen usability was the advent of Single Sign-On, wherein the user uses a single account to authenticate with multiple apps or services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0d89ef7sl0wstdwmuad1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0d89ef7sl0wstdwmuad1.png" alt="A device showing sign in with Google and sign in with Facebook buttons"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;An example of Single Sign-On in an iOS app. The user can use Google or Facebook to authenticate.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The main appeal of SSO is that users don’t have to create and remember a new set of credentials, allowing them to maintain a one-password lifestyle, without the normal downsides of password reuse.&lt;/p&gt;

&lt;p&gt;However, despite its appeal, SSO has its drawbacks as well. Specifically, most SSO providers require that you provide your email address (and sometimes other information as well) to the service you’re authenticating with.&lt;/p&gt;

&lt;p&gt;While providing an email address seems innocuous, shady services will often sell lists of email addresses to advertisers or spammers, greatly increasing the spam mail you have to deal with. Far worse, even if a service has no malicious intentions, data breaches can expose your email to hackers worldwide, opening up the possibility of attacks on accounts you’ve created around the Web with that same email.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Apple
&lt;/h2&gt;

&lt;p&gt;With this backdrop in mind, earlier this month Apple announced a new ‘Sign in with Apple’ feature that, at first glance, works very similarly to the SSO mechanisms from Google, Facebook, and others that thousands of apps use today.&lt;/p&gt;

&lt;p&gt;However, Apple’s new authentication workflow offers one innovative twist: when you sign in with Apple, you get to choose whether you want to share your email with the service you’re signing up for, or, whether to hide it from that service.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Feeq7lt81ljcx55ak2q7a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Feeq7lt81ljcx55ak2q7a.jpg" alt="An example of ‘Sign in with Apple’ in action in a sample app"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;An example of ‘Sign in with Apple’ in action in a sample app.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you choose to hide your email, Apple will create a randomly generated Apple-hosted email address, which will receive all messages on your behalf, and forward them to your legitimate email address.&lt;/p&gt;

&lt;p&gt;This workflow alleviates many of the privacy concerns associated with similar SSO solutions from companies like Google and Facebook. If a shady service sells your email to an advertiser, you’ll be able to easily turn off email forwarding to stop the unwanted spam. Even better, if your generated email address gets exposed in a data breach, you can rest assured, as your Apple-generated email address is unique, therefore hackers will be unable to use that address in subsequent attacks.&lt;/p&gt;

&lt;p&gt;It’s an elegant solution to a common problem; a solution that the likes of Google and Facebook might be hesitant to replicate, because each are companies that earn the bulk of their revenue from advertisers—advertisers that very much like to track users by their email address around the Web. Because Apple does not rely on a similar revenue model, they’re uniquely positioned to innovate and offer users a privacy-focused authentication option. That being said, Apple is not without its own motives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The drama
&lt;/h2&gt;

&lt;p&gt;Apple has a vested interest in being seen as a privacy-focused company, therefore, for them, creating and promoting the ‘Sign in with Apple’ workflow makes a lot of sense.&lt;/p&gt;

&lt;p&gt;More interesting is the news that broke shortly after WWDC, when developers found documentation that stated Apple will &lt;strong&gt;require&lt;/strong&gt; apps that support third-party logins to provide a way to sign in with Apple. Here’s the &lt;a href="https://developer.apple.com/news/?id=06032019j" rel="noopener noreferrer"&gt;exact wording from Apple’s site&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Sign In with Apple will be available for beta testing this summer. It will be required as an option for users in apps that support third-party sign-in when it is commercially available later this year.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This controversial decision immediately sparked a heated debate in the tech world. Those against Apple’s decision argued that Apple is using their monopolistic control over the iOS platform to advance their own SSO solution.&lt;/p&gt;

&lt;blockquote data-lang="en"&gt;
&lt;p&gt;Leveraging their position as gated community guard to push their own single sign on product?  Yeah, thats going to get looked at by the EU at the very least.  Doesn't matter if its an additional option or not, the fact that its required is enough...&lt;/p&gt;— Richard Price (&lt;a class="mentioned-user" href="https://dev.to/richardprice"&gt;@richardprice&lt;/a&gt;) &lt;a href="https://twitter.com/RichardPrice/status/1135680325244182528?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;June 3, 2019&lt;/a&gt;
&lt;/blockquote&gt;

&lt;blockquote data-lang="en"&gt;
&lt;p&gt;woah. It is "walled garden" moves like this that make me glad I write web apps.&lt;/p&gt;— Jared Beck (@jaredowenbeck) &lt;a href="https://twitter.com/jaredowenbeck/status/1135674803850022912?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;June 3, 2019&lt;/a&gt;
&lt;/blockquote&gt;

&lt;blockquote data-lang="en"&gt;
&lt;p&gt;Monopolist gonna monopolist&lt;/p&gt;— Caitlin Fitzharris (@caitlintackles) &lt;a href="https://twitter.com/caitlintackles/status/1136101790112395265?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;June 5, 2019&lt;/a&gt;
&lt;/blockquote&gt;

&lt;p&gt;The timing is indeed interesting, as &lt;a href="https://www.progress.com/blogs/is-the-ios-app-store-a-monopoly-and-is-that-a-good-thing" rel="noopener noreferrer"&gt;Apple is actively being sued by developers and consumers for its App Store policies&lt;/a&gt;. You might think the company would avoid potentially monopolistic moves while other parts of iOS have active anti-trust lawsuits pending—but apparently Apple isn’t worried, or they don’t believe their actions here are monopolistic.&lt;/p&gt;

&lt;p&gt;On the other side of the argument, those in favor of Apple’s decision to require ‘Sign in with Apple’ argue that Apple &lt;em&gt;has&lt;/em&gt; to require their new workflow for apps to actually use the feature.&lt;/p&gt;

&lt;blockquote data-lang="en"&gt;
&lt;p&gt;The problem "Sign In With Apple" is that it's so delightfully privacy-safe that developers won't offer it. They crave your real email address for reengagement campaigns. Fb happily provides it.&lt;/p&gt;— Josh Constine (@JoshConstine) &lt;a href="https://twitter.com/JoshConstine/status/1135648571196239872?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;June 3, 2019&lt;/a&gt;
&lt;/blockquote&gt;

&lt;blockquote data-lang="en"&gt;
&lt;p&gt;Seems like it'd have to be. Otherwise it'd share the same fate as all that BrowserID, OpenID kinda stuff. I think apps often support SSO because they want the data that comes with it. Most were never interested in supporting an option that didn't come with the data.&lt;/p&gt;— Moxie Marlinspike (&lt;a class="mentioned-user" href="https://dev.to/moxie"&gt;@moxie&lt;/a&gt;) &lt;a href="https://twitter.com/moxie/status/1135769100305592326?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;June 4, 2019&lt;/a&gt;
&lt;/blockquote&gt;

&lt;p&gt;This side of the argument is compelling. For better or worse, there’s very little incentive for individual apps to implement privacy-focused features for users, so it stands to reason that most would just ignore Apple’s new API if they could.&lt;/p&gt;

&lt;p&gt;Remember BrowserID? It was a &lt;a href="https://hacks.mozilla.org/2011/07/introducing-browserid-easier-and-safer-authentication-on-the-web/" rel="noopener noreferrer"&gt;feature championed by Mozilla to provide SSO across the web using your email address&lt;/a&gt;. It was a great idea, and had some real benefits for users, but it never took off because &lt;a href="https://techcrunch.com/2014/03/08/mozilla-stops-developing-its-persona-sign-in-system-because-of-low-adoption/" rel="noopener noreferrer"&gt;very few developers actually integrated it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re an app maker, why would you implement BrowserID or ‘Sign in with Apple’ when you have a roadmap full of backlogged tasks? Moreover, the Apple-based workflow aims to prevent your service from gathering user data—data that all marketing and sales departments will have a hard time giving up unless forced.&lt;/p&gt;

&lt;p&gt;So although ‘Sign in with Apple’ isn’t perfect, and although it’s concerning to give Apple even more control over iOS users, at least the mandate will force all apps that use third-party logins to seriously reassess how they handle their user’s data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader point
&lt;/h2&gt;

&lt;p&gt;More broadly speaking, my hope is that Apple’s push here will lead to further advancements into the password management world. It’s 2019 and most people are buying password managers, buying books to write down their passwords, or just giving up and logging in with their cat’s name across the Web. I think we have every right to demand more of the tech giants to help fix this.&lt;/p&gt;

&lt;p&gt;For example, both Google and Facebook claim to care about their users’ privacy, and both have the resources to create similar systems, so why shouldn’t we demand they provide a way to authenticate into third-party apps with similar privacy protections? Better yet, what if a tech company reimagined a BrowserID-like solution that avoids one company having total control?&lt;/p&gt;

&lt;p&gt;There’s no easy win here, but hopefully Apple’s assertive move will spark innovations that move user security and privacy forward.&lt;/p&gt;




&lt;p&gt;At &lt;a href="https://www.progress.com/" rel="noopener noreferrer"&gt;Progress&lt;/a&gt; we already have you covered to work with Apple’s new APIs. &lt;a href="https://www.nativescript.org/" rel="noopener noreferrer"&gt;NativeScript&lt;/a&gt; users can start experimenting with ‘Sign in with Apple’ today with the new &lt;a href="https://github.com/EddyVerbruggen/nativescript-apple-sign-in" rel="noopener noreferrer"&gt;nativescript-apple-sign-in plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And because ‘Sign in with Apple’ is based on OAuth 2.0, &lt;a href="https://www.progress.com/kinvey" rel="noopener noreferrer"&gt;Kinvey&lt;/a&gt; users will be able to work with Apple’s new workflow with &lt;a href="https://devcenter.kinvey.com/nativescript/guides/mobile-identity-connect" rel="noopener noreferrer"&gt;Kinvey’s Mobile Identity Connect&lt;/a&gt; later this fall.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>mobile</category>
      <category>security</category>
    </item>
    <item>
      <title>What the Apple Supreme Court Decision Means for Developers</title>
      <dc:creator>TJ VanToll</dc:creator>
      <pubDate>Thu, 16 May 2019 13:14:08 +0000</pubDate>
      <link>https://dev.to/progress/what-the-apple-supreme-court-decision-means-for-developers-22bh</link>
      <guid>https://dev.to/progress/what-the-apple-supreme-court-decision-means-for-developers-22bh</guid>
      <description>&lt;p&gt;Earlier this week &lt;a href="https://www.theverge.com/2019/5/13/18617727/apple-v-pepper-antitrust-illinois-brick-supreme-court-case-loss"&gt;the US Supreme Court allowed an antitrust lawsuit against Apple to proceed&lt;/a&gt;. If you’re like me this decision sounded super important... but also super confusing.&lt;/p&gt;

&lt;p&gt;To try to clear things up, in this article, we’ll break down what this ruling means for your average developer, the ruling’s effect on the iOS ecosystem, and the ruling’s implications on the future of mobile development.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the ruling mean?
&lt;/h2&gt;

&lt;p&gt;Let’s start with a little background. If you develop an app for the iOS platform, the only way to get that app to users is through the iOS App Store, and Apple takes a 30% cut of all transactions that occur there. That cut ends up being incredibly lucrative for Apple, as App Store revenues were &lt;a href="https://www.cultofmac.com/601492/app-store-google-play-revenue-2018/"&gt;a staggering 46.6 &lt;em&gt;billion&lt;/em&gt; dollars in 2018&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This court case calls Apple’s app-distribution model into question. Specifically, the case’s plaintiff alleged that, by requiring iOS users to buy apps exclusively from the App Store, and taking a 30% commission on all transactions that occur there, Apple is adding a fee that developers pass on to customers. Simply put, the plaintiffs claimed that Apple is using their monopoly over app distribution to raise prices for iOS customers.&lt;/p&gt;

&lt;p&gt;Apple’s counterargument was that iOS users buy apps from developers and not Apple, and therefore Apple is not subject to some complicated provisions of US antitrust laws. (&lt;a href="https://en.wikipedia.org/wiki/Apple_Inc._v._Pepper"&gt;The specifics involve a 1970s legal doctrine called &lt;em&gt;Illinois Brick&lt;/em&gt; and a kind-of confusing “indirect purchaser” discussion.&lt;/a&gt; Being a lawyer must be so fun.)&lt;/p&gt;

&lt;p&gt;The court ruled against Apple, and in a 5–4 decision, allowed iOS customers to sue Apple for allegedly driving up prices of iOS apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What effect does this ruling have?
&lt;/h2&gt;

&lt;p&gt;Let’s start with one important point: this ruling only &lt;em&gt;allows&lt;/em&gt; iOS customers to sue Apple for their app-distribution business model; it did not rule that the App Store violates anti-trust law. However, this ruling clears the way for legal proceedings that attack the App Store’s business model directly, which could force Apple to fundamentally change the way app distribution on iOS works.&lt;/p&gt;

&lt;p&gt;That being said, it’s possible (likely even) that the subsequent cases that challenge this model will take years to play out. After all, &lt;a href="https://www.courtlistener.com/recap/gov.uscourts.cand.249697.124.0.pdf"&gt;the initial court procedures that started the just-resolved case were made in December of 2013&lt;/a&gt;. Therefore, don’t expect this ruling to have any short-term effect on way you build and distribute iOS applications.&lt;/p&gt;

&lt;p&gt;One reason the proceedings may take longer than expecting is dealing with the finer points of the law. For example, suppose the court rules that Apple’s model indeed violated anti-trust policies, and consequently raised prices for consumers. How do you determine the amount prices were raised? And who does the extra money go to? Customers? Developers? The current suit was done on behalf of customers, but it’s very possible that a class-action lawsuit on the behalf of developers could complicate the issue.&lt;/p&gt;

&lt;p&gt;Long term, if legal restrictions do come down on Apple they’re likely positive effect on iOS developers. We might see a future where Apple is forced to permit third-party app stores, or to provide ways for users to side load apps—each of which would give developers more control in how they get their apps to their users.&lt;/p&gt;

&lt;p&gt;Interestingly, these changes would make iOS work a lot more like Android, which already allows for alternative app stores and side loading, and is therefore not subject to these legal actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ruling’s broader effect on the software world
&lt;/h2&gt;

&lt;p&gt;Although these court proceedings have centered around Apple, this ruling has consequences that could extend to software distribution on other platforms, because there are a &lt;em&gt;lot&lt;/em&gt; of platforms that have monopolistic control over app distribution that you might not think about.&lt;/p&gt;

&lt;p&gt;Consider Rokus, Fire TVs, and basically all smart TVs platforms. In each of these, the only way to get apps is through a single vendor-controlled store.&lt;/p&gt;

&lt;p&gt;Here’s another interesting one: Microsoft &lt;a href="https://www.theguardian.com/games/2019/apr/16/discless-xbox-one-release-date-price"&gt;recently announced an Xbox that doesn’t come with a disc drive&lt;/a&gt;. Presumably the only way to purchase games for this new Xbox will be through a Microsoft-provided store; therefore, does that new Xbox violate US anti-trust law?&lt;/p&gt;

&lt;p&gt;These cases will depend on how each platform makes money. For example, if Microsoft doesn’t make any additional money from digital purchases, there’s not much reason for developers or customers to file a lawsuit. But the court’s recent decision does open the door for class-action lawsuits against platforms with a business model similar to Apple’s. &lt;/p&gt;

&lt;h2&gt;
  
  
  Quick takeaways
&lt;/h2&gt;

&lt;p&gt;If you’re still confused by all of this here’s a quick wrap up: the US Supreme Court ruled that customers have the ability to sue Apple for its monopolistic control over iOS app distribution, alleging that this monopoly unfairly raises prices for consumers.&lt;/p&gt;

&lt;p&gt;This ruling doesn’t have any immediate effect on iOS users or developers, but it allows for further lawsuits to proceed—lawsuits that could fundamentally change how iOS app distribution works, and could have a broader effect on how all platforms control app distribution.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>ios</category>
    </item>
    <item>
      <title>Add Basic Crash Reporting to Your NativeScript App</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Thu, 25 Apr 2019 14:47:35 +0000</pubDate>
      <link>https://dev.to/progress/add-basic-crash-reporting-to-your-nativescript-app-2bcb</link>
      <guid>https://dev.to/progress/add-basic-crash-reporting-to-your-nativescript-app-2bcb</guid>
      <description>&lt;p&gt;While I've personally never written a buggy line of code in my life, odds are &lt;em&gt;some&lt;/em&gt; of you out there have. And what's the golden rule of open source?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Identify and fix errors before your users have a chance to create a GitHub issue!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We've collectively taken many approaches to logging errors with our apps (be they web or mobile). In my past as a .NET web developer, I often took a rudimentary approach by leveraging the global &lt;code&gt;Application_Error&lt;/code&gt; event to have my app send a simple email with the error details. Meh 😐. It works, but doesn't provide the consolidated reporting required by enterprise-grade apps.&lt;/p&gt;

&lt;p&gt;Times have changed and numerous, far more robust, "crash reporting" services have emerged. Some of the more popular ones being &lt;a href="http://www.crashprobe.com/" rel="noopener noreferrer"&gt;CrashProbe&lt;/a&gt;, &lt;a href="https://sentry.io/welcome/" rel="noopener noreferrer"&gt;Sentry.io&lt;/a&gt;, and &lt;a href="https://firebase.google.com/docs/crashlytics/" rel="noopener noreferrer"&gt;Firebase Crashlytics&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhn70zpergzvf2vr2jy3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhn70zpergzvf2vr2jy3e.png" alt="sentry.io crashprobe crashlytics logos" width="800" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now if you're not using &lt;em&gt;any&lt;/em&gt; error-reporting mechanism, my instinct is to shame you, but in reality I want to give you a hug and let you know it's going to be ok.&lt;/p&gt;

&lt;p&gt;Today we are going to learn how to leverage Crashlytics (part of Firebase) to log and report on errors in our NativeScript apps for both iOS and Android.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TIP:&lt;/strong&gt; NativeScript 5.2 came with vastly improved &lt;a href="https://www.nativescript.org/blog/nativescript-5.2-comes-with-official-support-for-vue" rel="noopener noreferrer"&gt;error logging improvements&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Firebase Plugin
&lt;/h2&gt;

&lt;p&gt;Quick history lesson: Crashlytics has been around since 2011. They were acquired by Twitter a couple of years later, and most recently acquired by Google for inclusion in their Firebase offering.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not to get all marketingy on you, but if you're looking for a competitive, NativeScript-optimized serverless backend, take a look at &lt;a href="https://devcenter.kinvey.com/nativescript/guides/getting-started" rel="noopener noreferrer"&gt;Progress Kinvey&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While Firebase contains numerous services, the only one we care about today is Crashlytics. And what better way to utilize these services than via the &lt;a href="https://market.nativescript.org/plugins/nativescript-plugin-firebase" rel="noopener noreferrer"&gt;NativeScript Firebase plugin&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ofc6pxl3qkns9f7dvi7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ofc6pxl3qkns9f7dvi7.png" alt="nativescript and firebase" width="369" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get started with Firebase, all you need to do is head over to the &lt;a href="https://console.firebase.google.com/" rel="noopener noreferrer"&gt;Firebase console&lt;/a&gt; and set up a new (free) account.&lt;/p&gt;

&lt;p&gt;From here I would have you follow the &lt;a href="https://github.com/EddyVerbruggen/nativescript-plugin-firebase#prerequisites" rel="noopener noreferrer"&gt;simple instructions&lt;/a&gt; to get your first Firebase project set up and properly configured with your NativeScript app.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TIP:&lt;/strong&gt; During plugin installation, the setup script will prompt you to activate one or more Firebase services. It's kinda important at this point to make sure you mark the &lt;code&gt;Crashlytics&lt;/code&gt; services with a big &lt;code&gt;Y&lt;/code&gt; when prompted. Worst case scenario, you can always reconfigure the plugin by going to the &lt;code&gt;node_modules/nativescript-plugin-firebase&lt;/code&gt; directory and running &lt;code&gt;npm run config&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before you ask, note that the instructions provided allow for usage with NativeScript Core (i.e. plain JavaScript), Angular, or Vue.js!&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with Crashlytics
&lt;/h2&gt;

&lt;p&gt;With the Firebase plugin installed and Firebase initialized in your app, it's time to look more closely at Crashlytics.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; At this time, make sure your &lt;code&gt;firebase.nativescript.json&lt;/code&gt; file has &lt;code&gt;"crashlytics": true&lt;/code&gt; and &lt;code&gt;"crash_reporting": false&lt;/code&gt; noted. This enables Crashlytics and disables the older Firebase crash reporting service. If you have to make a change to this file, remove the &lt;code&gt;platforms&lt;/code&gt; folder in your app (it'll come back at the next build!).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now at this point you can say, "I'M DONE!"...and you wouldn't be wrong. Crashlytics &lt;em&gt;will&lt;/em&gt; start tracking app crashes and display them in your Firebase console:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0qyep6po001yctbjqzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0qyep6po001yctbjqzd.png" alt="app crashes in firebase console" width="800" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But we can do better!&lt;/strong&gt; It's a far better practice to catch errors &lt;em&gt;before&lt;/em&gt; they crash your app and provide a meaningful error message to your users. Sometimes we can't predict error-prone spots, but when we have external dependencies that can change on us (like remote APIs for instance), we should play it safe, check for errors, and log them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capturing an Error
&lt;/h2&gt;

&lt;p&gt;Anytime you want to explicitly log an error, you just need to plug in some tiny code snippets. You first need to import Firebase:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as firebase from 'nativescript-plugin-firebase';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Next, call the Firebase &lt;code&gt;sendCrashLog&lt;/code&gt; method to send a customized error log to your Firebase project:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase.sendCrashLog({
  message: 'You screwed up! Here is the error: ' + error,
  showInConsole: true
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Not only can you compose a custom &lt;code&gt;message&lt;/code&gt; to be logged in Firebase, but you can also optionally show the same message in your console.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A good example of this in practice is the &lt;code&gt;fetch&lt;/code&gt; module. Since &lt;code&gt;fetch&lt;/code&gt; can be configured to &lt;code&gt;catch&lt;/code&gt; an error response, we can log any errors quite easily:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fetch("https://httpbin.org/get")
    .then((response) =&amp;gt; response.json())
    .then((r) =&amp;gt; {
        // do something with the data!
    })
    .catch((error) =&amp;gt; {
        // oh no!
        firebase.sendCrashLog({
          message: 'Error with that one API: ' + error,
          showInConsole: true
        });
    }
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It gets better though. Since &lt;code&gt;sendCrashLog&lt;/code&gt; returns a promise, we can also alert our users to a problem with some friendlier UI (in this case a native alert):&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase.sendCrashLog({&lt;br&gt;
  message: "Error!",&lt;br&gt;
  showInConsole: true&lt;br&gt;
}).then(&lt;br&gt;
    () =&amp;gt; {&lt;br&gt;
      alert({&lt;br&gt;
        title: "Sorry!",&lt;br&gt;
        message: "Hey, we screwed up. Just thought you should know.",&lt;br&gt;
        okButtonText: "OK"&lt;br&gt;
      });&lt;br&gt;
    }&lt;br&gt;
);&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Faking an Error&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;It's all fine and good to implement error logging in your apps, but how do we know it's working? Luckily it's pretty easy to fake a crash on both iOS and Android:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { isIOS, isAndroid } from 'tns-core-modules/platform';&lt;br&gt;
declare const Crashlytics: any;

&lt;p&gt;public forceCrash(): void {&lt;br&gt;
    if (isIOS) {&lt;br&gt;
        // some nonsense code that is guaranteed to throw an exception :)&lt;br&gt;
        var __error = 1/0;&lt;br&gt;
    } else {&lt;br&gt;
        throw new java.lang.Exception("Forced an exception.");&lt;br&gt;
    }&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Crashlytics Reporting&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;With some crashes logged, it's time to head over to your handy Firebase console and check on your report!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpv0jx70aixk59vnez4rk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpv0jx70aixk59vnez4rk.png" alt="crashlytics nativescript example" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy 🐛 squashing!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>javascript</category>
      <category>nativescript</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Offloading Tasks to Worker Threads with NativeScript</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Thu, 18 Apr 2019 13:13:59 +0000</pubDate>
      <link>https://dev.to/progress/offloading-tasks-to-worker-threads-with-nativescript-286n</link>
      <guid>https://dev.to/progress/offloading-tasks-to-worker-threads-with-nativescript-286n</guid>
      <description>&lt;p&gt;Performance. Performance. Performance.&lt;/p&gt;

&lt;p&gt;When we talk to NativeScript developers, performance consistently ranks as one of the top reasons they have chosen NativeScript. It's also something we can never get enough of. While mobile hardware continues to improve, there are always ways to improve the performance, and hence user experience, of the apps we create.&lt;/p&gt;

&lt;p&gt;Aside from providing truly native UI across both iOS and Android, NativeScript has some additional tricks up its sleeve to allow you to customize your app for unique scenarios and squeeze &lt;em&gt;even more&lt;/em&gt; out of those precious CPU cycles.&lt;/p&gt;

&lt;p&gt;Let me introduce you to worker threads on NativeScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worker Threads
&lt;/h2&gt;

&lt;p&gt;Better known in the web world as web workers (or service workers), worker threads allow you to take the single-threaded environment NativeScript provides and turn it into a multi-threaded one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The Workers API in NativeScript is loosely based on the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers" rel="noopener noreferrer"&gt;Web Workers API&lt;/a&gt; and the &lt;a href="https://www.w3.org/TR/workers/" rel="noopener noreferrer"&gt;Web Workers Specification&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/web/ilt/pwa/introduction-to-service-worker" rel="noopener noreferrer"&gt;Service workers&lt;/a&gt; (a type of web worker) are quite popular with Progressive Web App (PWA) developers, as they allow for notifications and other non-blocking tasks. But where PWA functions end, NativeScript picks up the slack.&lt;/p&gt;

&lt;p&gt;As evidenced by this NativeScript demo app, 99% of the time the single-threaded model is just fine (as running everything on the UI thread is super fast):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqaaf6j6qfdzocjmnt8qc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqaaf6j6qfdzocjmnt8qc.gif" alt="nativescript demo app" width="253" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are however scenarios when operations can take longer and hence impact the app's UI. This can lead to the app feeling slower than it should.&lt;/p&gt;

&lt;p&gt;To solve this problem, NativeScript provides a &lt;a href="https://docs.nativescript.org/core-concepts/multithreading-model#workers-api" rel="noopener noreferrer"&gt;Workers API&lt;/a&gt; which allows you to create tasks executed on separate threads that are completely isolated from the main app context.&lt;/p&gt;

&lt;p&gt;Let's take a look at some examples of when (and when not) to use workers with a NativeScript app.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use a Worker
&lt;/h2&gt;

&lt;p&gt;Virtually any task that can run outside of synchronous UI operations is, at least in theory, a candidate for worker threads.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TIP:&lt;/strong&gt; Before you start thinking a worker thread is a silver bullet for complicated performance issues, make sure you take into account the overhead needed to spin up additional threads.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CPU-intensive, non-UI related tasks are probably the best examples of when worker threads can be beneficial. If you are &lt;em&gt;very heavy&lt;/em&gt; user of Google Analytics, you may find yourself measuring every user action, page view, feature use, and remote service call in your app. Even though these calls should run asynchronously, they can still have a negative impact on the main thread.&lt;/p&gt;

&lt;p&gt;Another good example is image processing - a CPU-intensive task on its own, made much more complicated when you mix it into the UI thread!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A great example of offloading image processing is presented in these demo apps for &lt;a href="https://github.com/NativeScript/demo-workers" rel="noopener noreferrer"&gt;NativeScript Core&lt;/a&gt; and &lt;a href="https://github.com/NativeScript/worker-loader" rel="noopener noreferrer"&gt;Angular&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Sample Code
&lt;/h2&gt;

&lt;p&gt;Lets look at how we can build a very simple worker ourselves:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var worker = new Worker("./workers/my-worker.js");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The above code initiates a new thread (runtime instance) and executes the script referenced (&lt;code&gt;my-worker.js&lt;/code&gt;). Next, we will want to communicate with the worker and/or receive a message or result from it. This is accomplished with messages:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// send a message to our worker
worker.postMessage("Hello worker thread!");

// receive a message from our worker
worker.onmessage = function(msg) {
    console.log("Received this message from the worker thread: " + msg.data);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In our &lt;code&gt;my-worker.js&lt;/code&gt; file, we will provide the &lt;code&gt;onmessage&lt;/code&gt; method to &lt;em&gt;receive&lt;/em&gt; the message from the main thread:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;onmessage = function(msg) {
    console.log("Received this message from the main thread: " + msg.data);

    // perform some crazy cpu-intensive task here!

    // send a message back to the main thread
    postMessage("Hello main thread!");

    close();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Error Handling and Terminating the Thread
&lt;/h3&gt;

&lt;p&gt;Using worker threads can be a bit scary, as threads left open can consume resources and potentially bloat memory usage and destroy performance. Therefore, make sure you catch any errors and close/terminate the threads when you are done:&lt;/p&gt;

&lt;p&gt;Basic example in &lt;code&gt;my-worker.js&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;onerror = function(e) {
    console.log("Oh no! Worker thread error: " + e);
    return true;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And in your app code (should you want to display an error):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;worker.onerror = function(e) {
    console.log("Worker thread error: " + e);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT:&lt;/strong&gt; Worker threads are kept alive until explicitly terminated by the main thread or closed themselves!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Close the thread in &lt;code&gt;my-worker.js&lt;/code&gt; with &lt;code&gt;close();&lt;/code&gt; (as shown above). Or terminate the thread in your app code with &lt;code&gt;worker.terminate();&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If the worker thread is not terminated/closed, the garbage collector will not collect and dispose of the worker instance.&lt;/p&gt;

&lt;h2&gt;
  
  
  When NOT to Use a Worker
&lt;/h2&gt;

&lt;p&gt;It's important to keep in mind that every time you spin up a new worker thread, you are adding to the resource and memory footprint of your app. This means that should you spin up too many at once or use them in the wrong situations, the &lt;strong&gt;performance of your app may actually decrease&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you think a worker thread will help you process input from a form, or displaying a chart, or many other basic app features, think again. The NativeScript framework has already been optimized for the vast majority of these scenarios.&lt;/p&gt;

&lt;p&gt;Your best bet is always to measure the functional performance of your app on a variety of both iOS and Android physical devices during development!&lt;/p&gt;

&lt;p&gt;That being said, workers can be super useful in edge cases where performance of the main thread is lacking. The best you can do is test individual scenarios and measure which route is best for your situation.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>javascript</category>
      <category>nativescript</category>
      <category>workers</category>
    </item>
    <item>
      <title>Secure Your Mobile App - Episode Four (Secure User Auth)</title>
      <dc:creator>Rob Lauer</dc:creator>
      <pubDate>Tue, 19 Mar 2019 14:51:18 +0000</pubDate>
      <link>https://dev.to/progress/secure-your-mobile-app---episode-four-secure-user-auth-5ep1</link>
      <guid>https://dev.to/progress/secure-your-mobile-app---episode-four-secure-user-auth-5ep1</guid>
      <description>&lt;p&gt;Whether you are developing a traditional native app, a cross-compiled app from the likes of Appcelerator or Xamarin, a hybrid app with Ionic, or a JavaScript-native app with NativeScript or React Native, a common thread that runs through each is app security.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/progress/secure-your-mobile-app---episode-three-securing-data-in-transit-491f"&gt;In the previous article&lt;/a&gt;, we made sure that data in transit was 100% secure from end-to-end, device to cloud. We learned that by leveraging &lt;a href="https://www.progress.com/kinvey" rel="noopener noreferrer"&gt;Progress Kinvey&lt;/a&gt; we have a turnkey solution ensuring data integrity, compliance, and robust performance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Watch the webinar &lt;a href="https://www.progress.com/campaigns/kinvey/best-practices-for-securing-your-mobile-apps" rel="noopener noreferrer"&gt;Best Practices for Securing Your Mobile Apps&lt;/a&gt; to get some tips and tricks on NativeScript security!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As we wrap up this series, we want to conclude with a topic that is critically important: securely authenticating and authorizing your app users.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part One:&lt;/strong&gt; &lt;a href="https://dev.to/progress/secure-your-mobile-app---episode-one-protecting-the-code-58e"&gt;Protecting Your Source Code&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part Two:&lt;/strong&gt; &lt;a href="https://dev.to/progress/secure-your-mobile-app---episode-two-securing-data-at-rest-4ami"&gt;Securing Data at Rest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part Three:&lt;/strong&gt; &lt;a href="https://dev.to/progress/secure-your-mobile-app---episode-three-securing-data-in-transit-491f"&gt;Ensuring Data Integrity Between Device and Server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part Four:&lt;/strong&gt; Enterprise User Authentication and Authorization (hey that's today!)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Check out the new course from &lt;a href="https://nativescripting.com/course/securing-nativescript-applications" rel="noopener noreferrer"&gt;NativeScripting.com&lt;/a&gt; on mobile app security and get 30% off with the code: NSSECURE.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Biometric Authentication
&lt;/h2&gt;

&lt;p&gt;We are long past the days of passwords and passcodes being the standard in securely authenticating our app users. With biometric security capabilities (e.g. fingerprint and facial id) built in to most iOS and Android devices, our apps should be focused on leveraging these vastly more secure technologies.&lt;/p&gt;

&lt;p&gt;For fingerprint recognition, &lt;a href="https://support.apple.com/en-us/HT201371" rel="noopener noreferrer"&gt;Touch ID&lt;/a&gt; is an iOS feature that allows users to unlock their devices with the tip of their finger. Android has an equivalent effectively known as "fingerprint scanning". Both are, of course, based on authenticating users via their fingerprints scanned before devices are unlocked.&lt;/p&gt;

&lt;p&gt;For facial recognition, &lt;a href="https://www.apple.com/iphone-xs/face-id/" rel="noopener noreferrer"&gt;Face ID&lt;/a&gt; is a system designed and developed by Apple for the iPhone X line. Face ID will likely eventually succeed Touch ID as the defacto biometric authentication technology on iOS devices.&lt;/p&gt;

&lt;p&gt;To use these biometric authentication options in your app, there is a fantastic plugin built by &lt;a href="https://twitter.com/eddyverbruggen" rel="noopener noreferrer"&gt;Eddy Verbruggen&lt;/a&gt; called &lt;a href="https://market.nativescript.org/plugins/nativescript-fingerprint-auth" rel="noopener noreferrer"&gt;nativescript-fingerprint-auth&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd6un4tpyxy1o5kbs3gd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd6un4tpyxy1o5kbs3gd.png" alt="biometric security with nativescript" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TIP:&lt;/strong&gt; Even though it's called a "fingerprint" plugin, it also &lt;a href="https://market.nativescript.org/plugins/nativescript-fingerprint-auth#face-id-ios" rel="noopener noreferrer"&gt;supports Face ID&lt;/a&gt; on the iPhone X line of devices!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Basic usage of this plugin includes capabilities such as checking if biometric support is available:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { FingerprintAuth, BiometricIDAvailableResult } from "nativescript-fingerprint-auth";

class MyClass {
  private fingerprintAuth: FingerprintAuth;

  constructor() {
    this.fingerprintAuth = new FingerprintAuth();
  }

  this.fingerprintAuth.available().then((result: BiometricIDAvailableResult) =&amp;gt; {
    console.log(`Biometric ID available? ${result.any}`);
    console.log(`Touch? ${result.touch}`);
    console.log(`Face? ${result.face}`);
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And verifying a fingerprint (or face on iPhone X):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fingerprintAuth.verifyFingerprint(
    {
      title: 'Android title', // optional title (used only on Android)
      message: 'Scan yer finger', // optional (used on both platforms) - for FaceID on iOS see the notes about NSFaceIDUsageDescription
      authenticationValidityDuration: 10, // optional (used on Android, default 5)
      useCustomAndroidUI: false // set to true to use a different authentication screen (see below)
    })
    .then((enteredPassword?: string) =&amp;gt; {
      if (enteredPassword === undefined) {
        console.log("Biometric ID OK")
      } else {
        // compare enteredPassword to the one the user previously configured for your app (which is not the users system password!)
      }
    })
    .catch(err =&amp;gt; console.log(`Biometric ID NOT OK: ${JSON.stringify(err)}`)
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Check out &lt;a href="https://www.progress.com/blogs/how-to-integrate-biometric-authentication-in-ios-and-android" rel="noopener noreferrer"&gt;this tutorial&lt;/a&gt; for a walkthrough of using this plugin with NativeScript and a Progress Kinvey backend.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The nativescript-fingerprint-auth is a great way to easily add biometric security to our apps. But what about using existing secure protocols and services to tie a verified individual to authorized roles in our backend systems?&lt;/p&gt;

&lt;h2&gt;
  
  
  OAuth 2.0
&lt;/h2&gt;

&lt;p&gt;You've probably heard of OAuth before, as &lt;a href="https://oauth.net/2/" rel="noopener noreferrer"&gt;OAuth 2.0&lt;/a&gt; is a commonly used industry-standard protocol for user authorization. Thanks to our extensive community of plugin developers, there is in fact a plugin for interacting with OAuth 2.0 in NativeScript, the &lt;a href="https://market.nativescript.org/plugins/nativescript-oauth2" rel="noopener noreferrer"&gt;nativescript-oauth2&lt;/a&gt; plugin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8weeiu83n8c1vypzfyk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8weeiu83n8c1vypzfyk.png" alt="oauth 2.0 nativescript plugin" width="300" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The OAuth 2.0 plugin helps to simplify access to OAuth providers that support the OAuth 2.0 protocol (e.g. Microsoft, Facebook, and Google), but you can also roll your own (or even use your organization's own provider).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be sure to &lt;a href="https://market.nativescript.org/plugins/nativescript-oauth2" rel="noopener noreferrer"&gt;consult the plugin documentation&lt;/a&gt; for help getting started.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're curious about how the technical implementation of this plugin works with NativeScript apps, check the provided demo apps available for all NativeScript-supported frameworks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/alexziskind1/nativescript-oauth2/tree/master/demo-angular" rel="noopener noreferrer"&gt;Angular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alexziskind1/nativescript-oauth2/tree/master/demo-vue" rel="noopener noreferrer"&gt;Vue.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alexziskind1/nativescript-oauth2/tree/master/demo" rel="noopener noreferrer"&gt;Core (plain TypeScript)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Easy Enterprise Authentication
&lt;/h2&gt;

&lt;p&gt;Still with me? Ok, I'll admit it: user authentication is a giant pain. 😥&lt;/p&gt;

&lt;p&gt;If you're rolling our own auth provider, you have to tediously set up login forms, password recovery systems, and the supporting backend infrastructure. Or maybe you’re trying to integrate with an existing enterprise auth provider that uses acronyms like SAML, OAuth (see above), or Open ID. 😵&lt;/p&gt;

&lt;p&gt;For &lt;em&gt;easier&lt;/em&gt; enterprise authentication, look no further than the &lt;a href="https://docs.nativescript.org/sidekick/user-guide/enterprise-auth/intro" rel="noopener noreferrer"&gt;Enterprise Auth template&lt;/a&gt; in &lt;a href="https://www.nativescript.org/nativescript-sidekick" rel="noopener noreferrer"&gt;NativeScript Sidekick&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7hnmp9rgvbofkk2k1bjv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7hnmp9rgvbofkk2k1bjv.png" alt="enterprise authentication with nativescript sidekick" width="700" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NativeScript Sidekick offers an &lt;a href="https://docs.nativescript.org/sidekick/user-guide/enterprise-auth/intro" rel="noopener noreferrer"&gt;Enterprise Auth template&lt;/a&gt;, as well as a handful of new features designed to help you connect to your authentication provider as quickly as possible. Powered by &lt;a href="https://www.progress.com/kinvey" rel="noopener noreferrer"&gt;Progress Kinvey&lt;/a&gt;, the Enterprise Auth template guides you through the process of connecting to your provider of choice and makes it easy to customize the look and feel of your login screen.&lt;/p&gt;

&lt;p&gt;You can read more about using the Enterprise Auth app template &lt;a href="https://www.nativescript.org/blog/enterprise-authentication-made-easier-with-nativescript" rel="noopener noreferrer"&gt;here on the NativeScript blog&lt;/a&gt;, or even register for a &lt;a href="https://courses.nativescripting.com/p/nativescript-enterprise-auth/?product_id=308158&amp;amp;coupon_code=AUTH101" rel="noopener noreferrer"&gt;free online course on NativeScripting.com&lt;/a&gt; that walks you through the usage.&lt;br&gt;
​&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TIP:&lt;/strong&gt; If you are rolling your own authentication system, you'll want to design a UI that is intuitive and as user-friendly as possible. We've put together a &lt;a href="https://www.nativescript.org/blog/building-an-awesome-login-screen-with-nativescript" rel="noopener noreferrer"&gt;blog post and example app&lt;/a&gt; to show off some best practices for building your own &lt;em&gt;awesome&lt;/em&gt; login screen with NativeScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion of the 📱🔐 Series
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;We've covered A LOT over the past four articles!&lt;/strong&gt; We started out learning how to easily &lt;a href="https://dev.to/progress/secure-your-mobile-app---episode-one-protecting-the-code-58e"&gt;secure our source code&lt;/a&gt;, moved to making sure &lt;a href="https://dev.to/progress/secure-your-mobile-app---episode-two-securing-data-at-rest-4ami"&gt;data stored locally is safe and encrypted&lt;/a&gt;, talked about some best practices for &lt;a href="https://dev.to/progress/secure-your-mobile-app---episode-three-securing-data-in-transit-491f"&gt;securing data over the wire&lt;/a&gt;, and concluded with some easy ways to make sure we are securely authenticating and authorizing our end users.&lt;/p&gt;

</description>
      <category>nativescript</category>
      <category>javascript</category>
      <category>security</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
