{"id":15943882,"url":"https://github.com/verifykit/verifykit-sdk-ios","last_synced_at":"2026-03-07T04:31:59.417Z","repository":{"id":56925911,"uuid":"220173603","full_name":"verifykit/verifykit-sdk-ios","owner":"verifykit","description":"VerifyKit SDK for iOS","archived":false,"fork":false,"pushed_at":"2024-06-30T12:55:05.000Z","size":91516,"stargazers_count":14,"open_issues_count":0,"forks_count":6,"subscribers_count":8,"default_branch":"master","last_synced_at":"2026-01-30T19:35:03.739Z","etag":null,"topics":["apple","ios","ios-sdk","otp","phone","phone-number","phone-numbers","sdk","sms","sms-verification","telegram","verification","verify","verifykit","whatsapp","whatsapp-api"],"latest_commit_sha":null,"homepage":"https://verifykit.com","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/verifykit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-07T07:09:07.000Z","updated_at":"2026-01-16T02:13:48.000Z","dependencies_parsed_at":"2024-02-15T11:47:11.893Z","dependency_job_id":"00605ca2-8f57-4473-a2e4-11b4b4074f15","html_url":"https://github.com/verifykit/verifykit-sdk-ios","commit_stats":{"total_commits":57,"total_committers":4,"mean_commits":14.25,"dds":0.4035087719298246,"last_synced_commit":"ba5b16ac37bebc412eac449be12ab6d9fe1a3085"},"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/verifykit/verifykit-sdk-ios","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verifykit%2Fverifykit-sdk-ios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verifykit%2Fverifykit-sdk-ios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verifykit%2Fverifykit-sdk-ios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verifykit%2Fverifykit-sdk-ios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/verifykit","download_url":"https://codeload.github.com/verifykit/verifykit-sdk-ios/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verifykit%2Fverifykit-sdk-ios/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30208027,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T03:24:23.086Z","status":"ssl_error","status_checked_at":"2026-03-07T03:23:11.444Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apple","ios","ios-sdk","otp","phone","phone-number","phone-numbers","sdk","sms","sms-verification","telegram","verification","verify","verifykit","whatsapp","whatsapp-api"],"created_at":"2024-10-07T08:05:19.244Z","updated_at":"2026-03-07T04:31:59.379Z","avatar_url":"https://github.com/verifykit.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# VerifyKit\n[![Platform](https://img.shields.io/badge/Platforms-iOS-4E4E4E.svg?colorA=28a745)](#installation)\n![Status](https://img.shields.io/badge/Status-Beta-yellowgreen) ![License](https://img.shields.io/badge/License-MIT-red.svg)\n\n[![Swift support](https://img.shields.io/badge/Swift-4.0%20%7C%204.1%20%7C%204.2%20%7C%205.0%20%7C%205.1%20%7C%205.2-lightgrey.svg?colorA=28a745\u0026colorB=4E4E4E)](#swift-versions-support)\n[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/VerifyKit.svg?style=flat\u0026label=CocoaPods\u0026colorA=28a745\u0026\u0026colorB=4E4E4E)](https://cocoapods.org/pods/VerifyKit)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-uncompatible-red.svg?style=flat)](https://github.com/Carthage/Carthage)\n\nVerifyKit is the next gen phone number validation system. Users can easily verify their  phone numbers without the need of entering phone number or a pin code.\n\n## How It Works?\n\n1. Register your app at https://www.verifykit.com and get your client keys and server key. \n2. Add VerifyKit SDK to your app\n3. Configure and start VerifyKit SDK\n4. When verification is complete, send ```sessionId``` which VeriyfKit SDK gives you to your backend service\n5. At your server side, get user's phone number from VerifyKit service wtih ```serverKey``` and ```sessionId```. You can check [Backend Integration](#backend-integration)\n\n![VerifyKit Flow](images/vk-flow.jpg)\n\n## Security\n\n```ServerKey``` is used for getting info from VerifyKit service.\nPlease keep ```ServerKey``` safe. Do not include it in your client's code base.\n\n## Requirements\n\n - Xcode 12.0+\n - iOS 11.0+\n\n## Installation\n\n#### CocoaPods\nYou can install framework via [CocoaPods](https://cocoapods.org/pods/VerifyKit).\n\n```bash\npod 'VerifyKit'\n```\n\u003c!--- ## Manual Installation\n\nOr you can [click here](https://verifykit.com/framework/verifykit-sdk-ios-001.zip) to download the framework and add the files with drag and drop.\n\nIf you choose to use the SDK manually, after you added the files to your project, you need to add both frameworks to ```Frameworks, Libraries, and Embedded Content``` panel in your Project's general settings, then set ```Embed``` option as ```Embed \u0026 Sign```. --\u003e\n\n## Configure Info.plist\n\nTo successfully use the framework, you need to add ```VerifyKitKey``` and ```VerifyKitSecret``` to your plist file. This step is mandatory.\n\nTo open a third party messaging app from your application, you need to add their url schemes to ```LSApplicationQueriesSchemes``` key in your plist file. After iOS14, to open Associated Domain URLS in a device which uses a different default browser then Safari, you also need to add ```https``` as url scheme.\n\nOpen your Info.plist as source code and insert the following XML snippet into the body of your file just before the final ```\u003c/dict\u003e``` element.\n\n```\n\u003ckey\u003eVerifyKitKey\u003c/key\u003e\n\u003cstring\u003e{your-verifykit-key}\u003c/string\u003e\n\u003ckey\u003eVerifyKitSecret\u003c/key\u003e\n\u003cstring\u003e{your-verifykit-secret-key}\u003c/string\u003e\n\u003ckey\u003eLSApplicationQueriesSchemes\u003c/key\u003e\n\u003carray\u003e\n  \u003cstring\u003ewhatsapp\u003c/string\u003e\n  \u003cstring\u003etelegram\u003c/string\u003e\n  \u003cstring\u003eviber\u003c/string\u003e\n  \u003cstring\u003ehttps\u003c/string\u003e\n\u003c/array\u003e\n```\n\n##\n\nAfter a successful validation with a third party messaging app, the user needs to return to main app. If your application has an Associated Domain, we can add a deeplink to our message for easy and quick redirect.\n\nIf you support Associated Domains, please fill out **Deeplink** field at VerifyKit portal with your domain.\n\nIf you don't support Associated Domains, you can enter a custom link with your application's url scheme to **Deeplink** field, like ```yourapp://welcome```. However, some messaging apps doesn't recognize url schemes as clickable links, so quick redirect may not work in this scenario.\n\n\n## Usage\n\n```swift\nimport VerifyKit\n\n\nlet kit = VerifyKitInstance()\nlet viewController = kit.viewControllerForLogin()\nself.present(viewController, animated: true, completion: nil)\n```\n\nYou can get the result via ```VerifyKitDelegate``` protocol.\n\n```swift\n\nviewController.kitDelegate = self\n\nextension ViewController: VerifyKitDelegate {\n\n    func didSuccess(with sessionCode: String) {\n        print(\"VerifyKitDelegate didSuccess with sessionCode:\\(sessionCode)\")\n    }\n\n    func didFail(with error: VerifyKitError) {\n        print(\"VerifyKitDelegate didFail with error:\\(error)\")\n    }\n}\n```\n\nVerifyKit only dismisses ```viewControllerForLogin()``` automatically when ```didSuccess``` delegate is called.\nTo give user a chance to try other validation methods or to start again, ```viewControllerForLogin()``` doesn't get dismissed on ```didFail```. If you want to dismiss it on some specific error type, you can do that manually.\n\n### Objective-C\n\nStarting with version 0.5.9, you can use VerifyKit inside Objective-C projects.\n\n```objective-c\n    VerifyKitOptions *options = [[VerifyKitOptions alloc] initWithEnvironment: VerifyKitEnvironmentDebug logActive: YES deviceID: nil];\n    VerifyKitInstance *kit = [[VerifyKitInstance alloc] init];\n    \n    UIViewController\u003cVerifyKitObjCViewController\u003e *controller = [kit viewControllerForLogin_objC];\n    \n    [controller setKitObjCDelegate: self];\n\n    [self presentViewController:controller animated:YES completion:nil];\n```\n\n##\n\n\nThere may be a case when user chooses a third party messaging app for validation, sends a message, but doesn't return to main app and kills it. In that case, that user is verified with VerifyKit but the main app doesn't know it yet.\n\nTo fix this, we have a method to check interrupted session status.\nUsing this method is optional and up to you.\n\n**VerifyKit will handle the interrupted verification even if you don't implement this method.**\n\n```swift\nVerifyKit.checkInterruptedSession { [weak self] sessionCode in\n  guard let sessionCode = sessionCode else {\n    // Start VerifyKit flow or do what your app needs\n    return\n  }\n\n  // You have an interrupted sessionCode from last time.\n  // Tell your API.\n  print(\"sessionCode \\(sessionCode)\")\n}\n```\n\n```objective-c\n    [VerifyKitInstance checkInterruptedSessionWithCompletion:^(NSString * _Nullable sessionCode) {\n        if (sessionCode == nil) {\n            // Start VerifyKit flow or do what your app needs\n        } else {\n            // You have an interrupted sessionCode from last time.\n              // Tell your API.\n            NSLog(@\"sessionCode %@\", sessionCode);\n        }\n    }];\n```\n\n## Configuration\n\n```swift\nlet options = VerifyKitOptions(logActive: true)\nlet kit = VerifyKitInstance(options: options)\n```\n\n\n### VerifyKitOptions Struct\n\nYou can change the settings declared in ```VerifyKitOptions``` struct.\n\n```swift\npublic struct VerifyKitOptions {\n    var environment: VerifyKitEnvironment = .debug // default\n    var logActive: Bool = true // default\n    var deviceID: String? // optional\n    var countryCode: String? // optional (\"US\")\n    var phoneCode: String? // optional (\"1\") or (\"+1\")\n    var phoneNumber: String? // optional (\"1234567890\")\n}\n\npublic enum VerifyKitEnvironment {\n\n    /// Stage environment for debug\n    case debug\n\n    /// Production environment for distribution\n    case release\n}\n```\n\nIf the host application wants to let the user input their phone number and then pass it to the SDK, it can be done using the ```countryCode```, ```phoneCode``` and ```phoneNumber``` parameters.\n\n## Dependencies\n\nThis product includes software([CyrptoSwift](https://cocoapods.org/pods/CryptoSwift)) developed by [Marcin Krzyzanowski](http://krzyzanowskim.com).\n\n## Other Notes\n\nBefore your app release, please change the VerifyKitEnvironment to 'release' instead of 'debug'.\n\n## Backend Integration\n\nDepending on the language you use in your backend service, you can use one of the following options.\n\nYou can use our [php-sdk](https://github.com/verifykit/verifykit-sdk-php/blob/master/README.md) like this; \n\n```php\n$vfk = new \\VerifyKit\\VerifyKit($serverKey);\n\n/** @var \\VerifyKit\\Entity\\Response $result */\n$result = $vfk-\u003egetResult($sessionId);\n\nif ($result-\u003eisSuccess()) {\n    echo \"Phone number : \" . $result-\u003egetPhoneNumber() .\n        \", Validation Type : \" . $result-\u003egetValidationType() .\n        \", Validation Date : \" . $result-\u003egetValidationDate()-\u003eformat('Y-m-d H:i:s') . PHP_EOL;\n} else {\n    echo \"Error message : \" . $result-\u003egetErrorMessage() . \", error code : \" . $result-\u003egetErrorCode() . PHP_EOL;\n}\n```\n\nYou can use our [python-sdk](https://github.com/verifykit/verifykit-sdk-python/blob/master/README.md) like this; \n\n```python\n\nfrom VerifyKit import Verify\n\nverify = Verify(server_key=\"{SERVER-KEY}\")\nverify.validation(session_id='{SESSION-ID}')\n\nif verify.is_valid:\n    #Validation success.\n    print(verify.response())\n\nelif verify.is_valid == False:\n    #Validation fail.\n    print(verify.response())\n \n```\n\nOr you can use curl request like this;\n\n```bash\ncurl --location --request POST 'https://api.verifykit.com/v1.0/result' \\\n--header 'X-Vfk-Server-Key:{SERVER-KEY}' \\\n--header 'Content-Type: application/json' \\\n--form 'sessionId={{SESSION-ID}}’\n```\n\n---\n\n## Support\n\nIf you have any questions or requests, feel free to [create an issue](https://github.com/verifykit/verifykit-sdk-ios/issues).\n\n## Author\n\nVerifyKit is owned and maintained by [VerifyKit DevTeam](mailto:sdk@verifykit.com).\n\n\n## License\n\nThe MIT License\n\nCopyright (c) 2019 VerifyKit. [http://verifykit.com](http://verifykit.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverifykit%2Fverifykit-sdk-ios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fverifykit%2Fverifykit-sdk-ios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverifykit%2Fverifykit-sdk-ios/lists"}