{"id":3677,"date":"2017-09-10T13:01:39","date_gmt":"2017-09-10T13:01:39","guid":{"rendered":"http:\/\/www.nikola-breznjak.com\/blog\/?p=3677"},"modified":"2017-09-10T14:13:21","modified_gmt":"2017-09-10T14:13:21","slug":"create-native-ios-app-can-read-search-ads-attribution-api-information","status":"publish","type":"post","link":"https:\/\/nikola-breznjak.com\/blog\/ios\/create-native-ios-app-can-read-search-ads-attribution-api-information\/","title":{"rendered":"How to create a native iOS app that can read Search Ads Attribution API information"},"content":{"rendered":"<h2>TL;DR<\/h2>\n<p>In this post, I&#8217;ll show you how easy it is to create a native iOS app that can read Search Ads Attribution API information.<\/p>\n<p>You can check out the full working code on <a href=\"https:\/\/github.com\/Hitman666\/SearchAdsImplementationDemo\">Github<\/a>.<\/p>\n<h2>What is Search Ads App Attribution?<\/h2>\n<p>From <a href=\"https:\/\/searchads.apple.com\/help\/pdf\/attribution-api.pdf\">Apple&#8217;s documentation<\/a>:<\/p>\n<blockquote><p>\n  Search Ads App Attribution enables developers to track and attribute app downloads that originate from Search Ads campaigns. With Search Ads App Attribution, iOS developers have the ability to accurately measure the lifetime value of newly acquired users and the effectiveness of their advertising campaigns.\n<\/p><\/blockquote>\n<h2>Steps to recreate this yourself<\/h2>\n<ul>\n<li>Create a new blank project in Xcode<\/li>\n<li>Add a label on the <code>Main.storyboard<\/code>:<br \/>\n<img decoding=\"async\" src=\"https:\/\/i.imgur.com\/iESF6EH.png\" alt=\"\" \/><\/p>\n<\/li>\n<li>\n<p>Create an Interface Builder Outlet for this label and name it <code>searchAdsInfoLabel<\/code>. For those not familiar with iOS development, this is done by pressing <code>Ctrl<\/code> and dragging the label into the <code>ViewController.swift<\/code> file.<\/p>\n<\/li>\n<li>Once done, you should see this in your <code>ViewController.swift<\/code> file:<\/li>\n<\/ul>\n<pre><code>import UIKit\n\nclass ViewController: UIViewController {\n    @IBOutlet weak var searchAdsInfoLabel: UILabel!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n\n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n        \/\/ Dispose of any resources that can be recreated.\n    }\n<\/code><\/pre>\n<ul>\n<li>Next, import <code>iAd<\/code> to your project:<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/8oR6WwS.png\" alt=\"\" \/><\/p>\n<ul>\n<li>import <code>iAd<\/code> in your <code>ViewController.swift<\/code> file: <code>import iAd<\/code>.<\/li>\n<\/ul>\n<p>Add the following function to the <code>ViewController.swift<\/code> file:<\/p>\n<pre><code>func getSearchAdsInfo() {\n    ADClient.shared().requestAttributionDetails({ (attributionDetails, error) in\n        if error == nil {\n            for (type, adDictionary) in attributionDetails! {\n                print(type);\n                print(adDictionary);\n\n                let attribution = adDictionary as? Dictionary&lt;AnyHashable, Any&gt;;\n\n                let iadAdgroupId = attribution?[\"iad-adgroup-id\"] as? String\n                let iadAdgroupName = attribution?[\"iad-adgroup-name\"] as? String\n                let iadAttribution = attribution?[\"iad-attribution\"] as? String\n                let iadCampaignId = attribution?[\"iad-campaign-id\"] as? String\n                let iadCampaignName = attribution?[\"iad-campaign-name\"] as? String\n                let iadClickDate = attribution?[\"iad-click-date\"] as? String\n                let iadConversionDate = attribution?[\"iad-conversion-date\"] as? String\n                let iadCreativeId = attribution?[\"iad-creative-id\"] as? String\n                let iadCreativeName = attribution?[\"iad-creative-name\"] as? String\n                let iadKeyword = attribution?[\"iad-keyword\"] as? String\n                let iadLineitemId = attribution?[\"iad-lineitem-id\"] as? String\n                let iadLineitemName = attribution?[\"iad-lineitem-name\"] as? String\n                let iadOrgName = attribution?[\"iad-org-name\"] as? String\n\n                self.searchAdsInfoLabel.text = \"iad-adgroup-id: \\(iadAdgroupId ?? \"\")\\niad-adgroup-name: \\(iadAdgroupName ?? \"\")\\niad-attribution: \\(iadAttribution ?? \"\")\\niad-campaign-id: \\(iadCampaignId ?? \"\")\\niad-campaign-name: \\(iadCampaignName ?? \"\")\\niad-click-date: \\(iadClickDate ?? \"\")\\niad-conversion-date: \\(iadConversionDate ?? \"\")\\niad-creative-id: \\(iadCreativeId ?? \"\")\\niad-creative-name: \\(iadCreativeName ?? \"\")\\niad-keyword: \\(iadKeyword ?? \"\")\\niad-lineitem-id: \\(iadLineitemId ?? \"\")\\niad-lineitem-name: \\(iadLineitemName ?? \"\")\\niad-org-name: \\(iadOrgName ?? \"\")\"\n            }\n        }\n    })\n}\n<\/code><\/pre>\n<p>Call this function in the <code>viewDidLoad()<\/code> method.<\/p>\n<p>The full code listing, of the <code>ViewController.swift<\/code> file should now look like this:<\/p>\n<pre><code>import UIKit\nimport iAd\n\nclass ViewController: UIViewController {\n    @IBOutlet weak var searchAdsInfoLabel: UILabel!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        getSearchAdsInfo();\n    }\n\n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n        \/\/ Dispose of any resources that can be recreated.\n    }\n\n    func getSearchAdsInfo() {\n        ADClient.shared().requestAttributionDetails({ (attributionDetails, error) in\n            if error == nil {\n                for (type, adDictionary) in attributionDetails! {\n                    print(type);\n                    print(adDictionary);\n\n                    let attribution = adDictionary as? Dictionary&lt;AnyHashable, Any&gt;;\n\n                    let iadAdgroupId = attribution?[\"iad-adgroup-id\"] as? String\n                    let iadAdgroupName = attribution?[\"iad-adgroup-name\"] as? String\n                    let iadAttribution = attribution?[\"iad-attribution\"] as? String\n                    let iadCampaignId = attribution?[\"iad-campaign-id\"] as? String\n                    let iadCampaignName = attribution?[\"iad-campaign-name\"] as? String\n                    let iadClickDate = attribution?[\"iad-click-date\"] as? String\n                    let iadConversionDate = attribution?[\"iad-conversion-date\"] as? String\n                    let iadCreativeId = attribution?[\"iad-creative-id\"] as? String\n                    let iadCreativeName = attribution?[\"iad-creative-name\"] as? String\n                    let iadKeyword = attribution?[\"iad-keyword\"] as? String\n                    let iadLineitemId = attribution?[\"iad-lineitem-id\"] as? String\n                    let iadLineitemName = attribution?[\"iad-lineitem-name\"] as? String\n                    let iadOrgName = attribution?[\"iad-org-name\"] as? String\n\n                    self.searchAdsInfoLabel.text = \"iad-adgroup-id: \\(iadAdgroupId ?? \"\")\\niad-adgroup-name: \\(iadAdgroupName ?? \"\")\\niad-attribution: \\(iadAttribution ?? \"\")\\niad-campaign-id: \\(iadCampaignId ?? \"\")\\niad-campaign-name: \\(iadCampaignName ?? \"\")\\niad-click-date: \\(iadClickDate ?? \"\")\\niad-conversion-date: \\(iadConversionDate ?? \"\")\\niad-creative-id: \\(iadCreativeId ?? \"\")\\niad-creative-name: \\(iadCreativeName ?? \"\")\\niad-keyword: \\(iadKeyword ?? \"\")\\niad-lineitem-id: \\(iadLineitemId ?? \"\")\\niad-lineitem-name: \\(iadLineitemName ?? \"\")\\niad-org-name: \\(iadOrgName ?? \"\")\"\n                }\n            }\n        })\n    }\n}\n<\/code><\/pre>\n<p>After you run the project (make sure you run it on your device, as you won&#8217;t get any data back on the simulator) you should get some stub data that Apple returns:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/JstkiJa.png\" alt=\"\" \/><\/p>\n<h2>Conclusion<\/h2>\n<p>If you&#8217;re utilizing Apple&#8217;s Search Ads, then I hope this helped you see how easy it is to fetch Search Ads App Attribution information in your app.<\/p>\n<p>Of course, once you get the data, you should send this to your server for saving and further analysis.<\/p>\n<blockquote class=\"twitter-tweet\" data-width=\"550\">\n<p lang=\"en\" dir=\"ltr\">How to create a <a href=\"https:\/\/twitter.com\/hashtag\/native?src=hash\">#native<\/a> <a href=\"https:\/\/twitter.com\/hashtag\/iOS?src=hash\">#iOS<\/a> app that can read Search Ads Attribution API information <a href=\"https:\/\/twitter.com\/hashtag\/SearchAdsAttribution?src=hash\">#SearchAdsAttribution<\/a> <a href=\"https:\/\/t.co\/6HDQBtzmM7\">https:\/\/t.co\/6HDQBtzmM7<\/a><\/p>\n<p>&mdash; Nikola Bre\u017enjak (@HitmanHR) <a href=\"https:\/\/twitter.com\/HitmanHR\/status\/906882986532012032\">September 10, 2017<\/a><\/p><\/blockquote>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR In this post, I&#8217;ll show you how easy it is to create a native iOS app that can read Search Ads Attribution API information. You can check&hellip;<\/p>\n","protected":false},"author":1,"featured_media":3681,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[52],"tags":[],"class_list":["post-3677","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ios"],"_links":{"self":[{"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/posts\/3677","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/comments?post=3677"}],"version-history":[{"count":4,"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/posts\/3677\/revisions"}],"predecessor-version":[{"id":3682,"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/posts\/3677\/revisions\/3682"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/media\/3681"}],"wp:attachment":[{"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/media?parent=3677"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/categories?post=3677"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nikola-breznjak.com\/blog\/wp-json\/wp\/v2\/tags?post=3677"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}