<?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: Abhishek Thapliyal</title>
    <description>The latest articles on Forem by Abhishek Thapliyal (@abhishek9634).</description>
    <link>https://forem.com/abhishek9634</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%2F838309%2F60e66eb3-0e0d-42e3-89de-b8b7bedc41e7.jpg</url>
      <title>Forem: Abhishek Thapliyal</title>
      <link>https://forem.com/abhishek9634</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/abhishek9634"/>
    <language>en</language>
    <item>
      <title>TADA: Coincidence of NodeJS and FCM with AWS Pinpoint Push Notifications</title>
      <dc:creator>Abhishek Thapliyal</dc:creator>
      <pubDate>Fri, 01 Apr 2022 07:46:10 +0000</pubDate>
      <link>https://forem.com/abhishek9634/tada-coincidence-of-nodejs-and-fcm-with-aws-pinpoint-push-notifications-2plb</link>
      <guid>https://forem.com/abhishek9634/tada-coincidence-of-nodejs-and-fcm-with-aws-pinpoint-push-notifications-2plb</guid>
      <description>&lt;p&gt;The agenda of this story is to realize that whatever you learned today or in past will be useful one day. You never know when situation strikes.&lt;br&gt;&lt;br&gt;
So here is what happen, I was working closely with my client and some how &lt;a href="https://firebase.google.com/docs/cloud-messaging/http-server-ref"&gt;&lt;strong&gt;FCM Push Notifications&lt;/strong&gt;&lt;/a&gt; are working fine at our end. But we were using &lt;strong&gt;FCM HTTP API&lt;/strong&gt; to test. Our client was using AWS Pinpoint. Now since the clashes of SDKs and the server written in python.&lt;/p&gt;

&lt;p&gt;Now since AWS provide almost every server language support and I have worked on Node JS almost 2 years back. So I decided to go back and create simple server. So I created a free AWS account and navigate to &lt;a href="https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/getting-started-nodejs.html"&gt;SDK for Node JS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don’t afraid of adding &lt;strong&gt;Credit Card Details&lt;/strong&gt; while doing signup on &lt;strong&gt;AWS&lt;/strong&gt;. As they will only charge if the usgage exceeds free plan.&lt;/li&gt;
&lt;li&gt;To test push notifications from &lt;strong&gt;AWS Pinpoint&lt;/strong&gt; console here is the &lt;a href="https://docs.aws.amazon.com/pinpoint/latest/userguide/messages-mobile.html"&gt;&lt;strong&gt;document&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For beginners seeking &lt;strong&gt;Node JS tutorial&lt;/strong&gt;. I will recommend &lt;a href="https://www.udemy.com/course/nodejs-express-mongodb-bootcamp/"&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I am expecting you have basic knowledege of Node JS. Still you can setup project from here&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;VS Code:&lt;/strong&gt; &lt;a href="https://code.visualstudio.com/docs/nodejs/nodejs-tutorial"&gt;https://code.visualstudio.com/docs/nodejs/nodejs-tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MDN:&lt;/strong&gt; &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/development_environment"&gt;https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/development_environment&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So situation is not that simple here as we go through Node JS SDK &lt;a href="https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/getting-started-nodejs.html"&gt;&lt;strong&gt;Document&lt;/strong&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aws-sdk-v3-iam-examples"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  
   &lt;/span&gt;&lt;span class="nl"&gt;"@aws-sdk/client-s3"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.32.0"&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="w"&gt;  
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now according to this we are installing &lt;strong&gt;AWS S3 Client&lt;/strong&gt;. But wait our requirement is to test notification using pinpoint. So we will add depedencies in &lt;strong&gt;package.json&lt;/strong&gt; like below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FCM Test Server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Abhishek Thapliyal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  
    &lt;/span&gt;&lt;span class="nl"&gt;"@aws-sdk/client-pinpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.54.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  
    &lt;/span&gt;&lt;span class="nl"&gt;"aws-sdk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.1094.0"&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;  
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="w"&gt;  
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hit the below command to install dependencies&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now as per &lt;a href="https://docs.aws.amazon.com/pinpoint/latest/developerguide/send-messages-push.html"&gt;&lt;strong&gt;official document&lt;/strong&gt;&lt;/a&gt;, Node JS Example for testing push notification will be updated as below. In doc you will see other targets as well like &lt;strong&gt;APNS&lt;/strong&gt;, &lt;strong&gt;Baidu&lt;/strong&gt; etc. But we need to &lt;strong&gt;FCM&lt;/strong&gt; so I removed other services.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws-sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;REGION&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;applicationId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;APPLICATION_ID&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;FCM TOKEN&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GCM&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;CreateMessageRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GCM&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;messageRequest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;ChannelType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GCM&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;MessageConfiguration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;GCMMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;RawContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`{
                    "notification": {
                      "title": "AWS Pinpoint Notification title",
                      "body": "AWS Pinpoint Notification body",
                      "sound": "default",
                      "content_available": true
                    },
                    "data": {
                      "url": "katapult://leases/118636"
                    },
                    "priority": "high"
                  }`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;messageRequest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;ShowOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MessageResponse&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Result&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]][&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DeliveryStatus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SUCCESSFUL&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Message sent! Response information: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The message wasn't sent. Response information: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;messageRequest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;CreateMessageRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SharedIniFileCredentials&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;pinpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Pinpoint&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;ApplicationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;applicationId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;MessageRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;messageRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;pinpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendMessages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nx"&gt;ShowOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SendMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have to replace &lt;strong&gt;REGION&lt;/strong&gt;, &lt;strong&gt;APPLICATION_ID&lt;/strong&gt; and &lt;strong&gt;FCM&lt;/strong&gt; &lt;strong&gt;TOKEN&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REGION:&lt;/strong&gt; You will get region on top right cornor of AWS console.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5eUznpko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AywhBVKfqedJ9swa7ExgIlQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5eUznpko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AywhBVKfqedJ9swa7ExgIlQ.png" alt="AWS Region" width="880" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APPLICATION_ID:&lt;/strong&gt; Search for pinpoint in AWS Console. Add a new project. It will ask for &lt;strong&gt;Configure features,&lt;/strong&gt; select &lt;strong&gt;Push Notifications.&lt;/strong&gt; It will as for &lt;strong&gt;Push notifications services,&lt;/strong&gt; choose &lt;strong&gt;FCM&lt;/strong&gt; and add FCM Server key from FCM Console. You will get inside &lt;strong&gt;Project Settings &amp;gt; Cloud Messsaging.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You will get &lt;strong&gt;Application Id&lt;/strong&gt; name as &lt;strong&gt;Project Id&lt;/strong&gt; when project is created successfully in AWS Pinpoint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WKc-uQTH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A1cfb85JSpPPCLb0QV3-Fgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WKc-uQTH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A1cfb85JSpPPCLb0QV3-Fgg.png" alt="AWS Pinpoint Dashboard" width="880" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FCM&lt;/strong&gt; &lt;strong&gt;TOKEN&lt;/strong&gt; : You will get fcm token from device depending upon the mobile project you are working. Below are references for setup and get FCM Token&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Android&lt;/strong&gt;: &lt;a href="https://firebase.google.com/docs/cloud-messaging/android/client"&gt;https://firebase.google.com/docs/cloud-messaging/android/client&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS&lt;/strong&gt;: &lt;a href="https://firebase.google.com/docs/cloud-messaging/ios/client"&gt;https://firebase.google.com/docs/cloud-messaging/ios/client&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React-Native&lt;/strong&gt;: &lt;a href="https://firebase.google.com/docs/cloud-messaging/ios/client"&gt;https://firebase.google.com/docs/cloud-messaging/ios/client&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Make sure you have requested notifications in already before testing.&lt;/p&gt;

&lt;p&gt;I have used to &lt;strong&gt;RawContent&lt;/strong&gt; as I wanted to support background notification as per FCM Payload Structure. You can play around with properties from &lt;a href="https://docs.aws.amazon.com/pinpoint/latest/apireference/templates-template-name-push.html"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So In your request controller you have to use like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SendMessage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Location /to/pinpoint&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;_notification&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;_service.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);.&lt;/span&gt;  
&lt;span class="p"&gt;..&lt;/span&gt;  
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;strong&gt;async await&lt;/strong&gt; to make flow as per your requirement.&lt;/p&gt;

&lt;p&gt;Hit the API and See the magic&lt;/p&gt;

&lt;p&gt;All document links are attached. You can check and feel free to add feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Coding 😄😄&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>node</category>
      <category>firebase</category>
      <category>ios</category>
    </item>
    <item>
      <title>Deploy iOS Application to AppCenter via Github Actions (Manual Code SignIn)</title>
      <dc:creator>Abhishek Thapliyal</dc:creator>
      <pubDate>Mon, 28 Mar 2022 18:10:09 +0000</pubDate>
      <link>https://forem.com/abhishek9634/deploy-ios-application-to-appcenter-via-github-actions-manual-code-signin-34b9</link>
      <guid>https://forem.com/abhishek9634/deploy-ios-application-to-appcenter-via-github-actions-manual-code-signin-34b9</guid>
      <description>&lt;p&gt;🌅 Good Morning Guys ☕️&lt;/p&gt;

&lt;p&gt;⏰ 25th March 2022 08:15 hrs IST&lt;/p&gt;

&lt;p&gt;I know you have read lots of tutorials same like this. But for me, this is my latest achievement from the last 4 days to learn CI/CD which I have been procrastinating on for a long time. Here is the simplest way to automate uploading iOS build to &lt;strong&gt;AppCenter&lt;/strong&gt; with &lt;strong&gt;Fastlane&lt;/strong&gt; and &lt;strong&gt;Github Actions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's make a list we needed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Apple Account Mandatory for code signing. If you are in a team/organization, you ask for a testing bundle and certificates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Xcode 13.3/13.2.1, well that is independent but I’m using both so just to mention for clarifying any confusion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Github, AppCenter, Apple accounts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cocoapods, Fastlane lib. No worries I have added steps where ever required.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;P.S.: We are pushing build with a development profile to AppCenter and NOT for AppStore because of limited access 😅.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's start with some lazy steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Account Setup
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/kHTXxbVYbYzGlhjKXs/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/kHTXxbVYbYzGlhjKXs/giphy.gif" alt="Sign Up"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Github&lt;/strong&gt;: &lt;a href="https://github.com/signup" rel="noopener noreferrer"&gt;https://github.com/signup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AppCenter&lt;/strong&gt;: &lt;a href="https://appcenter.ms/create-account" rel="noopener noreferrer"&gt;https://appcenter.ms/create-account&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple Account&lt;/strong&gt;: I feel that is already provided by your organization. But still here: &lt;a href="https://support.apple.com/en-in/HT204316" rel="noopener noreferrer"&gt;https://support.apple.com/en-in/HT204316&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Xcode:&lt;/strong&gt; Download Xcode from here &lt;a href="https://developer.apple.com/xcode/" rel="noopener noreferrer"&gt;https://developer.apple.com/xcode/&lt;/a&gt;&lt;br&gt;
Open Xcode, go to top menu &lt;strong&gt;Xcode &amp;gt; Preferences.&lt;/strong&gt; A dialogue will open, on the bottom left tap on the &lt;strong&gt;'+'&lt;/strong&gt; button, Select Apple Id. Add your credentials and after that when you see your account tap on download profiles.&lt;/p&gt;
&lt;h3&gt;
  
  
  AppCenter Setup
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/appcenter/dashboard/creating-and-managing-apps" rel="noopener noreferrer"&gt;Here&lt;/a&gt; is the helping doc for the dashboard. Login to AppCenter and you will see a dashboard like below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F7168%2F1%2AUdBjhlDc6lmLf4E3OR-ZUw.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%2Fcdn-images-1.medium.com%2Fmax%2F7168%2F1%2AUdBjhlDc6lmLf4E3OR-ZUw.png" alt="AppCenter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Top right you will see &lt;strong&gt;Add new app&lt;/strong&gt; button, A side menu will appear to ask below details&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;App Name:&lt;/strong&gt; AppCenterDemo-iOS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release Type:&lt;/strong&gt; Beta&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OS:&lt;/strong&gt; iOS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; Objective-C / Swift.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tap on &lt;strong&gt;Add new app&lt;/strong&gt; button on the bottom right and it will redirect you to the app’s dashboard page. There you will get app secret and cocoapods installation link as well. Save the app secret for the next section.&lt;/p&gt;
&lt;h3&gt;
  
  
  Xcode Project Setup
&lt;/h3&gt;

&lt;p&gt;Open Xcode, create a new project any name let's say &lt;strong&gt;AppCenterDemo.&lt;/strong&gt; You can learn from &lt;a href="https://developer.apple.com/documentation/xcode/creating-an-xcode-project-for-an-app" rel="noopener noreferrer"&gt;here&lt;/a&gt; as well just in case. Click on Project and you will general settings, tap on signing and capabilities, uncheck automatic sign in and&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Choose your organization's team in the dropdown.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setup your bundle id like &lt;strong&gt;com.organization.appname.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update your &lt;strong&gt;.gitignore&lt;/strong&gt; file before pushing your code to GitHub Like below. We are removing pods, DeriveData, Fastlane some files which are not required in the repo.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xcuserdata/
*.xcscmblueprint
*.xccheckout

build/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3

*.hmap
*.ipa
*.dSYM.zip
*.dSYM

timeline.xctimeline
playground.xcworkspace
.build/
Pods/
Carthage/Build/
Dependencies/
.accio/

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output

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

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Download the provisioning profile and keep a soft copy of the same as well for later usage in Fastlane.&lt;/li&gt;
&lt;/ol&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%2Fcdn-images-1.medium.com%2Fmax%2F5608%2F1%2AbebACUkA8tbigd_l8bJycA.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%2Fcdn-images-1.medium.com%2Fmax%2F5608%2F1%2AbebACUkA8tbigd_l8bJycA.png" alt="Project Settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open Keychain, and check the Apple Development certificate provided by your organization or your developer account, tap on to see the dropdown.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will see a private key. right-click on it and select the export option&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fcdn-images-1.medium.com%2Fmax%2F6008%2F1%2AXhrVSzApwxZf2zh5lScfRA.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%2Fcdn-images-1.medium.com%2Fmax%2F6008%2F1%2AXhrVSzApwxZf2zh5lScfRA.png" alt="Keychain"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save the &lt;strong&gt;.p12&lt;/strong&gt; file for later use. Here I have created &lt;strong&gt;ios_dev_certificate.p12&lt;/strong&gt;. Use the password when prompted for a password and save it for later use in this tutorial.&lt;/li&gt;
&lt;/ol&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%2Fcdn-images-1.medium.com%2Fmax%2F5204%2F1%2AwHB99cvvgj9X86GYLvh8RA.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%2Fcdn-images-1.medium.com%2Fmax%2F5204%2F1%2AwHB99cvvgj9X86GYLvh8RA.png" alt="development p12"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hard part is done 😅&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l0Iyl55kTeh71nTXy/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l0Iyl55kTeh71nTXy/giphy.gif" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup cocoapods from &lt;a href="https://guides.cocoapods.org/using/getting-started.html" rel="noopener noreferrer"&gt;here&lt;/a&gt; if not done in past. Open podfile and add like below. Here we are integrating the &lt;a href="https://docs.microsoft.com/en-us/appcenter/sdk/getting-started/ios" rel="noopener noreferrer"&gt;&lt;strong&gt;AppCenter&lt;/strong&gt;&lt;/a&gt;.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="kt"&gt;AppCenterDemo&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;pod&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="kt"&gt;AppCenter&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Go to the terminal inside the root directory and run &lt;strong&gt;pod install&lt;/strong&gt; in the terminal. You will observe a workspace is created like a project file. Open workspace project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;AppDelegate&lt;/strong&gt; file or in the main file for &lt;strong&gt;SwiftUI projects&lt;/strong&gt;, add the code below. Declare a constant variable for &lt;strong&gt;appSecret. AppSecret&lt;/strong&gt; is the same I mentioned at the end of the previous section.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kt"&gt;AppCenter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;withAppSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;appSecret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
    &lt;span class="kt"&gt;Analytics&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;Crashes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Run/Build your project in order to check everything is working.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Fastlane Setup Part 1
&lt;/h3&gt;

&lt;p&gt;For all further steps, I will recommend &lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;&lt;strong&gt;VS Code&lt;/strong&gt;&lt;/a&gt; Editor. As we will get the project structure and terminal in a single window and we can access &lt;strong&gt;.extension&lt;/strong&gt; files as well.&lt;/p&gt;

&lt;p&gt;Install fastlane via running below command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo gem install fastlane 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open terminal, navigate to project root directory and run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastlane init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://docs.fastlane.tools/getting-started/ios/setup/" rel="noopener noreferrer"&gt;Helping Doc&lt;/a&gt; for iOS Setup.&lt;/p&gt;

&lt;p&gt;You will see a Fastlane folder with Gemfile, AppFile, Fastfile and  plugin files.&lt;br&gt;
Now add &lt;a href="https://github.com/microsoft/fastlane-plugin-appcenter" rel="noopener noreferrer"&gt;AppCenter Plugin&lt;/a&gt; for Fastlane via command fastlane add_plugin appcenter.&lt;/p&gt;

&lt;p&gt;Now initial Fastlane setup add these in &lt;strong&gt;Gemfile&lt;/strong&gt; and run bundle install.&lt;br&gt;
&lt;a href="https://docs.fastlane.tools/getting-started/ios/setup/" rel="noopener noreferrer"&gt;Here&lt;/a&gt; is the &lt;strong&gt;Gemfile&lt;/strong&gt; setup at the end of the doc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;"https://rubygems.org"&lt;/span&gt;

&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'dotenv-rails'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;groups: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:development&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:test&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"fastlane"&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"xcode-install"&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"cocoapods"&lt;/span&gt;

&lt;span class="n"&gt;plugins_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'fastlane'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Pluginfile'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;eval_gemfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plugins_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exist?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plugins_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are libraries will be used by Fastlane as an initial setup. &lt;a href="https://rubygems.org/gems/dotenv-rails/versions/2.1.1" rel="noopener noreferrer"&gt;Dotenv-rails&lt;/a&gt; is used to load the environment while running Fastlane.&lt;/p&gt;

&lt;p&gt;To specify the ruby version, add &lt;strong&gt;.ruby-version&lt;/strong&gt; file and inside that add a single line string &lt;code&gt;2.6.8&lt;/code&gt;. This will be used by Fastlane.&lt;/p&gt;

&lt;p&gt;Now add &lt;code&gt;.env&lt;/code&gt; file like below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# General&lt;/span&gt;
&lt;span class="no"&gt;WORKSPACE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;AppCenterDemo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xcworkspace&lt;/span&gt;
&lt;span class="no"&gt;PROJECT_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;AppCenterDemo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xcodeproj&lt;/span&gt;
&lt;span class="no"&gt;BUILD_CONFIGURATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;Debug&lt;/span&gt;
&lt;span class="no"&gt;SCHEME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;AppCenterDemo&lt;/span&gt;
&lt;span class="no"&gt;EXPORT_METHOD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;development&lt;/span&gt;
&lt;span class="no"&gt;VERSION_BUMP_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;patch&lt;/span&gt;
&lt;span class="no"&gt;APP_AUTHOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;Abhishek&lt;/span&gt; &lt;span class="no"&gt;Thapliyal&lt;/span&gt;

&lt;span class="c1"&gt;# Appcenter&lt;/span&gt;
&lt;span class="no"&gt;APP_CENTER_OWNER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"thapliyal-fueled.com"&lt;/span&gt;
&lt;span class="no"&gt;APP_CENTER_APP_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"AppCenterDemo-iOS"&lt;/span&gt;
&lt;span class="no"&gt;APP_CENTER_DISTRIBUTION_GROUPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Collaborators"&lt;/span&gt;
&lt;span class="no"&gt;APP_CENTER_NOTIFY_TESTERS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="no"&gt;APP_CENTER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&lt;/span&gt;
&lt;span class="no"&gt;APP_CENTER_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&lt;/span&gt;

&lt;span class="c1"&gt;#CodeSignIn&lt;/span&gt;
&lt;span class="no"&gt;PROVSIONING_PROFILE_REPO_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"./fastlane/provision/Dev_Profile.mobileprovision"&lt;/span&gt;
&lt;span class="no"&gt;KEYCHAIN_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"CodeSignInData"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are environment variables used in shell script and Fastfile later in the tutorial.&lt;/p&gt;

&lt;p&gt;Check the &lt;a href="https://docs.fastlane.tools/actions/gym/" rel="noopener noreferrer"&gt;&lt;strong&gt;Parameters&lt;/strong&gt;&lt;/a&gt; section for more details of the export method, scheme, workspace, Project Path and build configuration.&lt;/p&gt;

&lt;p&gt;To get the &lt;strong&gt;APP_CENTER_APP_NAME&lt;/strong&gt; and &lt;strong&gt;APP_CENTER_OWNER_NAME&lt;/strong&gt; here is the &lt;a href="https://github.com/microsoft/fastlane-plugin-appcenter#a-note-on-app-name" rel="noopener noreferrer"&gt;link&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://appcenter.ms/users/{owner_name}/apps/{app_name" rel="noopener noreferrer"&gt;https://appcenter.ms/users/{owner_name}/apps/{app_name&lt;/a&gt;}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;APP_CENTER_API_KEY:&lt;/strong&gt; This is the same used previously in &lt;strong&gt;AppDelegate&lt;/strong&gt;. Update here as well.&lt;br&gt;
&lt;strong&gt;APP_CENTER_API_TOKEN:&lt;/strong&gt; &lt;a href="https://appcenter.ms/settings/apitokens" rel="noopener noreferrer"&gt;https://appcenter.ms/settings/apitokens&lt;/a&gt;&lt;br&gt;
Use this link to get API Token.&lt;/p&gt;
&lt;h3&gt;
  
  
  Github Repo
&lt;/h3&gt;

&lt;p&gt;You need to create a new repository in order to proceed further.&lt;br&gt;
Beginner, please follow these docs for the Github repository setup.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.github.com/en/get-started/quickstart/create-a-repo" rel="noopener noreferrer"&gt;Create Repository&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository" rel="noopener noreferrer"&gt;Cloning&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh" rel="noopener noreferrer"&gt;SSH Setup&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now add a new folder name &lt;strong&gt;provision&lt;/strong&gt; inside &lt;strong&gt;fastlane&lt;/strong&gt; folder and move the earlier &lt;strong&gt;Dev_Profile.mobileprovision&lt;/strong&gt; file inside. Now push the code to the repo.&lt;/p&gt;
&lt;h3&gt;
  
  
  Github Secrets
&lt;/h3&gt;

&lt;p&gt;Now we have to setup Github Secrets in order to secure the &lt;strong&gt;.p12&lt;/strong&gt; file and &lt;strong&gt;credentials&lt;/strong&gt;. Follow this &lt;a href="https://docs.github.com/en/actions/security-guides/encrypted-secrets" rel="noopener noreferrer"&gt;doc&lt;/a&gt; for encrypted secrets and create as follow&lt;/p&gt;

&lt;p&gt;Github Deploying Xcode Applications &lt;a href="https://docs.github.com/en/actions/deployment/deploying-xcode-applications/installing-an-apple-certificate-on-macos-runners-for-xcode-development#creating-secrets-for-your-certificate-and-provisioning-profile" rel="noopener noreferrer"&gt;Doc&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the directory where &lt;strong&gt;ios_dev_certificate.p12&lt;/strong&gt; is saved earlier.
Open terminal in the same directory and
run
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;base64 -i ios_dev_certificate.p12 | pbcopy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This will copy the base64 string in the pasteboard. You can check it via &lt;strong&gt;cmd+v&lt;/strong&gt;. Save it in Github Secrets with the key name &lt;strong&gt;IOS_DEVELOPMENT&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The password we have saved while creating the above certificate will be saved in Github Secrets with the key name &lt;strong&gt;P12_PASSWORD&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add one more value &lt;strong&gt;KEYCHAIN_PASSWORD&lt;/strong&gt; for the keychain that will be used in Fastlane. I recommend make it strong.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Github Actions
&lt;/h3&gt;

&lt;p&gt;Now in the root directory of the project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Add nested folder &lt;strong&gt;.github/workflows.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;strong&gt;yml&lt;/strong&gt; file name &lt;strong&gt;gh_actions.yml&lt;/strong&gt; inside the &lt;strong&gt;workflows&lt;/strong&gt; folder. There is no specific name you can choose any name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update your above &lt;strong&gt;yml&lt;/strong&gt; file like below.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;iOS App Center Deployment&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;macos-11&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ruby/setup-ruby@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;bundler-cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Fastlane for iOS&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;IOS_DEVELOPMENT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.IOS_DEVELOPMENT }}&lt;/span&gt;
          &lt;span class="na"&gt;P12_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.P12_PASSWORD }}&lt;/span&gt;
          &lt;span class="na"&gt;KEYCHAIN_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.KEYCHAIN_PASSWORD }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bundle exec fastlane beta_app_upload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;name:&lt;/strong&gt; Workflow name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;on:&lt;/strong&gt; on which &lt;a href="https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#events" rel="noopener noreferrer"&gt;event&lt;/a&gt; it will be triggered. Here I have added push i.e. on every push a build will be triggered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;jobs:&lt;/strong&gt; Series of actions that will be executed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;build:&lt;/strong&gt; Action Name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;runs-on: OS Name&lt;/strong&gt; in which actions will be executed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;uses: actions/checkout@v2:&lt;/strong&gt; Use to checkout branch&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;uses: ruby/setup-ruby@v1:&lt;/strong&gt; Ruby setup with &lt;strong&gt;bundler-cache: true&lt;/strong&gt; so that Gemfile libraries can be used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;name:&lt;/strong&gt; Specifying name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;run:&lt;/strong&gt; to run shell script command&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;env:&lt;/strong&gt; Here we will mention environment variables that will be used in Fastlane and Github actions from Github Secrets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;Here&lt;/a&gt; is the reference doc for actions. More details for the workflow file are &lt;a href="https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#understanding-the-workflow-file" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Well, It’s afternoon 13:30 hrs IST. Have lunch and come back 😅&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Fastlane Setup Part 2
&lt;/h3&gt;

&lt;p&gt;Here is the most important section that will actually deploy our app.&lt;/p&gt;

&lt;p&gt;Below are the &lt;strong&gt;documented&lt;/strong&gt; &lt;a href="https://docs.fastlane.tools/actions/" rel="noopener noreferrer"&gt;&lt;strong&gt;fastlane actions&lt;/strong&gt;&lt;/a&gt;. Please go through once before using.&lt;/p&gt;

&lt;p&gt;Now open fastfile inside fastlane folder. Update the code like below.&lt;br&gt;
from this &lt;a href="https://dev.to/matt_catalfamo/how-to-build-and-manually-sign-an-ios-app-with-fastlane-2256"&gt;blog&lt;/a&gt; I have taken reference to certificates setup. Our agenda is divided in three setps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Add action to generate &lt;strong&gt;KeyChain&lt;/strong&gt; for code signIn.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add action to generate &lt;strong&gt;iOS Build&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add action to upload build to &lt;strong&gt;AppCenter&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;default_platform&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="nx"&gt;ios&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;platform&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;ios&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

  &lt;span class="nx"&gt;private_lane&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;setup_certificates&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nf"&gt;create_keychain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CodeSignInData&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;KEYCHAIN_PASSWORD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;default_keychain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;unlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;lock_when_sleeps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;install_provisioning_profile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PROVSIONING_PROFILE_REPO_PATH&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;    
    &lt;span class="nx"&gt;setup_ios_profiles&lt;/span&gt;
    &lt;span class="nf"&gt;import_certificate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;certificate_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fastlane/certificates/ios_dev_certificate.p12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;certificate_password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;P12_PASSWORD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;keychain_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CodeSignInData&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;keychain_password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;KEYCHAIN_PASSWORD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;end&lt;/span&gt;

  &lt;span class="nx"&gt;desc&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AppCenter iOS App. Upload&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;lane&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;beta_app_upload&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nf"&gt;xcversion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;13.2.1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;setup_certificates&lt;/span&gt;
    &lt;span class="nx"&gt;clear_derived_data&lt;/span&gt;
    &lt;span class="nf"&gt;xcclean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SCHEME&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="nf"&gt;cocoapods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;build_ios_app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WORKSPACE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BUILD_CONFIGURATION&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SCHEME&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;disable_xcpretty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;export_options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EXPORT_METHOD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;appcenter_upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;api_token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;APP_CENTER_API_TOKEN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;owner_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;APP_CENTER_OWNER_NAME&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;owner_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;app_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;APP_CENTER_APP_NAME&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;notify_testers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;APP_CENTER_NOTIFY_TESTERS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;end&lt;/span&gt;
&lt;span class="nx"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;create_keychain&lt;/code&gt;: use to create keychain in github runner environment. &lt;a href="https://docs.fastlane.tools/actions/create_keychain/" rel="noopener noreferrer"&gt;&lt;strong&gt;Doc&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;install_provisioning_profile&lt;/code&gt;: use to install provision profiles for code sign in. &lt;a href="http://docs.fastlane.tools/actions/install_provisioning_profile/#install_provisioning_profile" rel="noopener noreferrer"&gt;&lt;strong&gt;Doc&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;import_certificate&lt;/code&gt;: use to import &lt;strong&gt;.p12&lt;/strong&gt; certificate from github secrets mentioned in env file inside &lt;strong&gt;github actions yml&lt;/strong&gt; file previously. &lt;a href="http://docs.fastlane.tools/actions/import_certificate/#import_certificate" rel="noopener noreferrer"&gt;&lt;strong&gt;Doc&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;setup_ios_profiles&lt;/code&gt;: It’s the custom Fastlane action created by me. &lt;a href="http://docs.fastlane.tools/create-action/#local-actions" rel="noopener noreferrer"&gt;&lt;strong&gt;Doc&lt;/strong&gt;&lt;/a&gt; &lt;a href="https://spin.atomicobject.com/2021/05/21/custom-bash-script-fastlane/" rel="noopener noreferrer"&gt;Example&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open terminal and run&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bundle exec fastlane new_action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It will ask you name for action. I have added &lt;strong&gt;setup_ios_profiles&lt;/strong&gt;. A &lt;strong&gt;setup_ios_profiles.rb&lt;/strong&gt; will be generated inside fastlane folder. Add below code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Fastlane&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Actions&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SetupIosProfilesAction&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Action&lt;/span&gt;
      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="no"&gt;UI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s2"&gt;"Setup Keychain"&lt;/span&gt;
        &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"./fastlane/actions/setup_code_signin.sh"&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;

      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_supported?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="ss"&gt;:ios&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now create new file &lt;code&gt;setup_code_signin.sh&lt;/code&gt;, open terminal in same directory and run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod u+x ./setup_code_signin.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will make file executable for user. After that update code below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DEV_CERTIFICATE_PATH=./fastlane/certificates/ios_dev_certificate.p12

mkdir -p ./fastlane/certificates

echo "$IOS_DEVELOPMENT" | base64 -d -o $DEV_CERTIFICATE_PATH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script will convert saved base64 string from github secrets, mentioned in yml file, to &lt;strong&gt;.p12&lt;/strong&gt; file.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;xcversion&lt;/code&gt;: use to specify Xcode version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;clear_derived_data&lt;/code&gt;: use to clear derive data use to clear derive data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;xcclean&lt;/code&gt;: use to clean project with specified scheme.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cocoapods&lt;/code&gt;: use to install cocoapods with repo update if specified.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now code signIn and fastlane project in github action is almost setup. We have to configure rest two setps. As shown above fastfile code build_ios_app will generate build for iOS &lt;strong&gt;(&lt;a href="http://docs.fastlane.tools/actions/build_ios_app/#build_ios_app" rel="noopener noreferrer"&gt;Reference Doc&lt;/a&gt;)&lt;/strong&gt;. It will take values mentioned in &lt;strong&gt;.env&lt;/strong&gt; file. Have a closer to export method, you can change to as per &lt;a href="http://docs.fastlane.tools/actions/build_ios_app/#parameters" rel="noopener noreferrer"&gt;&lt;strong&gt;doc&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;export_method&lt;/span&gt; &lt;span class="c1"&gt;// Method used to export the archive. Valid values are: app-store, validation, ad-hoc, package, enterprise, development, developer-id and mac-application.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the last part upload to &lt;a href="https://github.com/microsoft/fastlane-plugin-appcenter#usage" rel="noopener noreferrer"&gt;&lt;strong&gt;AppCenter&lt;/strong&gt;&lt;/a&gt; i.e. &lt;code&gt;appcenter_upload&lt;/code&gt;: This method will take &lt;strong&gt;App. Name&lt;/strong&gt;, &lt;strong&gt;API Token&lt;/strong&gt; and &lt;strong&gt;Owner Name&lt;/strong&gt; from &lt;strong&gt;.env&lt;/strong&gt; file. We have discussed earlier as well. As per doc&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;owner_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// # Default is user - set to organization for appcenter organizations &lt;/span&gt;

&lt;span class="nx"&gt;app_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;appcenter app name (as seen in app URL)&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 

&lt;span class="nx"&gt;notify_testers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;// # Set to false if you don't want to notify testers of your new release (default: `false`)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now push your code and see the magic. If all goes well then in a sample logs for successful app upload to &lt;strong&gt;AppCenter&lt;/strong&gt; will looks like below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F4564%2F1%2AtSeRiZuAbeMYBmNVK3VOTg.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%2Fcdn-images-1.medium.com%2Fmax%2F4564%2F1%2AtSeRiZuAbeMYBmNVK3VOTg.png" alt="Github Actions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can &lt;strong&gt;cmd+click&lt;/strong&gt; the link to navigate app center release page as well.&lt;/p&gt;

&lt;p&gt;I hope you will get an idea &lt;strong&gt;CI/CD&lt;/strong&gt; works. You can explore more yourself for TestFlight builds as well as managing several environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HAPPY CODING 😃😃&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good Night 😴 🛌&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>fastlane</category>
      <category>appcenter</category>
      <category>github</category>
      <category>cicd</category>
    </item>
  </channel>
</rss>
