<?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>Forem: Ishwar398</title>
    <description>The latest articles on Forem by Ishwar398 (@ishwar398).</description>
    <link>https://forem.com/ishwar398</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%2Fuser%2Fprofile_image%2F1127416%2Fef110a6a-3742-4a4f-b4fb-447552dd2970.png</url>
      <title>Forem: Ishwar398</title>
      <link>https://forem.com/ishwar398</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ishwar398"/>
    <language>en</language>
    <item>
      <title>Using Azure Doc intelligence for OCR</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Mon, 06 Nov 2023 22:04:35 +0000</pubDate>
      <link>https://forem.com/ishwar398/using-azure-doc-intelligence-for-ocr-37f0</link>
      <guid>https://forem.com/ishwar398/using-azure-doc-intelligence-for-ocr-37f0</guid>
      <description>&lt;p&gt;Whenever we need to read text from a PDF File, Image, Doc file etc. we use Optical Character Recognition (OCR). With OCR, we can read a document, handwritten or typed, across all the supported formats.&lt;br&gt;
Azure Document Intelligence is an AI service which embeds the intelligence of AI in performing OCR. There are many use cases of Azure Document Intelligence other than OCR, but for this post we will stick to OCR.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating the Azure Document Intelligence service
&lt;/h2&gt;

&lt;p&gt;Search for Azure Document intelligence on the Azure portal and the click on Create. &lt;br&gt;
Fill in the details like the Subscription, Resource Group, Region, Name and the Pricing Tier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qyJUSU5_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ugmv0x4ufby6t8s06fbd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qyJUSU5_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ugmv0x4ufby6t8s06fbd.png" alt="Document Intelligence Service creation" width="660" height="657"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Performing OCR
&lt;/h2&gt;

&lt;p&gt;We can perform OCR on a document using 2 ways. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using the File URL (40MB size limitation for F0 tier)&lt;/li&gt;
&lt;li&gt;Using the actual file (4MB size limitation for F0 tier)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Using the File URL
&lt;/h2&gt;

&lt;p&gt;When we need to perform OCR on the file that's present on some storage or is hosted, we can use the URL of the file to perform OCR on it. The only requirement here is that the URL should be publicly accessible. If the URL is not publicly available, Document Intelligence will not be able to read it.&lt;br&gt;
When using this way, the POST request body should contain the URL of the file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ 
   'urlSource': 'URL_OF_THE_FILE'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Along with this, the header value for Content-Type should be as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Content-Type: "application/json"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using the actual file
&lt;/h2&gt;

&lt;p&gt;Now, if we need to send the file directly to the Document intelligence service, we can use this way.&lt;br&gt;
Here, the POST request body will contain the file, and the header value for Content-Type will be as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Content-Type: "application/octet-stream"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Document Intelligence in action for doing OCR
&lt;/h2&gt;

&lt;p&gt;Once everything is setup, we can use the Document Intelligence service using REST API. There are other options available as well. But for this post, we will be focusing on REST API.&lt;br&gt;
Getting the OCR results from Document Intelligence is a two step process. &lt;br&gt;
The first step is to upload the file using any of the desired way i.e. either by sending a file directly or by providing the File URL.&lt;br&gt;
This will provide us with the Result ID.&lt;/p&gt;

&lt;p&gt;The second step is to use the Result ID to get the results. &lt;/p&gt;

&lt;p&gt;First. let's try using the File URL.&lt;br&gt;
I'll be using Postman to call the API endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt;&lt;br&gt;
We need to send the document for analysis. The API endpoints should be as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{endpoint}/formrecognizer/documentModels/{modelID}:analyze?api-version=2023-07-31
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; The endpoint provided on the Azure portal for the Document Intelligence service&lt;br&gt;
&lt;strong&gt;modelID:&lt;/strong&gt; prebuilt-document (using this model for OCR)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Setting up the headers&lt;/strong&gt;&lt;br&gt;
Apart from the normal headers, we need to add two headers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ocp-Apim-Subscription-Key:&lt;/strong&gt; Get this key from the Azure portal&lt;br&gt;
&lt;strong&gt;Content-Type:&lt;/strong&gt; "application/json"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body:&lt;/strong&gt;&lt;br&gt;
Currently, I'm considering a dummy hosted PDF file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ 
   "urlSource": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Send this as a POST request. If everything is correct, you'll get a 202 Accepted response. Check the response header. You'll get a &lt;strong&gt;apim-request-id&lt;/strong&gt; in the headers.&lt;br&gt;
Copy this request id.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aWczUKQE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e7ppiwivlj5naar0o4qw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aWczUKQE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e7ppiwivlj5naar0o4qw.png" alt="Response Headers" width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Getting the results&lt;/strong&gt;&lt;br&gt;
To Get the results for OCR, we need to make a GET request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; your azure document intelligence service endpoint&lt;br&gt;
&lt;strong&gt;modelID:&lt;/strong&gt; prebuilt-document&lt;br&gt;
&lt;strong&gt;resultId:&lt;/strong&gt; apim-request-id from the first step&lt;/p&gt;

&lt;p&gt;Make this GET request. If everything is correct, you'll get a 200OK response along with the content of the PDF file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ASN5lf89--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uedsog38mtiv5u9v2c7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ASN5lf89--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uedsog38mtiv5u9v2c7c.png" alt="OCR Result" width="800" height="202"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Using the actual file
&lt;/h2&gt;

&lt;p&gt;Now, if we need to send the file to the service instead of the File URL, only 2 things will change in the Step 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Content-Type: "application/octet-stream"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QPIudKct--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4aru7u4zenfcfi6oxg37.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QPIudKct--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4aru7u4zenfcfi6oxg37.png" alt="Content-Type" width="690" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the body, instead of the File URL, we need to send the actual file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HBC2sC8v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/khasyya1w3kopgpwn3uk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HBC2sC8v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/khasyya1w3kopgpwn3uk.png" alt="Body for the POST request" width="800" height="119"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Send the request, if everything is correct you'll get the &lt;strong&gt;apim-request-id&lt;/strong&gt;, which can then be used in similar way.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>ocr</category>
      <category>ai</category>
    </item>
    <item>
      <title>Adding Cosmos DB to Azure Search index</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Mon, 06 Nov 2023 19:30:39 +0000</pubDate>
      <link>https://forem.com/ishwar398/adding-cosmos-db-to-azure-search-index-5fa4</link>
      <guid>https://forem.com/ishwar398/adding-cosmos-db-to-azure-search-index-5fa4</guid>
      <description>&lt;p&gt;In continuation to &lt;a href="https://dev.to/ishwar398/azure-cognitive-search-searching-documents-with-blob-storage-1l6m"&gt;Setting Cognitive Search with Blob Storage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the above post, we saw how can we integrate Azure blob storage with Azure cognitive search. In this post, we will learn how can we create an Indexer with Cosmos DB, and push the indexer to the same index where Blob Storage indexer is pushing results to.&lt;br&gt;
Due to this, search will be done across multiple sources i.e. Blob and Cosmos.&lt;/p&gt;

&lt;p&gt;We already have Azure cognitive search and Cosmos DB set up. &lt;/p&gt;
&lt;h2&gt;
  
  
  Cosmos DB data:
&lt;/h2&gt;

&lt;p&gt;We have a cosmos DB data present in a specific format. We can decide on which fields we want to be searchable. Based on that selection, we need to decide on the fields which we will be using in the index.&lt;br&gt;
Below is a format which we will be using for setting up the index.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
        "id": UNIQUE_ID,
        "filename": FILENAME,
        "format": FORMAT,
        "tags": [
            {
                "type": EXAMPLE_SEARCH_FIELD,
                "city": EXAMPLE_SEARCH_FIELD
            }
        ]
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above format, we will be keeping the filename, format and the tags as a searchable entity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the data source in Azure Cognitive Search
&lt;/h2&gt;

&lt;p&gt;Just as we added the Blob Storage as the data source, we will be adding a Cosmos DB data source as well.&lt;/p&gt;

&lt;p&gt;Click on the &lt;strong&gt;Data Sources&lt;/strong&gt; option from the left pane and click on the &lt;strong&gt;Add Data Source&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4Ro0d-Fi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kjlfg5raqcpktxn3kvyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4Ro0d-Fi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kjlfg5raqcpktxn3kvyh.png" alt="Add Data Source" width="597" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;Cosmos DB&lt;/strong&gt; from the Data Source and give it a name. Then click on the Choose an existing connection link. This will bring the results of the Cosmos DB accounts in that resource group.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--64yqIe3b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m6dgbex8mdp3u1b1sc1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--64yqIe3b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m6dgbex8mdp3u1b1sc1v.png" alt="Adding Cosmos Data Source" width="800" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, the dropdown for the Database and Collection will be filled. Select appropriate items from the dropdown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1CDx9XLv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1hknabw3hp9wa1t0yf44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1CDx9XLv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1hknabw3hp9wa1t0yf44.png" alt="Selecting Database and Collection" width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, we need to write a query which will run against the DB and bring the relevant results. This query should always bring the results in incremental manner, which means it should only fetch the results which are new and not present in the Search index. To do so, it takes help of the &lt;strong&gt;_ts&lt;/strong&gt; field automatically provided by the Cosmos DB. And it maintains the values of the last &lt;strong&gt;_ts&lt;/strong&gt; value in &lt;strong&gt;@HighWaterMark&lt;/strong&gt; field.&lt;br&gt;
In our case, we need the above mentioned fields as Searchable.&lt;br&gt;
So, our query will look like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT c.id, c.filename, c.format, t.type, t.city FROM c join t in c.tags WHERE c._ts &amp;gt;= @HighWaterMark ORDER BY c._ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the data source, it will be now visible in the Data Sources list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cfHvLNbR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cdxtxc4ndqim1w6f98qs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cfHvLNbR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cdxtxc4ndqim1w6f98qs.png" alt="List of Data Sources" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the Indexer
&lt;/h2&gt;

&lt;p&gt;Click on the &lt;strong&gt;Indexers&lt;/strong&gt; option from the left pane, and then click on &lt;strong&gt;Add Indexer&lt;/strong&gt;.&lt;br&gt;
Give the name to the Indexer, select the target index, and then select the newly created data source&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M01kALBM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pr15t95933ppf4ttrwz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M01kALBM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pr15t95933ppf4ttrwz6.png" alt="Add Indexer" width="785" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fill the schedule as per requirement. As per the schedule, the Indexer will run and fetch the data from the Cosmos DB.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vKD7xqtG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c197senhyuclv3gh41dl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vKD7xqtG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c197senhyuclv3gh41dl.png" alt="Image description" width="782" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save the indexer, and then run it. It will fetch the data from the DB.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--forCNRlG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/noatha9184feoxr5mcxv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--forCNRlG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/noatha9184feoxr5mcxv.png" alt="Run the indexer" width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting up the index&lt;/strong&gt;&lt;br&gt;
Now, once we have the data source and indexer working fine, lets set up the index.&lt;br&gt;
Click on the index which we selected as the target index in the cosmos indexer. And then click on &lt;strong&gt;Fields&lt;/strong&gt;. You can also see the number of documents currently present in the index.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cd5xOzmi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wklg3o7plvlznnff7eo0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cd5xOzmi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wklg3o7plvlznnff7eo0.png" alt="Setting up the index" width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the fields which we selected from the cosmos db query.&lt;br&gt;
You can select which fields you want as Searchable, Retrievable, Sortable, Facetable etc. which adding the fields.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C6nvE4m8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jnrzovyaz1a4qois2k74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C6nvE4m8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jnrzovyaz1a4qois2k74.png" alt="Search Fields" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can try the Search option in the Index. The entries from the Cosmos will be shown in the Search results.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yNQtfCUX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a07f4p1ohvsy3n74kzzc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yNQtfCUX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a07f4p1ohvsy3n74kzzc.png" alt="Search Results" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Azure Cognitive Search - Searching documents with Blob Storage</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Mon, 02 Oct 2023 07:31:08 +0000</pubDate>
      <link>https://forem.com/ishwar398/azure-cognitive-search-searching-documents-with-blob-storage-1l6m</link>
      <guid>https://forem.com/ishwar398/azure-cognitive-search-searching-documents-with-blob-storage-1l6m</guid>
      <description>&lt;p&gt;We will setup a complete flow on how we can use both Cosmos DB and Blob storage together in Azure Cognitive Search.&lt;br&gt;
Azure Cognitive Search is a powerful tool which can help in searching documents across both Cosmos and Blob based on various parameters. &lt;br&gt;
Cosmos DB provides the parameters of the file which can be helpful in searching like extension, filename, author.&lt;br&gt;
Blob Storage, where the actual files are present, can be used in Search when we have to search the document based on the content in the document. &lt;br&gt;
The terms which we will be using in this post will be referenced from this &lt;a href="https://dev.to/ishwar398/getting-started-with-azure-cognitive-search-1f9e"&gt;post&lt;/a&gt; which talks about the theoretical details of Azure Search.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the data sources (assuming Blob and Cosmos are already created)
&lt;/h2&gt;

&lt;p&gt;From the left pane in the Azure Cognitive Search, select the data sources option. Click on the &lt;strong&gt;Add Data Source&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IvVoo8JZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w34l5ok6wazqedfxatxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IvVoo8JZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w34l5ok6wazqedfxatxk.png" alt="Adding a data source" width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cognitive Search gives us option to select from a variety of sources.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8mhKjY7m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hkxwpl78ahbvw2tgmnxd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8mhKjY7m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hkxwpl78ahbvw2tgmnxd.png" alt="Selecting the data source" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this post, we will be selecting the Azure blob storage. On selecting Azure blob storage, it will ask for selecting the 'Connection string'. There an option below to select from existing connection. &lt;br&gt;
On clicking this, you'll get the list of Blob storages in the subscription. Select the blob storage and then select the container.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q2z_o8ba--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iitj5zx3chepti2vagp6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q2z_o8ba--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iitj5zx3chepti2vagp6.png" alt="Select the container" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you select the instance, the connection string will be automatically populated. Provide a name to it.&lt;br&gt;
If you need to read the files from a specific folder in the container, you can add the path in the 'Blob Folder' box.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---_enYdCz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8w2rkqhkg1egmr3620jp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---_enYdCz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8w2rkqhkg1egmr3620jp.png" alt="Blob Folder" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the Search's data source section, you'll be able to see the data source.&lt;br&gt;
Now click on &lt;strong&gt;Indexes&lt;/strong&gt; option, and click on &lt;strong&gt;Add Index&lt;/strong&gt;.&lt;br&gt;
Then we need to add the fields on which we will be making a search.&lt;br&gt;
By default, when we select Blob storage as Data Source, the indexer is able to perform an OCR on the text documents (PDF, Word, RTF etc.) and add the content of the document in the search index. To make the document searchable by the content within them, you'll need to add the &lt;strong&gt;content&lt;/strong&gt; field in the index and mark it as Searchable. &lt;br&gt;
This will be a string search and there needs to be an Analyzer selected for it. &lt;br&gt;
Analyzer defines your searching strategy, how your search query will be parsed, how the AND, OR, NOT will be handled. For this example, we will be using the &lt;strong&gt;Standard Lucene&lt;/strong&gt; parser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Em1cQLY4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmysrr4rfhpu3qez1a8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Em1cQLY4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmysrr4rfhpu3qez1a8c.png" alt="Adding Index" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the index is created, it will be shown in the Index list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cFBtbNy---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ofp0m4kqsfkkg4r95ucz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cFBtbNy---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ofp0m4kqsfkkg4r95ucz.png" alt="Index" width="800" height="115"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we will start creating the Indexer. Indexer is the link between the Data Source and the Index. &lt;/p&gt;

&lt;p&gt;Click on &lt;strong&gt;Indexers&lt;/strong&gt; and then click on &lt;strong&gt;Add Indexer&lt;/strong&gt;.&lt;br&gt;
Fill the basic details.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Give a proper name to the indexer&lt;/li&gt;
&lt;li&gt;Select the target index where the indexer will push the data&lt;/li&gt;
&lt;li&gt;Choose the data source from where the indexer will pull the data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1Adii__B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8llk8fzqyutj9dglwd2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1Adii__B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8llk8fzqyutj9dglwd2i.png" alt="Indexer - Basic details" width="800" height="713"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Skills is something we will see in a different post, so for now skip it.&lt;/li&gt;
&lt;li&gt;Select the schedule when the indexer should run and fetch the data from the data source.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the Advanced settings, you can set which data types you want to include or exclude. Also, add enrichments etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indexer in action
&lt;/h2&gt;

&lt;p&gt;The data source configured has 2 documents in it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D5uSqy90--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/44sqi9xb0jv7gj3105mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D5uSqy90--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/44sqi9xb0jv7gj3105mi.png" alt="Files in blob storage container configured as source" width="800" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we run the indexer, it fetches the documents in this container.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b35dLK-4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oby4otd5rc78d7128vss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b35dLK-4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oby4otd5rc78d7128vss.png" alt="Documents fetched from the blob storage" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same document count we'll be able to see on the index as well since the indexer has pushed the data to the target index.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bl91r2S8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trqdvwc2llanmejyhzxp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bl91r2S8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trqdvwc2llanmejyhzxp.png" alt="Document count on Index" width="800" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Search in action
&lt;/h2&gt;

&lt;p&gt;The document uploaded to the search is as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n5JPcEkC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wamqf0jgxy2o5u5ejdm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n5JPcEkC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wamqf0jgxy2o5u5ejdm.png" alt="Test document uploaded" width="586" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default, the Azure cognitive search provides OCR on the text documents (PDF, DOCX, RTF etc.), so it is able to fetch the content from the PDF file we uploaded and index the content as well. &lt;br&gt;
So we if try to search for anything from the content, it brings back the file as result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XdDZE_wG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o2lfbu55eop2jcsysfoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XdDZE_wG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o2lfbu55eop2jcsysfoq.png" alt="Search Results when we search for any word from the document" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>search</category>
      <category>cosmos</category>
      <category>blob</category>
    </item>
    <item>
      <title>Publishing your Xamarin app to Apple Store</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Sat, 16 Sep 2023 12:49:29 +0000</pubDate>
      <link>https://forem.com/ishwar398/publishing-your-xamarin-app-to-apple-store-4p22</link>
      <guid>https://forem.com/ishwar398/publishing-your-xamarin-app-to-apple-store-4p22</guid>
      <description>&lt;h2&gt;
  
  
  1 Introduction
&lt;/h2&gt;

&lt;p&gt;Cross platform mobile application development is a growing phenomenon due to its single code approach. Development of cross platform application with these new technologies is quick, but what matters more is how the apps that are developed on a single code base can be published to the respective application stores, what all kinds of testing is required for it and many more. This paper helps to cover these topics which will be useful to test single code base Applications before they are published to the App Stores.&lt;/p&gt;

&lt;h2&gt;
  
  
  2 Submitting an iOS application
&lt;/h2&gt;

&lt;h2&gt;
  
  
  2.1 Preparing an application for release
&lt;/h2&gt;

&lt;h2&gt;
  
  
  2.1.1 Set up AppID and Entitlements
&lt;/h2&gt;

&lt;p&gt;An AppId is needed for submitting an application to Apple App Store. AppId is unique for every iOS App.  Every AppId is associated with a set of entitlements. To generate an AppId, follow the below process.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login to Apple Developer Portal and click on ‘Certificates, IDs and Profiles’.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NZdjJTlM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y72nmf2r4ml0cbkzf56w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NZdjJTlM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y72nmf2r4ml0cbkzf56w.png" alt="Login to Apple Developer Portal" width="558" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the ‘Identifiers’ option from the side menu and Click the Add button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RB8Apufk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ddp6fpbmws0edxwydfv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RB8Apufk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ddp6fpbmws0edxwydfv.png" alt="Identifiers" width="525" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select ‘AppId’ from the list and click on ‘Continue’. Give a ‘BundleID’ and Description in the required boxes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DE90a6dQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/skugpqszj2myow1og79d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DE90a6dQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/skugpqszj2myow1og79d.png" alt="AppId and BundleId" width="525" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select the ‘Capabilities’ from the list below. Capabilities are defined as the permissions to the application to the services provided by Apple like CloudKit, In-App purchases etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ln1BWnUA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o2zv3k98ixlx32o8jf6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ln1BWnUA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o2zv3k98ixlx32o8jf6u.png" alt="Capabilities" width="525" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.1.2 Set up App Store Provisioning Profile
&lt;/h2&gt;

&lt;p&gt;Provisioning profile is used to control how the application is deployed. A developer can create profiles like Alpha, Beta and Production to have an efficient release of the application to a selected set of people. To create a Provisioning Profile, click on the Profiles option in the side menu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Iz15qW7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kxfq8mvbjoz6a2o9igkj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Iz15qW7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kxfq8mvbjoz6a2o9igkj.png" alt="Set up App Store Provisioning Profile" width="525" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the ‘+’ icon to create a new profile. On the next screen, select ‘iOS App Development’ radio button. In the Distribution section, there are various options.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;1. Ad Hoc: *&lt;/em&gt;&lt;br&gt;
This option can be considered as Beta release where the build is only available for a limited number of registered devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Developer ID:&lt;/strong&gt;&lt;br&gt;
This option can be considered as Alpha release where the build is only available for devices with same AppleID signed devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. App Store:&lt;/strong&gt;&lt;br&gt;
This option can be considered as Production release, as the build is available on the App Store and can be accessed by the public.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ifwB-iWv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7w30o9rc00gmmm4b10qd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ifwB-iWv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7w30o9rc00gmmm4b10qd.png" alt="Register a new profile" width="543" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.1.3 Prepare the set up for building the application
&lt;/h2&gt;

&lt;p&gt;After the development stage of the application is complete, the next step is to publish the app to App Store. Building an iOS app requires a Mac Book or a Mac Build Host setup. This is required because building Native iOS requires Apple’s Build tools which only is compatible with Mac.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.1.4 iOS Build Configuration
&lt;/h2&gt;

&lt;p&gt;Considering Visual Studio as the IDE, right click the Project Name and click properties. Navigate to the iOS build tab. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set the Configuration to ‘Release’ and Platform to ‘iPhone’.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DPKex45Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ql45v9ads8uwsvvwh6ei.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DPKex45Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ql45v9ads8uwsvvwh6ei.png" alt="Build Configuration" width="525" height="39"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the app is targeted to a specific SDK version, select it from the dropdown, else keep it ‘Default’.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E6aFrIql--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/55tpvc8qemd73xxw21a6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E6aFrIql--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/55tpvc8qemd73xxw21a6.png" alt="SDK Version" width="525" height="81"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Linker behavior is the property which helps in reducing the size of the application by deleting the unused code. Mostly, this should be set to ‘Link Framework SDKs only’ to avoid any issues with third party libraries.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0u_LsncQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6js2otg7khw9whh7uo0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0u_LsncQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6js2otg7khw9whh7uo0i.png" alt="Linker" width="525" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The targeted architecture is to be selected in the ‘Supported Architecture’ dropdown. All apps targeted to iOS11 and above need to support 64-bit architectures.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L467qxYI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x540mh51t3hg1s6i52z5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L467qxYI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x540mh51t3hg1s6i52z5.png" alt="Targeted Architecture" width="525" height="73"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;LLVM (Low Level Virtual Machine) compiler can be used to build smaller and faster code. This increases the compile time of the application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optimize PNG images can be checked to further reduce the size of the application&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2.1.5 iOS Bundle Signing
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click on the ‘iOS Bundle Signing’ option from the side menu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UbqIC2nQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8x0q6ofr6iwg0n5ycbfp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UbqIC2nQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8x0q6ofr6iwg0n5ycbfp.png" alt="IOS Bundling stage" width="298" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set the configuration to ‘Release’ and Platform to ‘iPhone’.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--odMPv-5S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aac4dopz8bnb5bu5gcue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--odMPv-5S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aac4dopz8bnb5bu5gcue.png" alt="Release Platform " width="525" height="39"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select the ‘Manual Provisioning’ radio button in the Bundle Signing Scheme. Selecting this option enables to manually map the Generated AppId from the Developer Account portal to the application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the ‘Manual Provisioning’ section, set the ‘Signing Identity’ as ‘Distribution (Automatic)’.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lp-Kz81s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2h5mvy9t8sb3fmzce7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lp-Kz81s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2h5mvy9t8sb3fmzce7f.png" alt="Signing Identity" width="525" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select the ‘Provisioning Profile’ wherein the application is to be released.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H2peTs6b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wm79wrllz15o5bvh8jix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H2peTs6b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wm79wrllz15o5bvh8jix.png" alt="Provisioning Profile" width="525" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save the configuration and close it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2.2 iTunes Connect
&lt;/h2&gt;

&lt;p&gt;iTunes connect is a suite of web-based tools provided by Apple for managing iOS Applications on the App Store.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.2.1 Configuring an App in iTunes Connect
&lt;/h2&gt;

&lt;p&gt;Create a new App on iTunes connect using the ‘+’ button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fuEUNzL5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jeeu743c9dgqvrws0d42.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fuEUNzL5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jeeu743c9dgqvrws0d42.png" alt="iTunes Connect" width="525" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upon clicking the ‘+’ button, a prompt asks for information as below:&lt;br&gt;
a. Platform: iOS / tvOS&lt;br&gt;
b. Name &lt;br&gt;
c. Primary Language of the Application&lt;br&gt;
d. Bundle ID&lt;br&gt;
e. SKU (Unique Identification for the app)&lt;br&gt;
f. User Access (Choosing the audience)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---4-Xqi8d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5aieekk7zr0qkxxbedy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---4-Xqi8d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5aieekk7zr0qkxxbedy7.png" alt="Platform" width="525" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.2.2 Provisioning an App for App Store Distribution
&lt;/h2&gt;

&lt;p&gt;Irrespective of the release plan, a Distribution profile is needed for releasing an app to App Store. This profile allows the application to be digitally signed for release so that it can be installed on an iOS device. A Distribution Profile contains the following things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;App Id&lt;/li&gt;
&lt;li&gt;Distribution Certificate&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2.2.2.1 Creating a Distribution Certificate
&lt;/h2&gt;

&lt;p&gt;Click on the ‘Certificates, Identifiers and Profiles’ Section on the side menu. Then select ‘Certificates’ from the side menu and click ‘+’ button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iVg3vTuC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02kyorvys4x6vv37byr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iVg3vTuC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02kyorvys4x6vv37byr9.png" alt="Distribution Certificate" width="525" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the ‘iOS App Development’ in the Software Section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BoA6Qb3---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5bn9i6906t190bkny84b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BoA6Qb3---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5bn9i6906t190bkny84b.png" alt="iOS App Development" width="524" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also select the services that are being used by the application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XrUsB4D3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f7bxoy7iec6wyiicjhrw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XrUsB4D3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f7bxoy7iec6wyiicjhrw.png" alt="services" width="525" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.2.2.2 Creating a Certificate Signing Request (CSR)
&lt;/h2&gt;

&lt;p&gt;Certificate Signing Request is created using the Keychain Access tool on Mac. In the dropdown menu, click Keychain Access &amp;gt; Certificate Assistant &amp;gt; Request Certificate from a Certificate Authority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fK_bRyOq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kvm3nmjfcm6w3q3kpjh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fK_bRyOq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kvm3nmjfcm6w3q3kpjh.png" alt="Certificate Signing Request (CSR)" width="525" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the Email ID and name associated with the Apple Account and check ‘Save to Desktop’ and click continue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HXuRwkeF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k8w87umdolnv4oxcs9q3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HXuRwkeF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k8w87umdolnv4oxcs9q3.png" alt="Apple Account login" width="525" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the CSR certificate is created, upload the certificate to Apple Developer Account page and click on Generate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bz_pBESo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0oh8dfcftswzjpbjgdp1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bz_pBESo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0oh8dfcftswzjpbjgdp1.png" alt="CSR certificate" width="524" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download the certificate and install it. Once the certificate is installed, the app can be published to the App Store.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.2.3 Publish and Submit the App to App Store
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;When all the release and build configuration is complete, set the Solution Configuration to Release and Solution Platform as iPhone.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--keJOhBUk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ldjqq5bscm0gzlkmazg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--keJOhBUk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ldjqq5bscm0gzlkmazg.png" alt="Release" width="434" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the Build menu, select Archive. Archive Manager will pop up. Once the archive is created click on ‘Distribute’.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FItvBx7o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dlmm54cz4r0pchz0xhpy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FItvBx7o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dlmm54cz4r0pchz0xhpy.png" alt="Build Menu" width="525" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After clicking Distribute, Publishing Wizard will open. Select the desired Distribution Channel and fill the identity details and Provisioning Profile name.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aErP-ib2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p7m2x5cnsm3srwylv412.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aErP-ib2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p7m2x5cnsm3srwylv412.png" alt="Distribute" width="525" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on ‘Upload to Store’. A prompt will ask for Apple ID and Password. Fill in the ID and Password and click ‘OK’. The app will start to upload to App Store.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--piX5M-Bu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/chg4oyyr7arl51udbptt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--piX5M-Bu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/chg4oyyr7arl51udbptt.png" alt="Credentials" width="525" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once the upload is complete, login to iTunes and select the app. It will show the status as ‘Waiting for review’ with version details.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PRJNLj9G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b33ode6905j4wk830x4e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PRJNLj9G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b33ode6905j4wk830x4e.png" alt="Versions" width="525" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.2.4 Managing App Screenshots
&lt;/h2&gt;

&lt;p&gt;For publishing an app, App Store requires a set of screenshots and videos (optional). The screenshot consist of actual views of the application running and showing the unique features. Apple requires screenshots for every screen size and resolution that the application supports.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Publishing your Xamarin app to Google Play Store</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Sat, 16 Sep 2023 12:34:36 +0000</pubDate>
      <link>https://forem.com/ishwar398/publishing-your-xamarin-app-to-google-play-store-2757</link>
      <guid>https://forem.com/ishwar398/publishing-your-xamarin-app-to-google-play-store-2757</guid>
      <description>&lt;h2&gt;
  
  
  1    INTRODUCTION
&lt;/h2&gt;

&lt;p&gt;Cross platform mobile application development is a growing phenomenon due to its single code approach. Development of cross platform application with these new technologies is quick, but what matters more is how the apps that are developed on a single code base can be published to the  respective application stores, what all kinds of testing is required for it and many more. This paper helps to cover these topics which will be useful to test single code base Applications before they are published to the App Stores.&lt;/p&gt;

&lt;h2&gt;
  
  
  2    DEVELOPMENT STAGE
&lt;/h2&gt;

&lt;h2&gt;
  
  
  2.1 Identifying Targets
&lt;/h2&gt;

&lt;p&gt;Before beginning development, the target devices and platforms are to be identified. Because this will smoothen the process of technology selection. The questions asked during this stage revolve around few major areas consisting of Device Types, Operating Systems and Versions.&lt;br&gt;
.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.2 Finalizing technology
&lt;/h2&gt;

&lt;p&gt;Based on the selection of targets in the prior stage, the technology needs to be selected. Main factor while the selection is how feasible is it to be used on the identified target platforms and what the native abilities offered.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.3  Implementation
&lt;/h2&gt;

&lt;p&gt;Once all the technology is finalized, the architectures are kept on the tables. Upon drafting the architecture of the application, coding for the application is started. Over the time and the choice of Software Engineering methodology, like Agile or waterfall, the application starts taking shape. Once few deployable modules are complete, testing of the modules start.&lt;/p&gt;

&lt;h2&gt;
  
  
  3    TESTING STAGE
&lt;/h2&gt;

&lt;p&gt;Analysis and Testing is an important activity in any software development process and specially in case of Mobile Applications, it is important for providing dependable solutions for end users. Currently there are various types and stages of testing involved in testing mobile applications. Along with the testing team, developers are also responsible for performing some kind of testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.1 Manual Testing
&lt;/h2&gt;

&lt;p&gt;Testing teams manually has to execute test cases without using any kind of Automation Tool. This is the most primitive type of testing. Any new application has to be tested manually at initial stages before automating the test cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.2 Unit Testing
&lt;/h2&gt;

&lt;p&gt;This testing is to be performed by Developers. Unit is the smallest part of the software. Whenever a developer develops a module, he has to test that module. Main aim of this testing is to ensure that the basic functionality of the developed module are working. &lt;/p&gt;

&lt;h2&gt;
  
  
  3.2.1 Platform Dependency testing
&lt;/h2&gt;

&lt;p&gt;When the technology which is to be used is a single code-oriented design, the features developed are to be scrupulously tested on the platforms which the app is supposed to run on. This ensures that the native features used in the code are working as expected on all the intended platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.3 Integration Testing
&lt;/h2&gt;

&lt;p&gt;Once all the units are developed which can together, logically serve as an independent functionality, these units are merged.&lt;br&gt;
The testing that takes plan on these merged units is Integration testing. This testing ensures that the units which were developed individually, when integrated with each other, work properly. &lt;/p&gt;

&lt;h2&gt;
  
  
  3.4 Beta Testing/Third Party Testing
&lt;/h2&gt;

&lt;p&gt;Beta Testing is one of the Acceptance Testing types, which adds value to the product as the end-user validates the product for functionality, usability, reliability, and compatibility. Beta Test provides a complete overview of the true experience gained by the end users while experiencing the product. This testing is done by external members which are not the part of development or testing team.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.4 GUI Testing
&lt;/h2&gt;

&lt;p&gt;GUI testing is defined as the process of testing the system's Graphical User Interface of the Application Under Test. GUI testing involves checking the screens with the controls like menus, buttons, icons, and all types of bars - toolbar, menu bar, dialog boxes, and windows, etc. This stage ensures that the UI look and feel is the same across all the supported devices and platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  4    PREPARING AN APPLICATION FOR RELEASE
&lt;/h2&gt;

&lt;h2&gt;
  
  
  4.1 Preparing an Android app.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  4.1.1 Preparing an application for release
&lt;/h2&gt;

&lt;h2&gt;
  
  
  4.1.1.1 Specify the app icon
&lt;/h2&gt;

&lt;p&gt;It is strongly recommended that each Xamarin.Android application specify an application icon. Some application marketplaces will not allow an Android application to be published without one. The Icon property of the Application attribute is used to specify the application icon for a Xamarin.Android project. In these examples, @drawable/icon refers to an icon file that is located at Resources/drawable/icon.png &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SjrlkjdD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9sxktml5b2ujticzc2v6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SjrlkjdD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9sxktml5b2ujticzc2v6.png" alt="Specifying the icon for the app" width="550" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.1.2 Version the Application
&lt;/h2&gt;

&lt;p&gt;Versioning is important for Android application maintenance and distribution. Without some sort of versioning in place, it is difficult to determine if or how an application should be updated. To assist with versioning, Android recognizes two different types of information:&lt;/p&gt;

&lt;p&gt;Version Number – An integer value (used internally by Android and the application) that represents the version of the application. Most applications start out with this value set to 1, and then it is incremented with each build. This value has no relationship or affinity with the version name attribute (see below). Applications and publishing services should not display this value to users. This value is stored in the AndroidManifest.xml file as android:versionCode.&lt;/p&gt;

&lt;p&gt;Version Name – A string that is used only for communicating information to the user about the version of the application The version name is intended to be displayed to users or in Google Play. This string is not used internally by Android. The version name can be any string value that would help a user identify the build that is installed on their device. This value is stored in the AndroidManifest.xml file as android:versionName. You cannot upload an APK to the Play Store with a versionName you have already used for a previous version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RNknurLF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cqpvsmdusvjo0kaz4tap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RNknurLF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cqpvsmdusvjo0kaz4tap.png" alt="Versioning" width="550" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.1.3 Understanding Android API levels
&lt;/h2&gt;

&lt;p&gt;Target Framework – Specifies which framework to use in building your application. This API level is used at compile time by Xamarin.Android.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dy6t7Pbp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/24tu3mtedllxfaorh15g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dy6t7Pbp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/24tu3mtedllxfaorh15g.png" alt="Target version" width="550" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Minimum Android Version – Specifies the oldest Android version that you want your app to support. This API level is used at run time by Android.&lt;/p&gt;

&lt;p&gt;Target Android Version – Specifies the version of Android that your app is intended to run on. This API level is used at run time by Android.&lt;/p&gt;

&lt;p&gt;Before you can configure an API level for your project, you must install the SDK platform components for that API level. &lt;/p&gt;

&lt;p&gt;On the Android Manifest page, set the Minimum Android version to Use Compile using SDK version and set the Target Android version to the same value as the Target Framework version (in the following screenshot, the Target Android Framework is set to Android 7.1 (Nougat)):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6W6kA00r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9v7hcxl3mub9pp72vvhr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6W6kA00r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9v7hcxl3mub9pp72vvhr.png" alt="Target Version" width="550" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to maintain backward compatibility with an earlier version of Android, set Minimum Android version to target to the oldest version of Android that you want your app to support&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3rGydZrD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tr734sytmv2gn9z3jg3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3rGydZrD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tr734sytmv2gn9z3jg3f.png" alt="Backward Compatibility" width="550" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.2 Compile
&lt;/h2&gt;

&lt;p&gt;Select Build &amp;gt; Rebuild Solution to verify that it builds successfully in Release mode. Note that this step does not yet produce an APK.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.2 Archive for Publishing
&lt;/h2&gt;

&lt;h2&gt;
  
  
  4.1.2.1 Archive
&lt;/h2&gt;

&lt;p&gt;To begin the publishing process, right-click the Solution in the Solution Explorer and select Archive All..., which builds the solution and archives all Xamarin projects that can generate an archive:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LMfV99Np--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8hyjjq8jwt8a2us65qjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LMfV99Np--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8hyjjq8jwt8a2us65qjs.png" alt="Compiling" width="550" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will load the archive manager.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VvCWnbS4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rw7qa6svrzgd5w8nzdci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VvCWnbS4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rw7qa6svrzgd5w8nzdci.png" alt="Archive Manager" width="550" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.2.2 Distribution
&lt;/h2&gt;

&lt;p&gt;When an archived version of the application is ready to publish, select the archive in the Archive Manager and click the Distribute... button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_qPSELXu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ocpdj8d7y35s8zglnc1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_qPSELXu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ocpdj8d7y35s8zglnc1z.png" alt="Distribute" width="550" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Distribution Channel dialog shows information about the app, an indication of distribution workflow progress, and a choice of distribution channels. On the first run, two choices are presented:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IWn7acuh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/shw1lm5u14y52n3jdp10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IWn7acuh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/shw1lm5u14y52n3jdp10.png" alt="Distribution" width="550" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is possible to choose one of the following distribution channels:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Ad hoc (We’ll be considering this option)&lt;/li&gt;
&lt;li&gt; Google Play&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4.1.2.2.1 Publishing using Ad hoc option
&lt;/h2&gt;

&lt;p&gt;After Ad-Hoc is selected, To publish the .APK, it must first be signed with a signing key (also referred to as a certificate).&lt;/p&gt;

&lt;p&gt;An existing certificate can be used by clicking the Import button and then proceed to Sign the APK. Otherwise, click the click the + button to create a new certificate:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WSMu0gv4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/10zcqnq8sxy8t9zsvkcz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WSMu0gv4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/10zcqnq8sxy8t9zsvkcz.png" alt="Certificate" width="550" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Create Android KeyStore dialog is displayed; use this dialog to create a new signing certificate that can be used for signing Android applications. Enter the required information (outlined in red) as shown in this dialog:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dnomATbM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mhb5h0cxrmyf77klaa16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dnomATbM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mhb5h0cxrmyf77klaa16.png" alt="Certificate Creation" width="550" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the information is provided, click on create button.&lt;br&gt;
The resulting keystore resides in the following location:&lt;/p&gt;

&lt;p&gt;C:\Users\USERNAME\AppData\Local\Xamarin\Mono for Android\Keystore\ALIAS\ALIAS.keystore&lt;/p&gt;

&lt;p&gt;Once the keystore is generated, make a backup of the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sign the APK&lt;/strong&gt;&lt;br&gt;
When Create is clicked, a new key store (containing a new certificate) will be saved and listed under Signing Identity as shown in the next screenshot. To publish ad-hoc, select the signing identity to use for signing and click Save As to publish the app for independent distribution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ML8AyhGD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvnq7r10basye7j5f2ww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ML8AyhGD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvnq7r10basye7j5f2ww.png" alt="Signing the APK" width="550" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, the Archive Manager displays the publishing progress. When the publishing process completes, the Save As dialog opens to ask for a location where the generated .APK file is to be stored.&lt;/p&gt;

&lt;p&gt;If the key password is unknown, the Signing Password dialog will appear to prompt for the password for the selected certificate&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bvPP5fRG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/57grrg78by27wuyntb4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bvPP5fRG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/57grrg78by27wuyntb4d.png" alt="Image description" width="550" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the signing process completes, click Open Distribution&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LDp6Lzft--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p4k9g2h7cq1tzh4jx9kc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LDp6Lzft--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p4k9g2h7cq1tzh4jx9kc.png" alt="Image description" width="550" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This causes Windows Explorer to open the folder containing the generated APK file. At this point, Visual Studio has compiled the Xamarin.Android application into an APK that is ready for distribution. The following screenshot displays an example of the ready-to-publish app, App.apk.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1 Publishing the app to Google Play Store
&lt;/h2&gt;

&lt;p&gt;Before publishing the application to Google Play store, there are various security checks have to be validated and various operations are to be performed within security domain of the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.1 Checks before publishing the app to Play Store
&lt;/h2&gt;

&lt;h2&gt;
  
  
  4.1.1.1 Obfuscate Source Code
&lt;/h2&gt;

&lt;p&gt;When we build the app, the source code gets compiled into the library and files as per the selected build configuration. In case of Android, the code is bundled into an .apk file or app bundle files. But there are software packages which can convert the library files back to source code files which can result in security issues. Obfuscation is a process which will not allow to convert the library files back to source code files. To obfuscate code in Android Studio, navigate to the build.gradle file in the Android Studio Project and set the minifyEnabled property to true from false.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.1.2 Disable Debugging
&lt;/h2&gt;

&lt;p&gt;The debugging flag in the AndroidManifest.xml file should be set to false. The name of the flag is android:debuggable.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.1.3 Other checks
&lt;/h2&gt;

&lt;p&gt;The other checks which are the be performed are &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Ensuring that the application transmits data over HTTPS.&lt;/li&gt;
&lt;li&gt; Disable logging in the application&lt;/li&gt;
&lt;li&gt; Ensuring that the application has emulator checks.&lt;/li&gt;
&lt;li&gt; Ensuring the passwords are hashed and not encrypted.&lt;/li&gt;
&lt;li&gt; Ensuring Local Data storage is encrypted&lt;/li&gt;
&lt;li&gt; Avoid use of Custom Encryption Algorithm&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4.1.2 Submitting the application to Play Store
&lt;/h2&gt;

&lt;h2&gt;
  
  
  4.1.2.1 Using the Google Play Console
&lt;/h2&gt;

&lt;p&gt;Login to the ‘Google Play Console’. Upon successful login, the home page will look like below image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QgYucArx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h3fhzs7umxvwug2mmpcw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QgYucArx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h3fhzs7umxvwug2mmpcw.png" alt="Google Play Console" width="525" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once logged in, select the ‘All Applications’ tab from the side menu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cDhnJaj---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ya8glpwhx05brmfwzgd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cDhnJaj---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ya8glpwhx05brmfwzgd.png" alt="Google Play Console" width="525" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the create application button in the top right corner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9JrUOCze--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ss4r4ziji121e45cxbd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9JrUOCze--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ss4r4ziji121e45cxbd2.png" alt="Google Play Console" width="525" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A prompt opens up asking for the default language of the application and the name of the application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pJrvfHJC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4wwm3vf25xm3en17hfzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pJrvfHJC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4wwm3vf25xm3en17hfzg.png" alt="Choosing the language of the application" width="525" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the app is created, select the ‘App Releases’ tab from the side menu. Google Play console offers three tracks for App Releases.&lt;br&gt;
&lt;strong&gt;A. Production Track&lt;/strong&gt;&lt;br&gt;
This is the Main track which will be available for public&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Open Track&lt;/strong&gt;&lt;br&gt;
This is the Beta track which will only be available for beta testers. Beta testers are people outside the development team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C. Closed Track&lt;/strong&gt;&lt;br&gt;
This is the Alpha track which is only available for people inside the development team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X3A-mBdK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zhayb01lzik2jw60zp03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X3A-mBdK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zhayb01lzik2jw60zp03.png" alt="Image description" width="564" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.2.2 Upload the APK or app bundle files for your app
&lt;/h2&gt;

&lt;p&gt;This stage give developer the ability to limit the reach of the application to specific people only. Here the application can be assigned to a Alpha Track, Beta Track or the Production Track. Choosing the correct track is important because Alpha and Beta track help in getting feedback from real end users. After selection of the track, the .apk and bundle files are to be selected and uploaded to the Play Store.&lt;br&gt;
Select a track where the application is to be deployed. It will ask you for the APK file and a release name. It will also ask for release notes which consists of new features in the release.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--laIlnKRa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/51nl1r06oi184xrbdwoo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--laIlnKRa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/51nl1r06oi184xrbdwoo.png" alt="Publishing the application" width="689" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.2.3 Preparing the information about the application
&lt;/h2&gt;

&lt;p&gt;After uploading the APK file, click on the ‘Store Listing’ tab from the side menu. Basic information about the application is required before submitting the application to Play Store. The information required is listed below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Short description about the application&lt;/li&gt;
&lt;li&gt; Brief description about the application&lt;/li&gt;
&lt;li&gt; Screenshots of various screens&lt;/li&gt;
&lt;li&gt; Hi-resolution Icon&lt;/li&gt;
&lt;li&gt; Video link&lt;/li&gt;
&lt;li&gt; Application Type&lt;/li&gt;
&lt;li&gt; Category&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4.1.2.4 Set the rating of the Application
&lt;/h2&gt;

&lt;p&gt;Once the application files are submitted successfully, in the next stage the submission team has to answer some questions. Based on the responses to these questions, the age rating is calculated for the application. This helps in identifying if the application is appropriate for which age group.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.2.5 Set pricing and distribution plan
&lt;/h2&gt;

&lt;p&gt;The developer can select if the application needs to be a paid one or a free one. The countries in which the application should be available can also be selected on this page.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1.2.6 Publish the App
&lt;/h2&gt;

&lt;p&gt;Once all the details are filled, the developer can publish the app. Once published, it will be reviewed by the people at Google for validity of the information. If any of the security check is violated the application will be rejected. If no security violations are found, the application will be published successfully.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Getting started with Application Insights in .NET Web API</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Sun, 20 Aug 2023 05:18:26 +0000</pubDate>
      <link>https://forem.com/ishwar398/getting-started-with-application-insights-in-net-web-api-4aa7</link>
      <guid>https://forem.com/ishwar398/getting-started-with-application-insights-in-net-web-api-4aa7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Monitoring&lt;/strong&gt; an application is one of the most important part in Software Lifecycle. With help of Monitoring tools, we can see whats going inside the application, predict any infra scaling, see how users are using the application etc.&lt;br&gt;
&lt;strong&gt;Azure Application Insights&lt;/strong&gt; offers powerful application performance and monitoring tools. It tracks user interactions, traces requests, measures performance metrics, and monitors application health. With features like custom event tracking and real-time analytics, it helps developers identify issues, optimize performance, and enhance user experiences in cloud-based applications.&lt;/p&gt;

&lt;p&gt;Pre-Requisites:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Azure Account&lt;/li&gt;
&lt;li&gt;.NET Web API project&lt;/li&gt;
&lt;li&gt;Visual Studio&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Configuring Application Insights in Web API project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the solution in Visual Studio&lt;/li&gt;
&lt;li&gt;Right click on the solution.&lt;/li&gt;
&lt;li&gt;Click on 'Configure Application Insights'&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SBj-8Tks--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7uiltt0o127j4ssz3vqi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SBj-8Tks--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7uiltt0o127j4ssz3vqi.png" alt="Configure Application Insights" width="695" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This will open a pop up asking for connecting to the dependency. If you need to use application insights on local machine, click on Application Insights SDK (Local). If you want to connect to an instance on Azure, click on Azure Application Insights. For this post, we will be connecting to an instance on Azure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dgIg_1Cb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vushcbs1igjczt70vt5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dgIg_1Cb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vushcbs1igjczt70vt5i.png" alt="Connect to dependency" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On clicking next, we need to select the Application Insights instance. If not present, there is an option to create a new and then select it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xjRHi8e7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x4r37ush91zqzak9nwbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xjRHi8e7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x4r37ush91zqzak9nwbv.png" alt="Select the Application Insights instance on Azure" width="783" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Next, it will show us the Application Insights connection string which is to be saved in the User secret file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the next step, it will add the necessary config files and Nuget packages to the application.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MzyUfXlk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/izhnuc6sa0c1rqj3d5kk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MzyUfXlk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/izhnuc6sa0c1rqj3d5kk.png" alt="Files added to the project" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment and Application Insights portal
&lt;/h2&gt;

&lt;p&gt;Once the changes are deployed, you can visit the Azure portal to check the newly created Application Insights instance. It will start showing stats for your application in some time. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZJfBMCV5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nldap8dglzir1h3admcg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZJfBMCV5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nldap8dglzir1h3admcg.png" alt="Application Insights Portal" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking Failures in API
&lt;/h2&gt;

&lt;p&gt;Here's an example on how  we can check the exceptions which were throw by the API and their details.&lt;br&gt;
In the overview page of Application Insights, we will see a &lt;strong&gt;Failures&lt;/strong&gt; chart. This option is also present in the left pane.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OcLUBbRc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msp49wt3ihc9rilggh59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OcLUBbRc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msp49wt3ihc9rilggh59.png" alt="Failures" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you click on any of the above highlighted option, you'll get the list of the failures along with the exceptions by HTTP Status code, exception types etc. along with the operation name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oomLlHwc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cd8xqcr7gpgfzcutcz27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oomLlHwc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cd8xqcr7gpgfzcutcz27.png" alt="Failure details" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we click on the type of exception, we will get complete list of the exception of the selected type. We can then click on any item from the list to get the complete details about the exception.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HrJG9ixF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m8s94iw5s5yg7fct5xcg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HrJG9ixF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m8s94iw5s5yg7fct5xcg.png" alt="List of exceptions" width="800" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fi39QWDo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vf6ik4n4aa83b4r3nfgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fi39QWDo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vf6ik4n4aa83b4r3nfgw.png" alt="Exception Details" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>azure</category>
      <category>appinsights</category>
      <category>api</category>
    </item>
    <item>
      <title>Getting started with Azure Cognitive Search</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Mon, 14 Aug 2023 06:10:41 +0000</pubDate>
      <link>https://forem.com/ishwar398/getting-started-with-azure-cognitive-search-1f9e</link>
      <guid>https://forem.com/ishwar398/getting-started-with-azure-cognitive-search-1f9e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Azure Cognitive Search&lt;/strong&gt; is a cloud-based search service by Microsoft. It empowers seamless integration of powerful search capabilities into applications. It offers AI-driven indexing, faceted navigation, and natural language processing. It scales dynamically, supports diverse data sources, and enhances user experiences with accurate, fast, and relevant search results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Cognitive Search Service
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;On the Azure Portal, search for Cognitive Search. Then click on 'Create Search Service'&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fmj0y2hzylaqqc5r4gpxd.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%2Fuploads%2Farticles%2Fmj0y2hzylaqqc5r4gpxd.png" alt="Once you click on Create, this page will pop up"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the resource group and give a unique name as this will be the part of the Search URL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on Next, which will take us to the Scaling section. For this post, we will not look into the scaling part.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on Next, and then 'Create + Review'&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the resource is created, head over to the newly created service.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Important parts of Search Service
&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%2Fuploads%2Farticles%2Fgmbenraq648g3vxa2gbw.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%2Fuploads%2Farticles%2Fgmbenraq648g3vxa2gbw.png" alt="Search Management"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above Search Management options are most important options in setting up the Search Service. We will look at them one by one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In this section, we can setup the input data sources for the Search Service.&lt;/li&gt;
&lt;li&gt;There are multiple options we can use as Data Source.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Blob Storage&lt;/li&gt;
&lt;li&gt;Data Lake&lt;/li&gt;
&lt;li&gt;Table&lt;/li&gt;
&lt;li&gt;Cosmos DB&lt;/li&gt;
&lt;li&gt;SQL Database&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On selecting any option, it will ask us for setting up the connection to the respective resource. Specially for Cosmos DB and SQL Database, we need to provide a database query which the Search Service will execute on the database and fetch the data into Search Service. &lt;/p&gt;

&lt;h2&gt;
  
  
  Indexers
&lt;/h2&gt;

&lt;p&gt;Once the data sources are created, we need to create Indexers. The main responsibility of Indexers is to get the data from data sources and feed it to the Search Index. It acts like a middle ware. Here, we can add Skillsets to the data like performing OCR, Entity Extraction etc. &lt;br&gt;
We can set a schedule for Indexers which will ensure that the Indexers fetch the latest data from the data source at particular time intervals. &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%2Fuploads%2Farticles%2Fmn14qukerqksulk66d2k.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%2Fuploads%2Farticles%2Fmn14qukerqksulk66d2k.png" alt="Basic Details of Indexer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the basic details are filled, we can scroll and set the schedule.&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%2Fuploads%2Farticles%2Fwq85g42oz3it3deozze0.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%2Fuploads%2Farticles%2Fwq85g42oz3it3deozze0.png" alt="Scheduling and Advanced Options for Indexer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Enabling the Base64 encoding ensure that if there are any special characters in the Key like '.' etc., this characters will get encoded so that this keys will not cause any issue in the URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable Incremental Enrichment - This option will ensure that if any skillsets or AI Processing is applicable to the resource, the enrichments will be cached so that enrichments are only applicable to new documents. This enrichments are stored in Azure storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Default Batch size - The number of documents which are to be processed by the indexer at a time, by default this value is dependent on the data source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Indexer Cache Location - The storage where the enrichments are to be stored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Max Failed Items - Threshold to set which can define a max number of documents that can fail during indexing and still the indexing can be termed as successful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Max Failed Items per Batch - Number of items that can be fail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Managed identity authentication - If the Search Service has to be authenticated using Managed Identity, then this option is helpful.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Index
&lt;/h2&gt;

&lt;p&gt;Indexes are the most important part, where the search queries are executed. &lt;br&gt;
In we think about the flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data sources establish connection to read the data&lt;/li&gt;
&lt;li&gt;Indexers fetch the data, clean it, send it to the index&lt;/li&gt;
&lt;li&gt;Index gets the data from Indexers, and we can decide which fields should be Searchable, Filterable, Sortable, Facetable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While creating the index, we can create the fields which are be included in the index, and set the properties of the fields. &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%2Fuploads%2Farticles%2F9flxhe0q9fkgnm3r2beo.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%2Fuploads%2Farticles%2F9flxhe0q9fkgnm3r2beo.png" alt="Creating an Index"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Flow
&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%2Fuploads%2Farticles%2Fih6i4xvfhfjh8faugg04.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%2Fuploads%2Farticles%2Fih6i4xvfhfjh8faugg04.png" alt="Search Service Flow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Aliases
&lt;/h2&gt;

&lt;p&gt;As the index name is included in the URL when a Search query is executed, we can give a different alias to the Search index so that the alias can be included in the query.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cognitive</category>
      <category>search</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Azure Key Vault with .NET - Reading &amp; Writing secrets from a C# application</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Sun, 13 Aug 2023 14:07:14 +0000</pubDate>
      <link>https://forem.com/ishwar398/azure-key-vault-with-net-reading-writing-secrets-from-a-c-application-2o6g</link>
      <guid>https://forem.com/ishwar398/azure-key-vault-with-net-reading-writing-secrets-from-a-c-application-2o6g</guid>
      <description>&lt;p&gt;Once you have created a &lt;a href="https://dev.to/ishwar398/azure-key-vault-with-net-creating-a-key-vault-resource-51ap"&gt;Key Vault resource&lt;/a&gt;, and you've set the &lt;a href="https://dev.to/ishwar398/azure-key-vault-with-net-vault-access-policies-5h24"&gt;Access Policies&lt;/a&gt;, the next step is to establish a connection between the application and Key Vault to perform operations like reading, writing and deleting values from Key Vault.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install the required Nuget Packages
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;dotnet add package Microsoft.Extensions.Azure&lt;/li&gt;
&lt;li&gt;dotnet add package Azure.Security.KeyVault.Secrets&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setup the appsettings file
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In the Overview page of the Key Vault resource in Azure portal, copy the VaultURI.&lt;/li&gt;
&lt;li&gt;Add a section in the appsettings file or the config file.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"KeyVault": {
    "VaultUri": "VAULT-URI"
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Adding the KeyVault service
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In the ConfigureServices method, we need to configure our KeyVault connection&lt;/li&gt;
&lt;li&gt;In WebApp this will be present in the Program.cs, in Console Application it will be present in the StartUp.cs
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;builder.Services.AddAzureClients(azureClientFactoryBuilder =&amp;gt;
{

    azureClientFactoryBuilder.AddSecretClient(

    Configuration.GetSection("KeyVault"));

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create an Interface for Dependency Injection
&lt;/h2&gt;

&lt;p&gt;Create an interface which can help us in injecting the dependency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;builder.Services.AddSingleton&amp;lt;IKeyVaultManager, KeyVaultManager&amp;gt;();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add three classes to Write, Read and Delete a secret from KeyVault&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public interface IKeyVaultManager
    {
        public Task&amp;lt;bool&amp;gt; WriteSecret(string key,string secret);
        public Task&amp;lt;string&amp;gt; ReadSecret(string key);
        public Task&amp;lt;bool&amp;gt; DeleteSecret(string key);
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setup the class for the interface
&lt;/h2&gt;

&lt;p&gt;Using the interface above, create a class and inherit it from the above interface and implement the three methods in the class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;using Azure.Security.KeyVault.Secrets;

namespace KeyVaultConnectivity.KeyVault
{
    public class KeyVaultManager: IKeyVaultManager
    {
        public SecretClient SecretClient { get; set; }

        public KeyVaultManager(SecretClient secretClient)
        {
            SecretClient = secretClient;
        }

        public async Task&amp;lt;bool&amp;gt; WriteSecret(string key, string secret)
        {
            try
            {
                await SecretClient.SetSecretAsync(key,secret);
                return true;
            }
            catch(Exception ex)
            {
                //Log the exception
                Console.WriteLine(ex.Message);
                return false;
            }
        }

        public async Task&amp;lt;string?&amp;gt; ReadSecret(string key)
        {
            try
            {
                var secret = await SecretClient.GetSecretAsync(key);
                return secret != null ? secret.Value.ToString() : string.Empty;
            }
            catch (Exception ex)
            {
                //Log the exception
                Console.WriteLine(ex.Message);
                return string.Empty;
            }
        }

        public async Task&amp;lt;bool&amp;gt; DeleteSecret(string key)
        {
            try
            {
                await SecretClient.StartDeleteSecretAsync(key);
                return true;
            }
            catch (Exception ex)
            {
                //Log the exception
                Console.WriteLine(ex.Message);
                return false;
            }
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using this service
&lt;/h2&gt;

&lt;p&gt;Inject the service in the class which has to read secrets from Key Vault and the respective method from the class.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>keyvault</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Azure Key Vault with .NET - Vault Access Policies</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Sun, 13 Aug 2023 11:29:59 +0000</pubDate>
      <link>https://forem.com/ishwar398/azure-key-vault-with-net-vault-access-policies-5h24</link>
      <guid>https://forem.com/ishwar398/azure-key-vault-with-net-vault-access-policies-5h24</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/ishwar398/azure-key-vault-with-net-creating-a-key-vault-resource-51ap"&gt;Link&lt;/a&gt; to the post explaining the creation of Azure Key Vault resource.&lt;/p&gt;

&lt;p&gt;Now, we will see the Vault Access Policy setup in detail.&lt;/p&gt;

&lt;p&gt;Key Vault has to be accessed from any where. Be it App Service, Functions, Azure VM etc.&lt;br&gt;
We need to ensure that all these services can access the Key Vault to read the secrets without any authentication error.&lt;/p&gt;

&lt;p&gt;If the Key Vault Access Policies has been selected to ensure that access policies are added for all the resources which have to connect to the Key Vault.&lt;/p&gt;

&lt;p&gt;This is a two step process:&lt;/p&gt;

&lt;h2&gt;
  
  
  Assign a system id to the resource which will access the Key Vault resource
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We need to make sure that a System ID is assigned to the resource for which we will create an access policy&lt;/li&gt;
&lt;li&gt;Open the Overview page of the Azure Resource&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fxyw2bsgs863kek15c1sa.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%2Fuploads%2Farticles%2Fxyw2bsgs863kek15c1sa.png" alt="Overview page of the application"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on Identity from the left pane&lt;/li&gt;
&lt;li&gt;In the System Assigned section, turn on the Enabled button.&lt;/li&gt;
&lt;li&gt;Click on Save.&lt;/li&gt;
&lt;li&gt;Once the save is successful, an Object (Principle) ID will be assigned to the resource.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Folitc3fcqte6nrmsgdho.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%2Fuploads%2Farticles%2Folitc3fcqte6nrmsgdho.png" alt="Enable the System Assigned Identity for an application"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the access policy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open the Azure Key Vault resource overview and click on the Access Policies option in the left pane.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fygt1r2o8nknynxf5uhoy.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%2Fuploads%2Farticles%2Fygt1r2o8nknynxf5uhoy.png" alt="Click on Access Policies"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on 'Create(+)' button&lt;/li&gt;
&lt;li&gt;The next step is to grant permissions&lt;/li&gt;
&lt;li&gt;The permissions are divided in 3 parts: Keys, Secrets, Certificates&lt;/li&gt;
&lt;li&gt;You can select from pre-defined templates or assign the permissions you need. &lt;/li&gt;
&lt;li&gt;Example, if you want an application to just read and get list of the secrets, then just provide Get and List permission under the Secret option.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2F3puq2m5ekrp4vrj5n7ue.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%2Fuploads%2Farticles%2F3puq2m5ekrp4vrj5n7ue.png" alt="Assign what access are to be provided"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paste the Object(Principle) ID from the first step in search, it will bring the result.&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2F27nqejb9tcvx894ueio5.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%2Fuploads%2Farticles%2F27nqejb9tcvx894ueio5.png" alt="On pasting the Object ID, we get the application in the result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the application and click on Next. (Multiple applications can be selected here)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Since we have already selected the applications, skip the 3rd step&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create the access policy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once this policy is created, the selected application will now get all the selected accesses to the Key Vault Resource.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>keyvault</category>
      <category>dotnet</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Azure Key Vault with .NET - Creating a Key Vault Resource</title>
      <dc:creator>Ishwar398</dc:creator>
      <pubDate>Sun, 13 Aug 2023 10:27:30 +0000</pubDate>
      <link>https://forem.com/ishwar398/azure-key-vault-with-net-creating-a-key-vault-resource-51ap</link>
      <guid>https://forem.com/ishwar398/azure-key-vault-with-net-creating-a-key-vault-resource-51ap</guid>
      <description>&lt;p&gt;&lt;strong&gt;Traditional Methods:&lt;/strong&gt;&lt;br&gt;
Storing passwords in config files is insecure and risky. Config files are often stored in plain text, making passwords easily accessible to anyone with access to the file. This approach leaves sensitive credentials vulnerable to unauthorized access, data breaches, and insider threats. Unlike encrypted storage solutions, config files lack proper encryption and access controls, making it difficult to safeguard the passwords effectively. Furthermore, updating or changing passwords requires manual intervention in the config files, posing challenges in terms of security and management. Adopting secure alternatives like credential vaults or key management systems is essential to prevent potential security breaches and protect sensitive data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How Azure Key Vault can help here:&lt;/strong&gt;&lt;br&gt;
Azure Key Vault helps in storing credentials and providing it to the application during runtime. With this approach, we can eliminate the need for storing passwords in plain text config files.&lt;br&gt;
Apart from credentials, Azure key vault can also store certificates and provide them as and when needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to setup Azure Key Vault&lt;/strong&gt;&lt;br&gt;
There are three ways in which an Azure Key Vault resource can be created:&lt;/p&gt;

&lt;p&gt;A. Using the Azure Portal&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the Azure Portal (portal.azure.com) &lt;/li&gt;
&lt;li&gt;Click on 'Create a new resource' and search for 'Key Vault'
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--izNPVtXG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dja55gifuav3t1spklum.png" alt="Creating a new Key Vault Resource" width="476" height="660"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Step 1: General Settings&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Fill in all the required information for the resource group, name of the resource, region and pricing tier.&lt;/li&gt;
&lt;li&gt;Soft delete would be enabled by default. This ensures that if a secret is deleted, it would stay in a soft deleted state from where, if required, it can be restored.&lt;/li&gt;
&lt;li&gt;Time to retain defines how many days should the soft deleted key be retained before it is deleted permanently.&lt;/li&gt;
&lt;li&gt;Purge Protection setting defines if the soft deleted keys can be deleted manually before the retention period is complete. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--074bzzeO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/40pij24h83jct8cuewz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--074bzzeO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/40pij24h83jct8cuewz9.png" alt="General settings of Key Vault" width="800" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Step 2: Authorizations&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Two options are provided here:&lt;br&gt;
a. Azure Role Based Access control&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;With this option, the access to all the key vaults can be saved and used centrally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Objects in the Azure Active Directory can be assigned to these roles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Most of the roles are already created, but if required we can create a customized roles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Any changes to the roles can affect all the resource using that role&lt;br&gt;
b. Vault Access Policy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If we need an access policy to control the specific instance of the Key Vault&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The access policy created only applies to the specific instance and not present centrally&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3-cu2diz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ensizpwx42qe0ae5gbgs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3-cu2diz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ensizpwx42qe0ae5gbgs.png" alt="Access Policies" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Step 3: Networking&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;If the Key Vault is to be assigned to any VNet or Public Access has to be disabled etc. All these settings can be applied here&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pO0it-Rp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dlg54vz0nnpv29k8ckvv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pO0it-Rp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dlg54vz0nnpv29k8ckvv.png" alt="Networking" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Step 4: Tags&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Any tags to be assigned to the resource can be assigned here&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Step 5: Review and Create&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Review all the details&lt;/li&gt;
&lt;li&gt;If everything is correct, create the resource&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;B. Using Azure CLI&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We can create a Key Vault resource using Azure CLI commands&lt;/li&gt;
&lt;li&gt;If resource group is not present, create a resource group
&lt;code&gt;az group create --name "DemoResourceGroup" --location "northeurope"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Then run command to create Key Vault
&lt;code&gt;az keyvault create --name "Unique-KeyVault-Name" --resource-group "DemoResourceGroup" --location "northeurope"&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This will create a Key Vault resource. In a later blog, we will see how can we store, read, delete secrets from this Key Vault resource from a dotnet application in C#.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>keyvault</category>
      <category>secretmanagement</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
