DACエンジニアブログ:アドテクゑびす界

DACのエンジニアやマーケター、アナリストが執筆するアドテクの技術系ブログです。

iOS端末情報をTreasureDataに送るアプリをswiftで作ってみた。

はじめまして、2年目のOyamanです。

通常業務とは別のことになりますが、Swiftに触れる機会が少しあったので、スマホ関連の記事を書かせていただきます。

はじめに

SwiftとTreasureDataのSDKを使って、 iOSの端末情報をTreasureDataへ送るアプリを作ってみます。

今回は、IDFAとOSバージョン情報を端末情報として取得して、送ってみたいと思います。

※注意※

  • 裏側の動きの話になるので、フロントの部分には触れません。
  • 実機を使用しての検証は、DeveloperProgramに登録を行う必要があります。 (このアプリは、シミュレータでも問題なく動きます。)
  • TreasureDataのアカウントは、各自ご用意ください。

環境

下記、私の環境です。

  • MacBook Air : OS X Yosemite 10.10.5
  • Xcode-beta 7.0 (Xcode 6.3でも動作確認済み)
  • iOS9(iOS8.3でも動作確認済み)
  • TreasureData iOS SDK: 0.1.6

①Xcodeでプロジェクトを作成する。

Xcodeを開いて"Project"をクリックすると、下図の様な画面になりますので、 iOS > Application > Single View Application を選択して"NEXT"をクリック。

aaa

Product Nameをつけるボックスが表示されるので、好きに命名してください。 ※LanguageをSwiftに変えることだけは忘れないでください。

これでXcodeのプロジェクト作成は終わりです。

aaaa

②IDFAとOSバージョン情報をログとして表示してみる。

プロジェクトの作成が完了したら、左のバーから"ViewController.swift"をクリックして、viewDidLoad(インスタンス化された直後に読みこまれる部分)の中に、IDFAとOSバージョンを取得してprintする記述を入れます。

また、ASIdentiferManagerを使用するにあたって、import AdSupportを記述しておく必要があります。

この状態でアプリをビルドすると、画面下部にIDFAとOSバージョンのログが表示されます。 aaaasda

<コピペ用>

[code] import UIKit import AdSupport

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib

    //IDFA
    let myIDFA = ASIdentifierManager().advertisingIdentifier
    print("myIDFA :\(myIDFA.UUIDString.utf8)")

    // OS Version.
    let mySystemVersion = UIDevice.currentDevice().systemVersion
    print("Version: \(mySystemVersion)")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

} [/code]

 

IDFAとOSバージョン表示されていることが確認できたらこの情報をTreasureDataに送ってみましょう。

③TreasureDataのSDKを組み込む

TreasureDataのSDKを使用するのですが、SDKがObjective-Cで作られています。

今回はSwiftを用いてアプリを作成しているので、Bridging-Header(Objective-CとSwiftを相互に連携するための機能)を用いてSDKとの連携を取ります。

SDKの組み込み手順は下記の通りです。

ターミナルを開いて下記コマンドを入力して、cocoapodsをインストールします。

[shell] $ gem install cocoapods [/shell]

cdコマンドで、作成したアプリのプロジェクトディレクトリまで移動したあと、下記コマンドでPodfileを作成し、作成したPodfileに「pod 'TreasureData-iOS-SDK', '= 0.1.6'」を記述します。

[shell] $ touch Podfile $ echo -e "pod 'TreasureData-iOS-SDK', '= 0.1.6'" >> Podfile [/shell]

Podfileの作成が完了したら、下記コマンドを叩きます。

[shell] $ pod install [/shell]

そうすると、プロジェクトディレクトリ直下に "●●●.xcworkspace"といった形式のファイルが作成されるのでクリックして開きます。

fawfa

ファイルを開くと、下図のように、アプリのプロジェクトに並んで、先程作成されたPodsが追加されているはずです。 スクリーンショット 2015-09-08 16.24.42

これで、アプリにSDKを入れることが出来ましたが、Bridge-Headerで連携を取っていないのでSDKを使うことが出来ません。 なので、Bridge-Headerの設定をします。

まず下図のように、File > New > Fileをクリックします。 fwfwawa

クリックすると、下図のような画面が表示されるので、 iOS > Source > Cocoa Touch Classを選択します。 gdfgd

Class名を入力する画面が出るので、Class名を入力します。(何でも良いです。) ※Languageは"Objective-C" にしておいてください。 wfaw

Class名を入力して次に進むと、

  • Class名.h
  • Class名.m

の2ファイルが作成されるので、 Class名.hに 下記記述を追記します。

[code]

import "TreasureData.h"

[/code]

スクリーンショット 2015-09-08 16.43.04

そして、下図のように アプリのプロジェクトファイル > Build Setting > Swift Compiler > Objectrive-C Bridging Headerに先程作成したClass名.hのファイルをドラッグします。

スクリーンショット 2015-09-08 17.03.43

これでSDKの組み込みは完了です。

TreasureDataにIDFAとOSバージョン情報を送る。

TreasureDataにログを送付するにあたり、 ViewController.swiftに追記を下記内容を追記する必要があります。

【TreasureDataAPIのEndpointとAPIKEYの設定】

[code] TreasureData.initializeApiEndpoint("https://in.treasuredata.com") TreasureData.initializeWithApiKey("hogehogehogehogeAPI") [/code]

【TreasureDataにデータをコミットする記述】

[code] TreasureData.sharedInstance().addEventWithCallback([ "idfa":"(myIDFA.UUIDString.utf8)",  "os_version":"(mySystemVersion)", ], database: "ooyaman_testdb", table: "device_info", onSuccess: {()-> Void in print("addEvent: success") },

onError: {(errorCode, message) -> Void in print("addEvent: error. errorCode=(errorCode) message=(message)") } ) [/code]

上記のコードは、

  • idfaというカラムにidfa情報
  • os_versionというカラムにOSバージョン情報

以上の情報を データベース:ooyaman_testdb テーブル:device_info へ格納することをコミットしています。

【TreasureDataにコミットしたデータをプッシュする】

[code] TreasureData.sharedInstance().uploadEvents() [/code]

以上内容をViewController.swiftに記述したものが下記内容となります。

[code] import UIKit import AdSupport

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib

    //TreasureData initialize
    TreasureData.initializeApiEndpoint("https://in.treasuredata.com")
    TreasureData.initializeWithApiKey("hogehogehogehogeAPI")

    //IDFA
    let myIDFA = ASIdentifierManager().advertisingIdentifier
    print("myIDFA :\(myIDFA.UUIDString.utf8)")

    // OS Version.
    let mySystemVersion = UIDevice.currentDevice().systemVersion
    print("Version: \(mySystemVersion)")

    //TreasureDataに送信するデータをコミット
    TreasureData.sharedInstance().addEventWithCallback([
        "idfa":"\(myIDFA.UUIDString.utf8)",
        "os_version":"\(mySystemVersion)",
        ], database: "ooyaman_testdb", table: "device_info", onSuccess: {()-> Void in
            print("addEvent: success")
        },

        onError:
        {(errorCode, message) -> Void in
            print("addEvent: error. errorCode=\(errorCode) message=\(message)")
        }
    )

    //TreasureDataへデータをプッシュ
    TreasureData.sharedInstance().uploadEvents()
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

} [/code]

以上内容でビルドすると、 下図のようにTreasureDataにIDFAとOSバージョン情報が送付されます。

dada

最後に

今回IDFAを端末情報としてTreasureDataに送ってみましたが、本来のIDFA利用目的に沿わないので、このアプリは審査に絶対通りません。(笑)

アプリから適当なスマホログをTreasureDataに送ってみたいと考えている人の役に立てば幸いです。