Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
106
Help us understand the problem. What is going on with this article?
@kenmaz

iOS9のSFSafariViewControllerを使ってアプリ初回起動時のブラウザリダイレクトを卒業しよう

More than 3 years have passed since last update.

2017-07-25 追記

App Store審査ガイドラインにおいて下記の方法でユーザのトラッキングを行うことは明確にNGとされたようです。

また、SafariViewControllerを使用して、ユーザーの認知や同意なしにアプリケーションでユーザーの追跡を行わないでください。

######### 追記おわり ############

広告トラッキングのために、アプリ初回起動直後に自動的にSafariが開いて、再度アプリに戻ってくる・・っていうやつありますよね。うざいですよね。
Safariのcookieをアプリ側から取れないので、ああいうダサいことを各広告SDK提供会社は採用していたわけです。

で、iOS9のSFSafariViewControllerを使えば、このダサイ挙動は改善できるんじゃない?ってことを同僚と話していたので、実験してみました。

ViewController.swift
import UIKit
import SafariServices

let kSafariViewControllerCloseNotificationName = "safariViewControllerCloseNotificationName"

class ViewController: UIViewController {

    lazy var safariVC:SFSafariViewController! = {
        let url = NSURL(string: "http://kenmaz.net/tmp/ios9_sample.html")!
        let vc = SFSafariViewController(URL:url)
        vc.delegate = self
        return vc
    }()

    var tracked = false

    override func viewDidLoad() {
        super.viewDidLoad()

        NSNotificationCenter.defaultCenter().addObserverForName(
            kSafariViewControllerCloseNotificationName,
            object: nil,
            queue: NSOperationQueue.mainQueue()) { [unowned self] (notification) -> Void in

                self.tracked = true
                self.safariVC.dismissViewControllerAnimated(true, completion: nil)
        }
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        if !tracked {
            presentViewController(safariVC, animated: true, completion: nil)
        }
    }
}

extension ViewController: SFSafariViewControllerDelegate {

    func safariViewControllerDidFinish(controller: SFSafariViewController) {
        controller.dismissViewControllerAnimated(true, completion: nil)
    }
}
AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, openURL url: NSURL,
        sourceApplication: String?, annotation: AnyObject) -> Bool {

            NSNotificationCenter.defaultCenter().postNotificationName(
                kSafariViewControllerCloseNotificationName,
                object: nil)

            return true
    }
}
ios9_sample.html
<h1>踏み台ページ</h1>

<script>
  setTimeout(function() {
    document.location = 'ios9-safarivc://close'
  }, 3000);
</script>

NDAがあるのでスクショは載せられませんがサンプルコードだけアップしときました。
https://github.com/kenmaz/iOS9_safariVCSample

一瞬safariViewControllerがチラっと表示されるのがダサいですが、cookieはちゃんと共有されてます。
他にもクールなやり方があるかもしれませんが、各広告SDK提供会社に期待しましょう。。。

106
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
106
Help us understand the problem. What is going on with this article?