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

<コピペ用>

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.
    }
}

 

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

③TreasureDataのSDKを組み込む

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

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

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

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

$ gem install cocoapods

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

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

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

$ pod install

そうすると、プロジェクトディレクトリ直下に “●●●.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に 下記記述を追記します。

#import "TreasureData.h"

スクリーンショット 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の設定】

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

【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)")
  }
)

上記のコードは、

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

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

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

TreasureData.sharedInstance().uploadEvents()

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

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.
    }
}

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

dada

最後に

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

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


DACエンジニア採用情報

  関連記事

スクリーンショット 2015-07-31 16.41.25
【未経験からのRuby on Rails – 第3回】変数と定数

こんにちは。新卒1年目のmatsuariです。 今回はRubyに限らずプログラミングを学ぶ上で非常に重要となる「変数と定数」について、ご紹介していきます。 変数とは・・・ オブジェクトを一時的に格納しておく箱で、オブジェクトを識別するために利用します。 言葉だけでは理解が難しいかと思いますので、まず …

14391226325_8c35c2a652_z
D3.jsとその活用事例について

D3.jsとは? D3とは「Data Driven Document」の略で、データに基づいてドキュメントを操作するための JavaScript ライブラリです。 ご存知の方も多いと思いますが、ちょっとだけD3.jsの基本的な使い方、そして弊社プラットフォームでの利用についてご紹介したいと思います。 …

スクリーンショット 2015-07-31 16.38.02
【未経験からのRuby on Rails – 第2回】Rubyのプログラムを書いてみる(Mac)

こんにちは。新卒1年目のmatsuariです。 前回はRubyとは何か、簡単にご紹介をしましたが、 今回は実際にRubyファイルを作成して、プログラムを書いてみるところまでご紹介していけたらと思います。 Mac環境のプログラミング初心者向けです。 はじめに、Rubyのプログラムを書くためのファイルを …

4
【未経験からのRuby on Rails – 第4回】Railsアプリケーション開発をしよう! 〜開発の準備編〜

こんにちは。新卒のmatsuariです。 Rubyについてまだまだ知るべきことはたくさんありますが、とにかく早くアプリを作りたい! ということで、今回はアプリ開発の準備に取り掛かっていきます。 Rubyはアプリを作成しながら、同時に学んでいきたいと思います。 Railsアプリケーション開発の準備《 …

rails
初心者がRailsで開発 – deviseでユーザー認証設定 -

こんにちは、2年目のYukaです。 開発部所属でありながら実は、、 実際に自分で手を動かして開発する機会がなかなかありませんでした。。 しかしついに、、、 開発初心者がRailsでWebアプリの開発に挑戦します!! 今回のゴールは社内でも使用しているGoogleアカウントで簡単にログインができるよう …

tf
ディープラーニングで「顔が似ているAKB48のメンバーを教えてくれるbot」を構築

概要 こんにちは、システム開発部の中村です。 今回は、Facebook Messenger APIを利用して、 画像をアップロードすると、似ているAKB48のメンバーを教えてくれるbotを実装しました。 尚、ディープラーニングやTensorFlowそのものの解説というより、 「エンジンとしてディープ …

no image
【小ネタ】Javascriptのconsoleオブジェクトをもっと便利に使う方法

すごく便利なconsoleオブジェクトですが、ブラウザによってサポートされているメソッドが なかったり、そもそもconsoleオブジェクトが使えなかったりと、たまに不便だったりします。 そんなときによく使う便利なコード。 使い方はconsoleと同じようにlogger.log,logger.grou …

question
読み方がわからない技術用語 2015

英語圏での読み方を基本的には参考にしています。英語圏でも複数の読み方をしているケースもあるようなので、あくまでも参考程度。2015と書きながら、古い言葉も混じってますが。 async – えーしんく Alt – おると ASUS – えいすーす bower &#8 …

shogi
ナイーブベイズで羽生さんと羽生くんを分類してみた

はじめに こんにちは。システム開発部の中村です。 機械学習についての理解を促進するため、 データから分類モデルを自動で構築する古典的な方法である、 ナイーブベイズ分類器を実装してみました。 最近はCloudVisionAPIなど専ら画像解析が流行っていますが、 自分のような初学者には敷居が高そうだっ …

3_001
プログラミング初心者がswiftでゲームアプリ的なものを作ってみた。

こんにちは、DAC2年目のkumataです。 普段は素敵な先輩方に囲まれてインフラ周りのお仕事をさせて頂いていますが、 今回は業務とは全く関係ないプログラミングをやってみました。 全く初心者なのですが、swift+Xcodeで簡単にスマホゲーム的なものが作れました。 初心者の目線から作成方法をつらつ …