<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Tri Nguyen&#x27;s Blog</title>
    <subtitle>Mobile app development, Kotlin, Swift, Xamarin, KMM</subtitle>
    <link href="https://trinnguyen.com/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://trinnguyen.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2019-09-21T00:00:00+00:00</updated>
    <id>https://trinnguyen.com/atom.xml</id>
    <entry xml:lang="en">
        <title>Run Xamarin project from command line</title>
        <published>2019-09-21T00:00:00+00:00</published>
        <updated>2019-09-21T00:00:00+00:00</updated>
        <author>
          <name>Tri Nguyen</name>
        </author>
        <link rel="alternate" href="https://trinnguyen.com/xamarin/run-xamarin-project-from-command-line/" type="text/html"/>
        <id>https://trinnguyen.com/xamarin/run-xamarin-project-from-command-line/</id>
        
        <content type="html">&lt;p&gt;&lt;em&gt;Update 2019, Oct 21: Add Build Archive for Xamarin.iOS&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I feel pleasant working on Xamarin projects with VSCode in parallel with Jetbrains Rider IDE. It&#x27;s neccessary to find a way to build and run Xamarin.iOS and Xamarin.Android apps using command line and generate those scripts as tasks in VSCode for quick development.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;run-xamarin-android-project-from-command-line&quot;&gt;Run Xamarin.Android project from command line&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:Build &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:Install &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;adb&lt;&#x2F;span&gt;&lt;span&gt; shell monkey&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span&gt; APP_PACKAGE_NAME 1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;notes&quot;&gt;Notes&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It is required to ensure that devices or simulator is already running. Invoke &lt;em&gt;adb devices&lt;&#x2F;em&gt; should have some result. Simulator can be run using Android SDK tool &lt;em&gt;emulator&lt;&#x2F;em&gt;. Example: &lt;code&gt;.&#x2F;emulator -avd Pixel_2_29&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;There are built-in MSBuild targets that take care of everything, from building to deploying. Have a look at this docs: &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.microsoft.com&#x2F;en-us&#x2F;xamarin&#x2F;android&#x2F;deploy-test&#x2F;building-apps&#x2F;build-process#build-targets&quot;&gt;https:&#x2F;&#x2F;docs.microsoft.com&#x2F;en-us&#x2F;xamarin&#x2F;android&#x2F;deploy-test&#x2F;building-apps&#x2F;build-process#build-targets&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:Build
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:Rebuild
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:Clean
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:Install
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:Uninstall
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:UpdateAndroidResources
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;adb shell monkey&lt;&#x2F;code&gt; is used to launch the installed app&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;UpdateAndroidResources&lt;&#x2F;strong&gt; is useful when having trouble with the generated code in Resources.designer.cs or when editting resources file (i.e. strings.xml)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;run-xamarin-ios-project-from-command-line&quot;&gt;Run Xamarin.iOS project from command line&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;Example build and run Xamarin.iOS app on iPhone XR, iOS 12.4 simulator&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:Build &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;&#x2F;Library&#x2F;Frameworks&#x2F;Xamarin.iOS.framework&#x2F;Versions&#x2F;Current&#x2F;bin&#x2F;mlaunch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt; --launchsim&lt;&#x2F;span&gt;&lt;span&gt;=bin&#x2F;iPhoneSimulator&#x2F;Debug&#x2F;YOUR_IOS_PROJECT_NAME.app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt; --device&lt;&#x2F;span&gt;&lt;span&gt;::v2:runtime=com.apple.CoreSimulator.SimRuntime.iOS-12-4,devicetype=com.apple.CoreSimulator.SimDeviceType.iPhone-XR
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;notes-1&quot;&gt;Notes&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;msbuild &#x2F;t:Build&lt;&#x2F;em&gt; for building the Xamarin.iOS app bundle, output file &lt;em&gt;YOUR_IOS_PROJECT_NAME.app&lt;&#x2F;em&gt; in &lt;em&gt;bin&#x2F;iPhoneSimulator&#x2F;Debug&lt;&#x2F;em&gt; folder. There is no need for generating IPA file during development&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;mlaunch&lt;&#x2F;em&gt; used for installing and launching the Xamarin.iOS app bundle on device or simulator. This is still closed source maintained by Xamarin team. But reading the help page would help using the tool
&lt;em&gt;&#x2F;Library&#x2F;Frameworks&#x2F;Xamarin.iOS.framework&#x2F;Versions&#x2F;Current&#x2F;bin&#x2F;mlaunch -h&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;explain-steps-to-work-with-mlaunch&quot;&gt;Explain steps to work with mlaunch&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Locate &lt;em&gt;mlaunch&lt;&#x2F;em&gt; tool which usually locates at &lt;em&gt;&#x2F;Library&#x2F;Frameworks&#x2F;Xamarin.iOS.framework&#x2F;Versions&#x2F;Current&#x2F;bin&#x2F;mlaunch&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Get list of simulators and save the &lt;em&gt;runtime&lt;&#x2F;em&gt; and &lt;em&gt;devicetype&lt;&#x2F;em&gt; value&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;mlaunch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt; --listsim&lt;&#x2F;span&gt;&lt;span&gt; simulators.xml
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;# simulators.xml is a temporary file that store all available simulators. Select a simulator (i.e iPhone XR), and keep the associated value of *SimRuntime* and *SimDeviceType* for later usage,
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Construct argument and launch the app&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;mlaunch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt; --launchsim&lt;&#x2F;span&gt;&lt;span&gt;=IOS_APP_PATH&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt; --device&lt;&#x2F;span&gt;&lt;span&gt;::v2:runtime=SIM_RUNTIME,devicetype=SIM_DEVICE_TYPE
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;# *IOS_APP_PATH* is the path to *YOUR_IOS_PROJECT_NAME.app* file generated after *msbuild* step. The *--device* argument is constructed using the *SIM_RUNTIME* and *SIM_DEVICE_TYPE* value from the above step.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;The message &lt;em&gt;Press enter to terminate the application message&lt;&#x2F;em&gt; will be shown when the app launch on simulator.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;others-script-for-xamarin-ios&quot;&gt;Others script for Xamarin.iOS&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Generate Xcode Archive for publishing (suggest build Solution file rather than Project file)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;msbuild&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t:Build &#x2F;p:Configuration=Release &#x2F;p:Platform=iPhone &#x2F;p:ArchiveOnBuild=True
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>TinyTimer for macOS</title>
        <published>2019-08-18T00:00:00+00:00</published>
        <updated>2019-08-18T00:00:00+00:00</updated>
        <author>
          <name>Tri Nguyen</name>
        </author>
        <link rel="alternate" href="https://trinnguyen.com/tinytimer/" type="text/html"/>
        <id>https://trinnguyen.com/tinytimer/</id>
        
        <content type="html">&lt;p&gt;TinyTimer - A simple Timer for macOS, access quickly from MenuBar, get more focused on the task&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Built with Swift and Xcode&lt;&#x2F;li&gt;
&lt;li&gt;Open-source: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;trinnguyen&#x2F;tinytimer&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;trinnguyen&#x2F;tinytimer&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Download: &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;trinnguyen&#x2F;tinytimer&#x2F;releases&#x2F;download&#x2F;v1.1.1&#x2F;TinyTimer-1.1.1.zip&quot;&gt;TinyTimer v1.1.1.zip&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;features&quot;&gt;Features&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Start, Pause, Stop from MenuBar&lt;&#x2F;li&gt;
&lt;li&gt;Quickly start a Timer with recent settings and default items at 1 hour, 2 hours, 4 hours&lt;&#x2F;li&gt;
&lt;li&gt;Custom input time&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Migrate Xamarin Components</title>
        <published>2018-03-07T00:00:00+00:00</published>
        <updated>2018-03-07T00:00:00+00:00</updated>
        <author>
          <name>Tri Nguyen</name>
        </author>
        <link rel="alternate" href="https://trinnguyen.com/remove-the-used-components-manually-from-visual-studio-for-mac/" type="text/html"/>
        <id>https://trinnguyen.com/remove-the-used-components-manually-from-visual-studio-for-mac/</id>
        
        <content type="html">&lt;p&gt;New release of Visual Studio 4 Mac 7.4 on March 2018 has introduced new changes on C# editing which bring the significant improvement on typing responsiveness but forces old Xamarin projects to remove the Xamarin Components.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;trinnguyen.com&#x2F;remove-the-used-components-manually-from-visual-studio-for-mac&#x2F;trinnguyen.com-xamarin-components-upgrade.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The message:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;“We’ve detected that your solution is currently using Xamarin Components, which is no longer supported. Please remove the used Components manually and reopen the solution.”&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We can Fix it by removing the Xamarin Component and replaced by the Nuget package or another library&#x2F;DLL&lt;&#x2F;p&gt;
&lt;h1 id=&quot;remove-the-component&quot;&gt;Remove the Component&lt;&#x2F;h1&gt;
&lt;p&gt;VS4Mac 7.4 removes the Components section of the Solution Pad so we have to work manually with the .csproj file to remove the Component, for example, &lt;a href=&quot;https:&#x2F;&#x2F;components.xamarin.com&#x2F;view&#x2F;coreplot&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CorePlot Component&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Open your .csproj file with an XML editor (Visual Studio Code&#x2F; Atom,…), find the section `&lt;strong&gt;XamarinComponentReference`&lt;&#x2F;strong&gt;, under a parent XML node called `&lt;strong&gt;ItemGroup`&lt;&#x2F;strong&gt;, remove this entire node from the file&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;trinnguyen.com&#x2F;remove-the-used-components-manually-from-visual-studio-for-mac&#x2F;trinnguyen.com-xamarin-components-remove-csproj-1.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Still, inside .csproj file, find the reference to the DLL and delete it by searching for the component name, for example: “CorePlot”, should found a node &lt;code&gt;&amp;lt;Reference Include=&amp;quot;CorePlotiOS&amp;quot;&amp;gt;&lt;&#x2F;code&gt;,simply delete entire node&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;trinnguyen.com&#x2F;remove-the-used-components-manually-from-visual-studio-for-mac&#x2F;trinnguyen.com-xamarin-components-remove-csproj-2.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Now back to VS4Mac and reopen your solution&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;adding-the-library-back&quot;&gt;Adding the library back:&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;If you could find the appropriate NuGet package for that, would be great!&lt;&#x2F;li&gt;
&lt;li&gt;Or look for another alternate library, in my case, considering OxyPlot&lt;&#x2F;li&gt;
&lt;li&gt;Create your owned package if the library is a binding to a native (ObjC&#x2F;Java) library&lt;&#x2F;li&gt;
&lt;li&gt;Or keeping the DLL from Components folder and add the reference to it (not recommended)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>1Password Extension for Xamarin.iOS apps</title>
        <published>2017-02-09T00:00:00+00:00</published>
        <updated>2017-02-09T00:00:00+00:00</updated>
        <author>
          <name>Tri Nguyen</name>
        </author>
        <link rel="alternate" href="https://trinnguyen.com/1password-extension-for-xamarin-ios-apps/" type="text/html"/>
        <id>https://trinnguyen.com/1password-extension-for-xamarin-ios-apps/</id>
        
        <content type="html">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;trinnguyen.com&#x2F;1password-extension-for-xamarin-ios-apps&#x2F;logo-1password-xamarin-150x150.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;1Password is one of my favorite application on Mac and iPhone. It’s working pretty well across devices, browsers (Chrome&#x2F;Safari in my cases). With one unique master password, 1Password enables different strong, complex passwords to all online socials.&lt;&#x2F;p&gt;
&lt;p&gt;There is a bunch of iOS applications on Store that use 1Password login side already, see here: &lt;a href=&quot;https:&#x2F;&#x2F;blog.agilebits.com&#x2F;1password-apps&quot; target=&quot;_blank&quot;&gt;https:&#x2F;&#x2F;blog.agilebits.com&#x2F;1password-apps&lt;&#x2F;a&gt; . Most of the popular apps are named here. Below are how it looks on Dropbox and Pluralsight (notice the 1Password icon?)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;trinnguyen.com&#x2F;1password-extension-for-xamarin-ios-apps&#x2F;1password-xamarin-dropbox-169x300.png&quot; alt=&quot;1Password Extension for Xamarin.iOS apps - Demo Dropbox&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;trinnguyen.com&#x2F;1password-extension-for-xamarin-ios-apps&#x2F;1password-xamarin-pluralsight-169x300.png&quot; alt=&quot;1Password Extension for Xamarin.iOS apps - Demo Pluralsight&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt; &lt;&#x2F;p&gt;
&lt;p&gt;How do we add this extension to our iOS application? There is “1Password Extension for iOS Apps” that helps iOS developers support using 1Password login inside their applications, check out &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AgileBits&#x2F;onepassword-app-extension&quot; target=&quot;_blank&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;AgileBits&#x2F;onepassword-app-extension&lt;&#x2F;a&gt;, but only for Objective-C and Swift. Well, how about Xamarin?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xamarin-ios-binding-for-1password-extensions&quot;&gt;Xamarin.iOS Binding for 1Password Extensions&lt;&#x2F;h2&gt;
&lt;p&gt;Yes, I made the bindings library for it, check this Nuget package: &lt;a href=&quot;https:&#x2F;&#x2F;www.nuget.org&#x2F;packages&#x2F;Xamarin.1PasswordExtension&quot; target=&quot;_blank&quot;&gt;1PasswordExtension for Xamarin.iOS&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The source code is hosted on Github: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;trinnguyen&#x2F;onepassword-app-extension-xamarin&quot; target=&quot;_blank&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;trinnguyen&#x2F;onepassword-app-extension-xamarin&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Anyone who is curious about how it is built can look at there and built their own DLL too, it fetches the latest Release of the original Objective-C library to build CocoaTouch framework.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;The binding ApiDefinitions class is generated by using Objective Sharpie with CocoaPods components, I hope to have some time to write about it later.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;integrate-to-1password-to-your-xamarin-ios-app&quot;&gt;Integrate to 1Password to your Xamarin.iOS app&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-install-nuget-package-and-add-assets&quot;&gt;1. Install Nuget package and add assets&lt;&#x2F;h3&gt;
&lt;p&gt;Simply install the Nuget package (bindings of 1Password Extension) to Xamarin.iOS project&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cs&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-cs &quot;&gt;&lt;code class=&quot;language-cs&quot; data-lang=&quot;cs&quot;&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Install&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Package Xamarin&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;PasswordExtension
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Add &lt;strong&gt;1Password.xcassets&lt;&#x2F;strong&gt; catalog**** to the application bundle, these images are provided by 1Password Team to help user recognize the button. This resource can be found on &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;trinnguyen&#x2F;onepassword-app-extension-xamarin&quot; target=&quot;_blank&quot;&gt;my Github repo&lt;&#x2F;a&gt; or the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AgileBits&#x2F;onepassword-app-extension&quot; target=&quot;_blank&quot;&gt;original library&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;trinnguyen.com&#x2F;1password-extension-for-xamarin-ios-apps&#x2F;1password-extension-xamarin-add-assets-300x133.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-add-lsapplicationqueriesschemes-in-info-plist&quot;&gt;2. Add LSApplicationQueriesSchemes in Info.plist&lt;&#x2F;h3&gt;
&lt;p&gt;1Password extension uses &lt;em&gt;UIApplication.CanOpenURL&lt;&#x2F;em&gt; to check whether the app extension is available, with value “&lt;em&gt;org-appextension-feature-password-management&lt;&#x2F;em&gt;“, thus any application that supports password management actions can be visible.&lt;&#x2F;p&gt;
&lt;p&gt;One iOS 9+, application need to whitelist &lt;strong&gt;org-appextension-feature-password-management&lt;&#x2F;strong&gt; in &lt;strong&gt;LSApplicationQueriesSchemes&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Open your &lt;strong&gt;Info.plist&lt;&#x2F;strong&gt; file, tab &lt;strong&gt;Source&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Add new row: &lt;strong&gt;LSApplicationQueriesSchemes&lt;&#x2F;strong&gt; (array) with item: &lt;strong&gt;org-appextension-feature-password-management&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;trinnguyen.com&#x2F;1password-extension-for-xamarin-ios-apps&#x2F;1password-extension-xamarin-infoplist.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;play-with-source-code&quot;&gt;Play with source code&lt;&#x2F;h3&gt;
&lt;p&gt;There are 4 use cases that normally integration works, for details &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AgileBits&#x2F;onepassword-app-extension#use-case-1-native-app-login&quot; target=&quot;_blank&quot;&gt;check out document of the original library&lt;&#x2F;a&gt;. In this article, I will show how it works on Xamarin with C# code&lt;&#x2F;p&gt;
&lt;p&gt;A demo Xamarin.iOS application is provided on &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;trinnguyen&#x2F;onepassword-app-extension-xamarin&quot; target=&quot;_blank&quot;&gt;my Github repo&lt;&#x2F;a&gt;, covers 3 use cases. For webView, check below sample code.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;check-app-extension-is-available&quot;&gt;check app Extension is available&lt;&#x2F;h4&gt;
&lt;p&gt;Hide 1Password button if the App Extension is not visible (1Password app is not installed on iOS device yet)&lt;&#x2F;p&gt;
&lt;pre class=&quot;lang:default decode:true&quot;&gt;this.onePasswordButton.Hidden = !OnePasswordExtension.SharedExtension.IsAppExtensionAvailable;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;use-case-1-native-app-login&quot;&gt;Use Case #1: Native App Login&lt;&#x2F;h4&gt;
&lt;pre data-lang=&quot;cs&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-cs &quot;&gt;&lt;code class=&quot;language-cs&quot; data-lang=&quot;cs&quot;&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;OnePasswordExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;SharedExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;IsAppExtensionAvailable&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;OnePasswordExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;SharedExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;FindLoginForURLString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;https:&#x2F;&#x2F;www.acme.com&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;sender&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;NSError error&lt;&#x2F;span&gt;&lt;span&gt;) =&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;gt&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#ec9489;color:#657b83;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt; 
&lt;&#x2F;span&gt;&lt;span&gt;	{
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;null &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Count &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;		{
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Code &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;!= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionErrorCodes&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;CancelledByUser&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;			{
&lt;&#x2F;span&gt;&lt;span&gt;				&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Diagnostics&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;@&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;Error invoking 1Password App Extension for find login: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#cb4b16;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#cb4b16;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;			}
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;		}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;usernameTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span&gt;= (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary[AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;UsernameKey]&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;passwordTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span&gt;= (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary[AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;PasswordKey]&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;	}&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#ec9489;color:#657b83;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;	
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;use-case-2-new-user-registration&quot;&gt;Use Case #2: New User Registration&lt;&#x2F;h4&gt;
&lt;pre data-lang=&quot;cs&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-cs &quot;&gt;&lt;code class=&quot;language-cs&quot; data-lang=&quot;cs&quot;&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;newLoginDetails &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;new NSDictionary&lt;&#x2F;span&gt;&lt;span&gt;(
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;TitleKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;ACME&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;UsernameKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;usernameTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;PasswordKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;passwordTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;NotesKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;Saved with the ACME app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;SectionTitleKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;ACME Browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;FieldsKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;new NSDictionary&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;firstname&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;firstnameTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;													&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;lastname&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;lastnameTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; The password generation options are optional, but are very handy in case you have strict rules about password lengths, symbols and digits.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;passwordGenerationOptions &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;new NSDictionary&lt;&#x2F;span&gt;&lt;span&gt;(
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; The minimum password length can be 4 or more.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;MinLengthKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;8&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; The maximum password length can be 50 or less.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;MaxLengthKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;30&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; If YES, the 1Password will guarantee that the generated password will contain at least one digit (number between 0 and 9). Passing NO will not exclude digits from the generated password.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;RequireDigitsKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; If YES, the 1Password will guarantee that the generated password will contain at least one symbol (See the list bellow). Passing NO with will exclude symbols from the generated password.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;RequireSymbolsKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; Here are all the symbols available in the the 1Password Password Generator:
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; !#$%^&amp;amp;*()_-+=|[]{}&amp;#39;\&amp;quot;;.,&amp;amp;gt;?&#x2F;~`
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; The string for AppExtensionPasswordGeneratorOptions.ForbiddenCharactersKey should contain the symbols and characters that you wish 1Password to exclude from the generated password.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;ForbiddenCharactersKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;!#$%&#x2F;0lIO&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;OnePasswordExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;SharedExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;StoreLoginForURLString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;https:&#x2F;&#x2F;www.acme.com&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;newLoginDetails&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;passwordGenerationOptions&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;sender&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;NSError error&lt;&#x2F;span&gt;&lt;span&gt;) =&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;gt&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#ec9489;color:#657b83;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;null &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Count &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;	{
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Code &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;!= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionErrorCodes&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;CancelledByUser&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;		{
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Diagnostics&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;Failed to use 1Password App Extension to save a new Login: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#cb4b16;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#cb4b16;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;		}
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;	}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;usernameTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span&gt;= (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary[AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;UsernameKey] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;passwordTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span&gt;= (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary[AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;PasswordKey] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;firstnameTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span&gt;= (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSDictionary&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary[AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;ReturnedFieldsKey]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;firstname&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;lastnameTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span&gt;= (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSDictionary&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary[AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;ReturnedFieldsKey]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;lastname&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; retrieve any additional fields that were passed in newLoginDetails dictionary
&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#ec9489;color:#657b83;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;use-case-3-change-password&quot;&gt;Use Case #3: Change Password&lt;&#x2F;h4&gt;
&lt;pre data-lang=&quot;cs&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-cs &quot;&gt;&lt;code class=&quot;language-cs&quot; data-lang=&quot;cs&quot;&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;string changedPassword &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;freshPasswordTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;string oldPassword &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;oldPasswordTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;string confirmationPassword &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;confirmPasswordTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;?? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; Validate that the new password and the old password are not the same.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;oldPassword&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Length &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;gt&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;oldPassword&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;Equals&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;changedPassword&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#ec9489;color:#657b83;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;ShowChangePasswordFailedAlertWithMessage&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;The old and the new password must not be the same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; Validate that the new and confirmation passwords match.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;changedPassword&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;Equals&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;confirmationPassword&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;ShowChangePasswordFailedAlertWithMessage&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;The new passwords and the confirmation password must match&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDetails &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;new NSDictionary&lt;&#x2F;span&gt;&lt;span&gt;(
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;TitleKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;ACME&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; Optional, used for the third schenario only
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;UsernameKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;aUsername&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; Optional, used for the third schenario only
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;PasswordKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;changedPassword&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;OldPasswordKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;oldPassword&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;NotesKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;Saved with the ACME app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; Optional, used for the third schenario only
&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; The password generation options are optional, but are very handy in case you have strict rules about password lengths, symbols and digits.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;passwordGenerationOptions &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;new NSDictionary&lt;&#x2F;span&gt;&lt;span&gt;(
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; The minimum password length can be 4 or more.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;MinLengthKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;8&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; The maximum password length can be 50 or less.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;MaxLengthKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;30&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; If YES, the 1Password will guarantee that the generated password will contain at least one digit (number between 0 and 9). Passing NO will not exclude digits from the generated password.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;RequireDigitsKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; If YES, the 1Password will guarantee that the generated password will contain at least one symbol (See the list bellow). Passing NO with will exclude symbols from the generated password.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;RequireSymbolsKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; Here are all the symbols available in the the 1Password Password Generator:
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; !#$%^&amp;amp;*()_-+=|[]{}&amp;#39;\&amp;quot;;.,&amp;amp;gt;?&#x2F;~`
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F; The string for AppExtensionPasswordGeneratorOptions.ForbiddenCharactersKey should contain the symbols and characters that you wish 1Password to exclude from the generated password.
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionPasswordGeneratorOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;ForbiddenCharactersKey&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;!#$%&#x2F;0lIO&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;OnePasswordExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;SharedExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;ChangePasswordForLoginForURLString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;https:&#x2F;&#x2F;www.acme.com&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDetails&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;passwordGenerationOptions&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;sender&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;NSError error&lt;&#x2F;span&gt;&lt;span&gt;) =&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;gt&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#ec9489;color:#657b83;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;null &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Count &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;	{
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Code &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;!= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;AppExtensionErrorCodes&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;CancelledByUser&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;		{
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Diagnostics&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;Error invoking 1Password App Extension for find login, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#cb4b16;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#cb4b16;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;		}
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;	}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;oldPasswordTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span&gt;= (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary[AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;OldPasswordKey]&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;freshPasswordTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span&gt;= (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary[AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;PasswordKey]&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;confirmPasswordTextField&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Text &lt;&#x2F;span&gt;&lt;span&gt;= (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;loginDictionary[AppExtensionLoginDictionarykeys&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;PasswordKey]&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#ec9489;color:#657b83;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;use-case-4-web-view-filling&quot;&gt;Use Case #4: Web View Filling&lt;&#x2F;h4&gt;
&lt;pre data-lang=&quot;cs&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-cs &quot;&gt;&lt;code class=&quot;language-cs&quot; data-lang=&quot;cs&quot;&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;OnePasswordExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;SharedExtension&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;FillItemIntoWebView&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;webView&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d33682;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;sender&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;bool success&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;NSError error&lt;&#x2F;span&gt;&lt;span&gt;) =&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;gt&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#ec9489;color:#657b83;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt; 
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;success&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;	{
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Diagnostics&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;Failed to fill into webview: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#cb4b16;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#6c71c4;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#cb4b16;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;	}	
&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#ec9489;color:#657b83;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OpenCV for Xamarin.iOS</title>
        <published>2017-02-07T00:00:00+00:00</published>
        <updated>2017-02-07T00:00:00+00:00</updated>
        <author>
          <name>Tri Nguyen</name>
        </author>
        <link rel="alternate" href="https://trinnguyen.com/opencv-for-xamarin-ios/" type="text/html"/>
        <id>https://trinnguyen.com/opencv-for-xamarin-ios/</id>
        
        <content type="html">&lt;p&gt;Updated: 3 years ago I&#x27;ve worked on a Xamarin cross-platforms applications via iOS, Android, Windows Phone 8 which required using OpenCV for face detector and recognition. Even OpenCV has official frameworks for both iOS (ObjC) but it is pretty hard to make fully binding on Xamarin.iOS because most parts of framework are written on C&#x2F;C++.&lt;&#x2F;p&gt;
&lt;p&gt;Below tutorial is a workaround solution, but effectively, for getting native OpenCV for Xamarin.iOS.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;getting-opencv-for-xamarinios&quot;&gt;Overview&lt;&#x2F;h2&gt;
&lt;p&gt;The idea is creating iOS Static library (CocoaTouch library) as a wrapper for specific functions (by requirements). This wrapper is written on Objective-C and implemented by communicating with OpenCV C++ classes.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s go through a sample spec: detect faces from any image&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;iOS Static Library&lt;&#x2F;strong&gt;: Simple library with one function: Detect faces on an image with OpenCV, export .a file for using on Xamarin&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Xamarin.iOS Binding project&lt;&#x2F;strong&gt;: Create a C# wrapper for static library, iOS Application: demo how binding and function of static library, detect faces on an image and draw them with red rectangle on image&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;step-by-step-opencv-on-xamarinios&quot;&gt;Step by step: OpenCV on Xamarin.iOS&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;first-create-ios-static-library&quot;&gt;&lt;strong&gt;First, create iOS Static Library&lt;&#x2F;strong&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Should have an Objective-C library for wrapping all features that will work with OpenCV:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;strong&gt;opencv2.framework&lt;&#x2F;strong&gt; from OpenCV site (http:&#x2F;&#x2F;opencv.org&#x2F;downloads.html)&lt;&#x2F;li&gt;
&lt;li&gt;XCode: Create iOS Static Library project with a Objective-C class that contains required functions (can be multiple classes for management), named &lt;strong&gt;FaceDetector&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;objective-c&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-objective-c &quot;&gt;&lt;code class=&quot;language-objective-c&quot; data-lang=&quot;objective-c&quot;&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;@interface &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;OpenCVUtils &lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;NSObject
&lt;&#x2F;span&gt;&lt;span&gt;+ (cv:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;Mat)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;cvMatFromUIImage:&lt;&#x2F;span&gt;&lt;span&gt;(UIImage &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;image&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;+ (UIImage &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;UIImageFromCVMat:&lt;&#x2F;span&gt;&lt;span&gt;(cv:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;Mat)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;cvMat&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;+ (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;CGRect&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;cgRectFromCVRect:&lt;&#x2F;span&gt;&lt;span&gt;(cv:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;Rect) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;cvRect&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;@end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;objective-c&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-objective-c &quot;&gt;&lt;code class=&quot;language-objective-c&quot; data-lang=&quot;objective-c&quot;&gt;&lt;span&gt;- (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span&gt;) initWithFaceCascade&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSString*&lt;&#x2F;span&gt;&lt;span&gt;) filePath;
&lt;&#x2F;span&gt;&lt;span&gt;- (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSArray*&lt;&#x2F;span&gt;&lt;span&gt;) detectFaces&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;(UIImage&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;) image;
&lt;&#x2F;span&gt;&lt;span&gt;@end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Build iOS Static Library and get &lt;strong&gt;libFaceDetector.a&lt;&#x2F;strong&gt; file&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;second-create-xamarin-ios-binding&quot;&gt;Second, Create Xamarin.iOS Binding&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Xamarin Studio: New Solution -&amp;gt; iOS -&amp;gt; Unified API -&amp;gt; iOS Binding Project&lt;&#x2F;li&gt;
&lt;li&gt;Drag &lt;strong&gt;libFaceDetector.a&lt;&#x2F;strong&gt; to Binding project&lt;&#x2F;li&gt;
&lt;li&gt;Back to &lt;strong&gt;opencv2.framework&lt;&#x2F;strong&gt; file, open it, go to opencv2.framework -&amp;gt; Versions -&amp;gt; A -&amp;gt; opencv2. Rename this file to opencv2.a. Drag this to Binding project. (This binary file is required as reference from libFaceDetector.a)&lt;&#x2F;li&gt;
&lt;li&gt;Open &lt;strong&gt;opencv2.linkwith.cs&lt;&#x2F;strong&gt;, add &lt;strong&gt;LinkerFlags&lt;&#x2F;strong&gt; and &lt;strong&gt;Frameworks&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;cs&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-cs &quot;&gt;&lt;code class=&quot;language-cs&quot; data-lang=&quot;cs&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#586e75;&quot;&gt;assembly&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;LinkWith&lt;&#x2F;span&gt;&lt;span&gt; (&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;opencv2&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;LinkTarget&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;ArmV7&lt;&#x2F;span&gt;&lt;span&gt; | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;LinkTarget&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;ArmV7s&lt;&#x2F;span&gt;&lt;span&gt; | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;LinkTarget&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Simulator&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;ForceLoad&lt;&#x2F;span&gt;&lt;span&gt; = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;LinkerFlags&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;lc&lt;&#x2F;span&gt;&lt;span&gt;++&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Frameworks&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;Accelerate AssetsLibrary AVFoundation CoreGraphics CoreImage CoreMedia CoreVideo QuartzCore UIKit Foundation&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ApiDefinition.cs&lt;&#x2F;strong&gt; : Define interfaces for working with libFaceDetector.a . Can create manually if experienced with Xamarin.iOS Binding Metadata or using Objective Sharpie (command line tool)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;objective-c&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-objective-c &quot;&gt;&lt;code class=&quot;language-objective-c&quot; data-lang=&quot;objective-c&quot;&gt;&lt;span&gt;interface FaceDetector {
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F;- (id) initWithFaceCascade:(NSString*) filePath;
&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;Export &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;initWithFaceCascade:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)]
&lt;&#x2F;span&gt;&lt;span&gt; IntPtr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;Constructor &lt;&#x2F;span&gt;&lt;span&gt;(string filePath);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#93a1a1;&quot;&gt;&#x2F;&#x2F;- (NSArray*) detectFaces:(UIImage*) image;
&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;Export &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;detectFaces:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)]
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSArray &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;DetectFaces&lt;&#x2F;span&gt;&lt;span&gt;(UIImage image);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Create Xamarin.iOS project, add reference to above Xamarin.iOS Binding project, try use C# wrapper classes&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;cs&quot; style=&quot;background-color:#fdf6e3;color:#657b83;&quot; class=&quot;language-cs &quot;&gt;&lt;code class=&quot;language-cs&quot; data-lang=&quot;cs&quot;&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;UIImage &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;srcImage &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;UIImage&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;FromBundle&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#2aa198;&quot;&gt;lena1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#839496;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#859900;&quot;&gt;NSArray &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;arrFaces &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;_faceDetector&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b58900;&quot;&gt;DetectFaces&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#268bd2;&quot;&gt;srcImage&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;source-code&quot;&gt;Source code&lt;&#x2F;h3&gt;
&lt;p&gt;Get the full source code: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;trinnguyen&#x2F;xamarin.ios-opencv&quot; target=&quot;_blank&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;trinnguyen&#x2F;xamarin.ios-opencv&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
