<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Christian Helvin</title>
    <description>The latest articles on DEV Community by Christian Helvin (@christianpatrick).</description>
    <link>https://dev.to/christianpatrick</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%2F463788%2F52d117d1-3e2a-4e6a-8670-125939d40c74.jpg</url>
      <title>DEV Community: Christian Helvin</title>
      <link>https://dev.to/christianpatrick</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/christianpatrick"/>
    <language>en</language>
    <item>
      <title>Ethical Augmentation: An Engineering Leader’s Perspective on Outsourcing</title>
      <dc:creator>Christian Helvin</dc:creator>
      <pubDate>Tue, 20 Aug 2024 03:07:44 +0000</pubDate>
      <link>https://dev.to/christianpatrick/ethical-augmentation-an-engineering-leaders-perspective-on-outsourcing-58kg</link>
      <guid>https://dev.to/christianpatrick/ethical-augmentation-an-engineering-leaders-perspective-on-outsourcing-58kg</guid>
      <description>&lt;p&gt;Outsourcing. Augmentation. We hear these words too often and see them executed poorly the majority of the time. As an agency owner and now a software engineering leader, I have seen firsthand the pitfalls associated with traditional outsourcing models. The fear of "outsourcing the company brain" and losing touch with what we build is real and justified. And it’s a worry that kept me awake at night as we had to increase our development capabilities.&lt;/p&gt;

&lt;p&gt;How can we manage our costs and accelerate our progress without losing the knowledge that makes us unique as a company: our code? In collaborating with a fantastic nearshore partner, we created "ethical augmentation", and it's transformed how we think about outsourcing and staff augmentation.&lt;/p&gt;

&lt;p&gt;At its heart, ethical augmentation means maintaining control over our code and core competences while using an external partner to increase our productivity. We knew that our company's brain, our in-depth knowledge of our products' logic and algorithms, must remain within the organization, so we strategically paired our nearshore developers up with senior engineers and architects intimately aware of our systems.&lt;/p&gt;

&lt;p&gt;This partnership is all about creating a symbiotic relationship. Our in-house team is responsible for the core architecture and logic of all our projects, ensuring that we stay connected to every aspect of our development. Our outsourced team members, on the other hand, bring new perspectives and more bandwidth, while using the same methodologies and practices we subscribe to internally. Because they are part of us, they work the same way we do. This allows us to tackle more technical debt and release more features better than ever!&lt;/p&gt;

&lt;p&gt;The results have been phenomenal! We are not only maintaining our systems but also expanding them. Our in-house teams and our outsourced team have a constant exchange of knowledge. The internal engineers are empowered and feel included, eliminating the fear of outsourcing completely and focusing on developing stronger leadership and communications skills. And each of our outsourced team members are gaining deep insights into our development processes and have the opportunity to code value for thousands of customers too!&lt;/p&gt;

&lt;p&gt;Let's be clear, this isn’t a magic wand fix. To implement ethical augmentation, you need to be committed, have clear communication and invest in your relationships. We had to refine our onboarding processes, create clearer code review practices, and cultivate a culture of collaboration across borders. It's definitely been challenging at times, but the payoff has been worth every ounce of effort.&lt;/p&gt;

&lt;p&gt;What we've created is so much more than just a cost-saving measure. This is a great example of how mid-sized and small engineering teams can scale up without losing their soul. We’re tackling more projects and reducing more technical debt than ever before. We're strengthening our core competencies and our teams, rather than reducing them.&lt;/p&gt;

&lt;p&gt;Are you a leader faced with scaling your entire engineering department or team? I encourage you to rethink what the right kind of staff augmentation could mean for your company. The goal of ethical augmentation is not to offload work, but rather to strategically expand your team's abilities while maintaining your company's crucial knowledge and culture. The brain of your company is too valuable to take a risk. Let's talk about your questions and thoughts! I have learned many valuable lessons from this transition, and I look forward to sharing them with you.&lt;br&gt;
Message me on &lt;a href="https://x.com/christianhelvin" rel="noopener noreferrer"&gt;X&lt;/a&gt; or &lt;a href="https://mynameischristian.com/calendar" rel="noopener noreferrer"&gt;find a time to chat&lt;/a&gt;!&lt;/p&gt;




&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@fakurian?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Milad Fakurian&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/blue-and-green-peacock-feather-58Z17lnVS4U?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>leadership</category>
      <category>management</category>
    </item>
    <item>
      <title>The choice to build open source and in public</title>
      <dc:creator>Christian Helvin</dc:creator>
      <pubDate>Sun, 10 Jul 2022 23:14:39 +0000</pubDate>
      <link>https://dev.to/christianpatrick/the-choice-to-build-open-source-and-in-public-37k0</link>
      <guid>https://dev.to/christianpatrick/the-choice-to-build-open-source-and-in-public-37k0</guid>
      <description>&lt;p&gt;Today was a big day! I made the foundational decision for &lt;a href="https://statyes.com"&gt;Statyes&lt;/a&gt; to be an open source from day one.&lt;/p&gt;

&lt;p&gt;This choice might have been the best decision I've made. It also may be the worst. Only time will tell. However, I'm convinced it's a wise decision for the following reasons:&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm building this in public
&lt;/h2&gt;

&lt;p&gt;I've enjoyed following people make their dreams happen over the years! There's something inspiring and so eye-opening to be part of the high's and low's of someone's journey through entrepreneurship. It becomes a collective experience for all to share in the milestones and victories as a product comes to market!&lt;/p&gt;

&lt;p&gt;I'll be vulnerable here as well. It's a lonely journey to build a product by yourself without the support of a community. Just the idea that others might check out my code and make contributions themselves thrills me. It becomes a product much greater than myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  There are few "good" alternatives
&lt;/h2&gt;

&lt;p&gt;The status page world has so much room for improvement. Even in the open source community, the main player Cachet, has effectively been &lt;a href="https://github.com/CachetHQ/Cachet/issues?q=is%3Aissue+is%3Aopen+dead"&gt;marked&lt;/a&gt; "dead" by the community.&lt;/p&gt;

&lt;p&gt;I think there's ample opportunity for big ideas to disrupt the space. And I've got some big ideas! Automated event responses using machine learning, beautiful page builders, and simpler metric connections just to name a few. It's gonna be fun!&lt;/p&gt;

&lt;h2&gt;
  
  
  No reason to make ALL the money
&lt;/h2&gt;

&lt;p&gt;It might sound funny, but this is a sincere ethos I have regarding my personal work. I LOVE building software and am grateful to have a wonderful career that takes care of me and my family.&lt;/p&gt;

&lt;p&gt;As I build Statyes, I definitely want to monetize it (don't mistake open source for completely free). However, there's no reason to hold the code hostage for only the users wanting to pay. Let's be honest, status pages are only as good as their hosting provider is! So I'm already planning out a stellar Kubernetes approach to offer amazing uptime and resiliency from day one.&lt;/p&gt;




&lt;p&gt;Overall, I'm so excited to build this system and get it into the hands of businesses and builders alike. There's a big road ahead of me. However, with the road I chose today, I won't be alone. 🤓&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>startup</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Validate Now. Build Later.</title>
      <dc:creator>Christian Helvin</dc:creator>
      <pubDate>Sat, 04 Jun 2022 03:00:11 +0000</pubDate>
      <link>https://dev.to/christianpatrick/validate-now-build-later-ld5</link>
      <guid>https://dev.to/christianpatrick/validate-now-build-later-ld5</guid>
      <description>&lt;p&gt;I’m an engineer working on a side project that I’ve not even started building yet. And here’s why:&lt;/p&gt;

&lt;p&gt;With all the projects I’ve taken on personally in the past, my immediate response is to build a working MVP and make sure it’s usable for my needs. And now I see why those projects never lift off the ground: I’ve solved my need and moved on.&lt;/p&gt;

&lt;p&gt;What if I started building an audience first? What if I started understanding other potential users’ needs before I build something and assume that’s what everyone else will need?&lt;/p&gt;

&lt;p&gt;These are the questions I’ve been asking myself as I’m going down the path of yet another idea. And it’s working so far! I’m picking up traction by asking for feedback on Reddit, paying for a few ads on Google, and sharing my story on LinkedIn.&lt;/p&gt;

&lt;p&gt;So what have I built? Almost nothing so far in terms of code - just a small prototype to verify I &lt;em&gt;can&lt;/em&gt; build this. But what I am building is a waitlist: an audience. I even went so far as to not code the landing page! Mad props to Carrd for that 🤓&lt;/p&gt;

&lt;p&gt;All that said, I’m not sure how this is going to turn out, but I’m giving it a shot! Next up is figuring out how long to wait before building. My goal is to hit 50 waitlist subscribers this month and take it from there 🤞&lt;/p&gt;




&lt;p&gt;And if you’re curious, I’m building a meeting plugin to easily take notes, create action items, view your day’s schedules, and sync all those pieces in your normal work apps - all without minimizing your video call!&lt;/p&gt;

&lt;p&gt;You can check it out and sign up at: &lt;a href="https://enhancemeet.com"&gt;Enhancemeet.com&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productivity</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Break Out of Emulator Mode</title>
      <dc:creator>Christian Helvin</dc:creator>
      <pubDate>Sat, 05 Sep 2020 02:49:13 +0000</pubDate>
      <link>https://dev.to/christianpatrick/break-out-of-emulator-mode-h2a</link>
      <guid>https://dev.to/christianpatrick/break-out-of-emulator-mode-h2a</guid>
      <description>&lt;p&gt;When I was a teenager, I stumbled across a fascinating category of programs: Emulators. The best versions were emulating game consoles, where you could play your N64 favorites with a keyboard and mouse! Sure, it would take an entire night to download a ported Harvest Moon on dial-up, but it was totally worth it to not share this "new" N64 with my brother.&lt;/p&gt;

&lt;p&gt;Skip forward a few years and I’m graduating high school, now faced with the decision of choosing my future career path. I chose to skip college and pursue a job that would incorporate the one set of skills I already possessed: coding. For a few years prior to graduation, I had been building anything I could get my hands on: websites, scripts for processing form submissions, custom Myspace profile overlays, even those "lovely" stupid website flash intros. You name it, I was coding it or figuring out how.&lt;/p&gt;

&lt;p&gt;In 2009, I moved into development at my first job with a web agency. I remember being immediately conflicted with the belief that professional programmers always knew all the syntax and best solutions by heart. Meanwhile, I'm over here Googling every little problem I'm presented with and crossing my fingers that some obscure forum post will have at least one solution I can apply.&lt;/p&gt;

&lt;p&gt;Each day presented new obstacles that I would slowly tackle. From the first time I read a documentation site and actually understood what I was reading, to the day I wrote a function without any help from the internet, I was learning how to be a better coder! I started becoming a resource to those around me, helping with code issues or suggesting better ways of achieving a certain outcome. But despite others encouraging and complimenting my expertise, I still believed my abilities were no different than the day I first began.&lt;/p&gt;

&lt;p&gt;I found it was quite easy to believe I didn't measure up, that I was just pretending.&lt;/p&gt;

&lt;p&gt;As I mentioned at the beginning of this story, I loved emulators as a kid. But I was quickly becoming a professional one, depriving myself from personal creativity and my work unhindered from the notion that I wasn't good enough.&lt;/p&gt;

&lt;p&gt;I'm sure there's a multitude of reasons that led to my impostor syndrome. No personal formal education, this industry lacking in any broadly recognized licenses or certifications, low barrier to entry, the list goes on. But as I've continued to move forward in my career, as well as in my personal life, I've realized the solution to overcoming this feeling actually lies within ourselves.&lt;/p&gt;

&lt;p&gt;Here's a few ways I cope with impostor syndrome:&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge Yourself
&lt;/h3&gt;

&lt;p&gt;You know one great way to overcome fear of failure? Doing what scares you and then sharing it for the world to see. Just like the post you're reading right now, writing or coding something and then actually shipping it can be the most exhilarating feeling there is.&lt;/p&gt;

&lt;p&gt;I remember the first time a public repository of mine was forked, I felt excited and terrified simultaneously! Someone other than me could see my code, my commits, my writing. They could see me. And to my surprise, that same person reached out and thanked me for the program, explaining that they were able to tweak it for their own needs. Instead of succumbing to the thought that they were just being nice, I realized that my program had made their job easier, and they reached out with genuine gratitude.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Learning
&lt;/h3&gt;

&lt;p&gt;As long as you're alive, you'll never "arrive". This phrase is probably printed on a thousand motivational cat posters and littered throughout self help books, but I love the idea. Having coded for many years now, it's very easy to get stuck in the same methods year after year. But if you want to stay ahead of the game you need to understand that the web changes, and it changes quickly.&lt;/p&gt;

&lt;p&gt;Shoot, if you had told me five years ago that JavaScript would become one of the major programming languages, I would've scoffed and said "it's only for making websites look cooler!" But now, I program in JavaScript applications every day!&lt;/p&gt;

&lt;p&gt;Since change is inevitable, why not embrace it? If you've got a bit of spare time, try learning a new language or framework! Worst case scenario, you waste a few hours of precious Netflix time 😝️ But best case is that you've found a fun new resource to build applications in!&lt;/p&gt;

&lt;h3&gt;
  
  
  Invest in Community
&lt;/h3&gt;

&lt;p&gt;I admit, I have a very extroverted personality. I love hanging out with new people and getting to know them,  and I found that I've been able to use this strength to my advantage. Having recently moved to a larger city, I signed up to regular meet-ups in my area for developers to hang out and talk shop. It’s amazing to discover new perspectives, as well as helping others with similar pitfalls by sharing lessons you've learned, and honestly it's surprisingly refreshing what a good nerd out will do for the soul.&lt;/p&gt;

&lt;p&gt;And hey, if you don't have gatherings around you or don't feel comfortable to visit, there's always options online. Whether it's contributing to your favorite open source libraries, joining a subreddit for a language or framework you enjoy, or learning a new coding software, investing your time with like minded people can be so eye-opening and satisfying to know you are a part of something bigger.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be Kind... to Yourself
&lt;/h3&gt;

&lt;p&gt;Of all the lessons I've had to learn, this one has been the hardest, yet the most important. It's time to give yourself some grace. For the longest time, I felt the need to always deliver. If a new project required some research before I could start shipping code, I figured that was more because of my inability rather than the fact I was diving into new territory. If you have an (un)productive day because you're learning rather than executing, that's great! Take the lessons you learn today and apply them tomorrow.&lt;/p&gt;

&lt;p&gt;Along with giving yourself some room to relax, understand that humility is not the same as putting yourself down. Self-deprecation has been my close companion for a long time. When others complimented my talents, I would quickly dismiss their kind words and suggest there's far more qualified people than myself. What I didn't realize was that in addition to lowering the perception others have of me, I was also suggesting that the companies I worked for were incapable of hiring those "qualified" individuals. Throw away these belittling comments and thoughts! It not only takes away your confidence, but also removes the confidence others have in you.&lt;/p&gt;




&lt;p&gt;If you take away nothing else from this post, digest this: You belong!&lt;/p&gt;

&lt;p&gt;As long as I'm alive, I'll deal with impostor syndrome and the feeling of inadequacies, but I'll be fighting it every day. Whenever I help someone struggling with code or make a contribution to a library, I'm reminded that I have experiences and knowledge to help those around me.&lt;/p&gt;

&lt;p&gt;If you struggle with impostor syndrome, I hope this post has helped you see you're not alone and hopefully provided some tips on how to overcome it. And if you don't struggle with it, that's awesome! Don't feel you have to "fake" it, but rather share the ways that you avoid it.&lt;/p&gt;

&lt;p&gt;Have questions, thoughts, or just want to connect? I'd love to hear from you!&lt;/p&gt;

</description>
      <category>career</category>
      <category>motivation</category>
      <category>inclusion</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>Integrating the Keychain with an iOS ARC App in Xcode</title>
      <dc:creator>Christian Helvin</dc:creator>
      <pubDate>Sat, 14 Jan 2017 00:00:00 +0000</pubDate>
      <link>https://dev.to/christianpatrick/integrating-the-keychain-with-an-ios-arc-app-in-xcode-1665</link>
      <guid>https://dev.to/christianpatrick/integrating-the-keychain-with-an-ios-arc-app-in-xcode-1665</guid>
      <description>&lt;p&gt;For a recent iOS app I was working on, there was a need to integrate the Keychain to save the login credentials locally.&lt;/p&gt;

&lt;p&gt;After a bit of searching and fumbling through the internet, I found a great library: SFHFKeychainUtils, originally created by Buzz Andersen. I was so excited knowing I wouldn’t have to learn yet another entire framework by hand, until I noticed that none of the tutorials I was following actually worked!&lt;/p&gt;

&lt;p&gt;So here’s my take on integrating the SFHFKeychainUtils. For this demo, I will go through using it with simply Javascript in case you plan to use it with UIWebView.&lt;/p&gt;

&lt;p&gt;First, you’ll want to download the SFHFKeychainUtils and import them into your Xcode project. The version I used that is ARC-Supported is here: &lt;a href="https://github.com/stoneros/SFHFKeychainUtils"&gt;https://github.com/stoneros/SFHFKeychainUtils&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then you can add the Security.framework to your project. Just go to your Target App and choose Build Phases. Under Link Binary with Libraries, add Security.framework and make sure it is Required.&lt;/p&gt;

&lt;p&gt;Finally, in YourViewController.m, add the dependancies to these libraries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight objective_c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#import &amp;lt;Security/Security.h&amp;gt;
#import "SFHFKeychainUtils.h"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now for the good stuff! Let’s get that keychain working!&lt;/p&gt;

&lt;p&gt;Usually, you are just going to be looking for a form submission to grab the credentials, so here’s an easy way of doing that.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight objective_c"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;UIWebView&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;webView&lt;/span&gt; &lt;span class="nf"&gt;shouldStartLoadWithRequest&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSURLRequest&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;request&lt;/span&gt; &lt;span class="nf"&gt;navigationType&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;UIWebViewNavigationType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;navigationType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;//save form data&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;navigationType&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;UIWebViewNavigationTypeFormSubmitted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;NSURL&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;requestURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="nf"&gt;URL&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="n"&gt;requestURL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="nf"&gt;isEqualToString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@"YOURINTERNALSUBMISSIONURL"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;//grab the data from the page&lt;/span&gt;
            &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt; &lt;span class="nf"&gt;stringByEvaluatingJavaScriptFromString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;@"document.getElementById('username').value"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt; &lt;span class="nf"&gt;stringByEvaluatingJavaScriptFromString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;@"document.getElementById('password').value"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="c1"&gt;//store values locally&lt;/span&gt;
            &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;NSUserDefaults&lt;/span&gt; &lt;span class="nf"&gt;standardUserDefaults&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nf"&gt;setObject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nf"&gt;forKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@"username"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SFHFKeychainUtils&lt;/span&gt; &lt;span class="nf"&gt;storeUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nf"&gt;andPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="n"&gt;forServiceName&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@"YOURAPPNAMESPACE"&lt;/span&gt; &lt;span class="n"&gt;updateExisting&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;YES&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;nil&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="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;YES&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="nb"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, anytime your app hits the SUBMISSIONURL, it’s going to save the two NSString variables for username and password into the keychain underneath your app’s name. What’s really cool is those NSStrings are pulling in via Javascript from a text input. You’re welcome ;)&lt;/p&gt;

&lt;p&gt;Next, in your webViewDidFinishLoad section we need to add some listeners to automatically fill in the saved keychain for the next time, your user needs to login.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight objective_c"&gt;&lt;code&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;webViewDidFinishLoad&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;UIWebView&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;//verify view is on the login page of the site (simplified)&lt;/span&gt;
    &lt;span class="n"&gt;NSURL&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;requestURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="nf"&gt;URL&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="n"&gt;requestURL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="nf"&gt;isEqualToString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@"YOURINTERNALSUBMISSIONURL"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;//check for stored login credentials&lt;/span&gt;
        &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;NSUserDefaults&lt;/span&gt; &lt;span class="nf"&gt;standardUserDefaults&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nf"&gt;objectForKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@"username"&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="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;//create js strings&lt;/span&gt;
        &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;loadUsernameJS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="nf"&gt;stringWithFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@"document.getElementById('username').value ='%@'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SFHFKeychainUtils&lt;/span&gt; &lt;span class="nf"&gt;getPasswordForUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nf"&gt;andServiceName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@"YOURAPPNAMESPACE"&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;nil&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="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;loadPasswordJS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="nf"&gt;stringWithFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;@"document.getElementById('password').value ='%@'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="c1"&gt;//autofill the form&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt; &lt;span class="nf"&gt;stringByEvaluatingJavaScriptFromString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;loadUsernameJS&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt; &lt;span class="nf"&gt;stringByEvaluatingJavaScriptFromString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;loadPasswordJS&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, whenever the app lands on the login page, it will now check if values are stored in the keychain and then pre-fill them using Javascript. Of course, you can take this a step further and auto submit the form and such.&lt;/p&gt;

&lt;p&gt;This just give you the overall basics, and if it helps you or if you have any questions, just shoot me a comment below!&lt;/p&gt;

</description>
      <category>keychain</category>
      <category>arc</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
