{"id":2857,"date":"2017-03-21T11:16:28","date_gmt":"2017-03-21T05:46:28","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=2857"},"modified":"2023-01-20T18:55:54","modified_gmt":"2023-01-20T13:25:54","slug":"keychain-handling-in-ios","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/","title":{"rendered":"Keychain Handling in iOS"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p><b>What is Keychain <\/b><\/p>\n<p><span style=\"font-weight: 400;\">Keychain is Apple\u2019s way to manage password in the the\u00a0device. Whether\u00a0its Mac or iOS Device they use the same Keychain system tool back inside. It stores all your passwords for applications, sensitive information relating to website&#8217;s credentials and credit card\/ debit card numbers. The main objective of existence is to <\/span><i><span style=\"font-weight: 400;\">secure password &amp; sensitive information<\/span><\/i><span style=\"font-weight: 400;\"> of the\u00a0device.<\/span><\/p>\n<p><a href=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/Keychain.png\"><img fetchpriority=\"high\" decoding=\"async\" class=\"size-full wp-image-2861 aligncenter\" src=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/Keychain.png\" alt=\"Keychain\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/Keychain.png 300w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/Keychain-150x150.png 150w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><b>Objective<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Say, we have an app where you want to store username and password. Now, in such scenario, you will store these credentials (username and password) in NSUserDefaults. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Notably, it&#8217;s a great option to achieve the requirement but, it won\u2019t give the utmost security to your password. As\u00a0every app maintains a .plist file to save NSUserDefault value which can be extracted. And, it seems it\u2019s not a reliable process to do so. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">So, We will store the password in Keychain rather in NSUserDefault.<\/span><\/p>\n<p><b>Prerequisite<\/b><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">You need a <\/span><i><span style=\"font-weight: 400;\">Keychain Wrapper reusable <\/span><\/i><span style=\"font-weight: 400;\">files, which will handle your read-write operations. <\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Then, You need a <\/span><i><span style=\"font-weight: 400;\">KeychainManager.swift <\/span><\/i><span style=\"font-weight: 400;\">which is app specific and handles all the read &amp; write keychain request. Most of the time we use keychain manager to set &amp; get the\u00a0password.<\/span><\/li>\n<\/ol>\n<p><b>Demonstration<\/b><\/p>\n<p><b>Step1.<\/b><\/p>\n<p><span style=\"font-weight: 400;\">First, you import the <\/span><b>Keychain Wrapper<\/b><span style=\"font-weight: 400;\"> files in your Project. <\/span><\/p>\n<p><a href=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-06-at-4.50.16-PM.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-2858\" src=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-06-at-4.50.16-PM.png\" alt=\"Screen Shot 2017-03-06 at 4.50.16 PM\" width=\"269\" height=\"107\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">And, then import <\/span><b>KeychainManager.swift <\/b><span style=\"font-weight: 400;\">which will behave as a middle layer between your View Controller(s) and KeychainWrapper Library. <\/span><\/p>\n<p><b>Step2.<\/b><\/p>\n<p><span style=\"font-weight: 400;\">I\u2019m assuming that, there is a requirement of storing <\/span><b>password. <\/b><span style=\"font-weight: 400;\">So, we have a getter &amp; setter methods belong to password.<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">getPasswordFromKeychain()-&gt;String?<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">setPasswordInKeychain(passedValue:)-&gt;Bool<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">First method is a getter method which returns <\/span><b>String?<\/b><span style=\"font-weight: 400;\"> (String Optional type) which suggest the method will either return <\/span><b>String<\/b><span style=\"font-weight: 400;\"> or <\/span><b>nil<\/b><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Second method is a setter-method which accepts <\/span><b>String<\/b><span style=\"font-weight: 400;\"> type value as a\u00a0parameter. It will return a BOOL status after completing the operation. <\/span><\/p>\n<p><b>Step3.<\/b><\/p>\n<p><span style=\"font-weight: 400;\">On View Controller level, whenever you want to persist data into Keychain, you would call setter method (<\/span><b>setPasswordInKeychain(passedValue:)<\/b><span style=\"font-weight: 400;\">) with the string parameter which you want to store. <\/span><\/p>\n<pre class=\"lang:swift decode:true\">if KeychainManager.setPasswordInKeychain(passedValue: \"Hello@1234\") == true{\r\n\r\n\u00a0\u00a0\/\/ After Success\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">If <\/span><b style=\"font-size: 1rem;\">setPasswordInKeychain(passedValue:) <\/b><span style=\"font-weight: 400;\">acknowledge true or false. If it is true then, it has successfully inserted data into Keychain.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Now, it\u2019s time to retrieve data from Keychain. So, we will call another method <\/span><b>getPasswordFromKeychain()-&gt;String?<\/b><\/p>\n<pre class=\"lang:swift decode:true\">if let val = KeychainManager.getPasswordFromKeychain(){\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(\"Saved Value is : \\(val)\")\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><b style=\"font-size: 1rem;\">Extra Features<\/b><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Say, you want to store some private into Keychain apart from password.<\/span><\/li>\n<\/ol>\n<p><b>Approach :<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Then, you need to modify <\/span><b>Keychain Manager <\/b><span style=\"font-weight: 400;\">file according to your need. <\/span><\/p>\n<pre class=\"lang:swift decode:true\">private enum Keys:String{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case Password = \"kPassword\"\r\n\u00a0\u00a0\u00a0}<\/pre>\n<p><span style=\"font-weight: 400;\">First, you need to add Key Name in your enum Keys. \u00a0Say, you want to add <\/span><b style=\"font-size: 1rem;\">token <\/b><span style=\"font-weight: 400;\">then, it would look like<\/span><\/p>\n<pre class=\"lang:swift decode:true\">\u00a0\u00a0\u00a0private enum Keys:String{\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case Password = \"kPassword\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case Token = \"kToken\"\r\n\u00a0\u00a0\u00a0}<\/pre>\n<p>Second, write a getter and Setter methods.<\/p>\n<p><span style=\"font-weight: 400;\">In both the methods, you just need to change the Key name and method\u2019s name.<\/span><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:swift decode:true\">\/\/ Get Token\r\nstatic func getTokenFromKeychain()-&gt;String?{\r\n\r\n\u00a0\u00a0\u00a0\u00a0return self.read(key: Keys.Token.rawValue) ?? nil\r\n}\u00a0 \u00a0\r\n\r\n\/\/Set Token\r\nstatic func setTokenInKeychain(passedValue:String)-&gt;Bool{\r\n\r\n\u00a0\u00a0\u00a0\u00a0return self.write(value: passedValue, key: Keys.Token.rawValue)\r\n}<\/pre>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Say, you have a logout feature and you want to clear Keychain data of your app. <\/span><\/li>\n<\/ol>\n<p><b>Approach<\/b><span style=\"font-weight: 400;\">:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">You need to call <\/span><b>clearKeychainData() <\/b><span style=\"font-weight: 400;\">on logout button click. <\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">What if, User uninstall your app. And, then you want to delete the existing data from Keychain with it. <\/span><\/li>\n<\/ol>\n<p><b>Approach:<\/b><\/p>\n<p><span style=\"font-weight: 400;\">In This case, you need to use NSUserDefault to check whether your app is launching for first time. If it is <\/span><b>true <\/b><span style=\"font-weight: 400;\">then you should clear Keychain data.<\/span><\/p>\n<p><b style=\"font-size: 1rem;\">\u00a0<\/b><\/p>\n<pre class=\"lang:swift decode:true\">func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -&gt; Bool {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(PersistenceManager.shared.getOpenForFirstTime(key: PersistenceKeys.isFirstTime)){\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Clear Keychain Data\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let _ = KeychainManager.clearKeychainData()\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Set To \"False\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0PersistenceManager.shared.setOpenForFirstTime(value: false, key: PersistenceKeys.isFirstTime)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return true\r\n\r\n\u00a0\u00a0\u00a0}<\/pre>\n<p><b style=\"font-size: 1rem;\">Note<\/b><span style=\"font-weight: 400;\">: Please refer to KeychainDemo for better understanding.<\/span><\/p>\n<p><b>Conclusion<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Whenever you want to save any piece of data into your keychain. You should add <\/span><b>Keychain Wrapper <\/b><span style=\"font-weight: 400;\">files into your project. And then, modify <\/span><i><span style=\"font-weight: 400;\">Keychain Manager<\/span><\/i><span style=\"font-weight: 400;\"> according to your requirement. And, that\u2019s it. \u00a0You are good to go \ud83d\ude42<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; What is Keychain Keychain is Apple\u2019s way to manage password in the the\u00a0device. Whether\u00a0its Mac or iOS Device they use the same Keychain system tool back inside. It stores all your passwords for applications, sensitive information relating to website&#8217;s credentials and credit card\/ debit card numbers. The main objective of existence is to secure [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2859,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,71],"tags":[16,194,193,192],"class_list":["post-2857","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ios","category-mobile","tag-keychain","tag-password-manager","tag-save-password","tag-security-in-ios"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Keychain Handling in iOS | InnovationM Blog<\/title>\n<meta name=\"description\" content=\"Learn to manage Password in iOS using Keychain handling.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Keychain Handling in iOS | InnovationM Blog\" \/>\n<meta property=\"og:description\" content=\"Learn to manage Password in iOS using Keychain handling.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-21T05:46:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-20T13:25:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/images.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"420\" \/>\n\t<meta property=\"og:image:height\" content=\"120\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"Keychain Handling in iOS\",\"datePublished\":\"2017-03-21T05:46:28+00:00\",\"dateModified\":\"2023-01-20T13:25:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/\"},\"wordCount\":576,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/03\\\/images.jpeg\",\"keywords\":[\"Keychain\",\"Password Manager\",\"Save Password\",\"Security in iOS\"],\"articleSection\":[\"iOS\",\"Mobile\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/\",\"name\":\"Keychain Handling in iOS | InnovationM Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/03\\\/images.jpeg\",\"datePublished\":\"2017-03-21T05:46:28+00:00\",\"dateModified\":\"2023-01-20T13:25:54+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"description\":\"Learn to manage Password in iOS using Keychain handling.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/03\\\/images.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/03\\\/images.jpeg\",\"width\":420,\"height\":120},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/keychain-handling-in-ios\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Keychain Handling in iOS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Keychain Handling in iOS | InnovationM Blog","description":"Learn to manage Password in iOS using Keychain handling.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/","og_locale":"en_US","og_type":"article","og_title":"Keychain Handling in iOS | InnovationM Blog","og_description":"Learn to manage Password in iOS using Keychain handling.","og_url":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/","og_site_name":"InnovationM - Blog","article_published_time":"2017-03-21T05:46:28+00:00","article_modified_time":"2023-01-20T13:25:54+00:00","og_image":[{"width":420,"height":120,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/images.jpeg","type":"image\/jpeg"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"Keychain Handling in iOS","datePublished":"2017-03-21T05:46:28+00:00","dateModified":"2023-01-20T13:25:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/"},"wordCount":576,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/images.jpeg","keywords":["Keychain","Password Manager","Save Password","Security in iOS"],"articleSection":["iOS","Mobile"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/","url":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/","name":"Keychain Handling in iOS | InnovationM Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/images.jpeg","datePublished":"2017-03-21T05:46:28+00:00","dateModified":"2023-01-20T13:25:54+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"description":"Learn to manage Password in iOS using Keychain handling.","breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/images.jpeg","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/03\/images.jpeg","width":420,"height":120},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/keychain-handling-in-ios\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Keychain Handling in iOS"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/2857","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=2857"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/2857\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/2859"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=2857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=2857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=2857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}