UIWebviewにインクルードしているWebにIDFAを渡すという要件があった。会員登録が不要なコンテンツでユーザを一意に特定する手段が存在しないため、サーバサイドでIDFAを受け取るAPIを用意してDBにストックするという方法は使えない。というわけでクッキー経由でIDFAの受け渡しを実現したというメモです。
クラスメソッドを定義
汎用的に使えるように、IDFA取得とクッキーをセットするクラスメソッド2つをユーティリティクラス的なところに定義します。IDFAを扱うにはAdSupport.frameworkが必要ですので追加しておきます。
// Common(ユーティリティ)クラス
// import AdSupport
/// getIdfaString
///
/// - returns: IDFA
class func getIdfaString()->String.UTF8View {
var idfaString:String.UTF8View = "".utf8
//IDFA
if let myIDFA = ASIdentifierManager().advertisingIdentifier {
idfaString = myIDFA.uuidString.utf8
}
return idfaString
}
/// setCookie
///
/// - parameter key: クッキーのキー
/// - parameter value: 値
class func setCookie(key: String, value: AnyObject) {
let ExpTime:Double = TimeInterval(60 * 60 * 24 * 365)
let cookieProps: [HTTPCookiePropertyKey : Any] = [
HTTPCookiePropertyKey.domain: Common.baseDomain,
HTTPCookiePropertyKey.path: "/",
HTTPCookiePropertyKey.name: key,
HTTPCookiePropertyKey.value: value,
HTTPCookiePropertyKey.secure: "TRUE",
HTTPCookiePropertyKey.expires: NSDate(timeIntervalSinceNow: ExpTime)
]
if let cookie = HTTPCookie(properties: cookieProps) {
HTTPCookieStorage.shared.setCookie(cookie)
}
}
呼び出して使う
実際にIDFAを取得してクッキーにセットするところです。クッキー利用の許可を忘れずに。
HTTPCookieStorage.shared.cookieAcceptPolicy = HTTPCookie.AcceptPolicy.always
以下は、ad_idfaにIDFAを、ad_idfa_typeに"idfa"を、ad_optoutに"0"を設定しているサンプルコードです。
// ViewControllerクラス
override func viewDidLoad() {
super.viewDidLoad()
// IDFAを取得
let idfa = Common.getIdfaString()
// クッキーを許可
HTTPCookieStorage.shared.cookieAcceptPolicy = HTTPCookie.AcceptPolicy.always
// クッキーを設定
Common.setCookie(key: "ad_idfa", value: idfa.description as AnyObject)
Common.setCookie(key: "ad_idfa_type", value: "idfa" as AnyObject)
Common.setCookie(key: "ad_optout", value: "0" as AnyObject)
}