iOS端末情報をTreasureDataに送るアプリをswiftで作ってみた。
- プログラム言語 IDFA, iOS, Swift, Treasure Data
はじめまして、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”をクリック。
Product Nameをつけるボックスが表示されるので、好きに命名してください。
※LanguageをSwiftに変えることだけは忘れないでください。
これでXcodeのプロジェクト作成は終わりです。
②IDFAとOSバージョン情報をログとして表示してみる。
プロジェクトの作成が完了したら、左のバーから”ViewController.swift”をクリックして、viewDidLoad(インスタンス化された直後に読みこまれる部分)の中に、IDFAとOSバージョンを取得してprintする記述を入れます。
また、ASIdentiferManagerを使用するにあたって、import AdSupportを記述しておく必要があります。
この状態でアプリをビルドすると、画面下部にIDFAとOSバージョンのログが表示されます。
<コピペ用>
[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”といった形式のファイルが作成されるのでクリックして開きます。
ファイルを開くと、下図のように、アプリのプロジェクトに並んで、先程作成されたPodsが追加されているはずです。
これで、アプリにSDKを入れることが出来ましたが、Bridge-Headerで連携を取っていないのでSDKを使うことが出来ません。
なので、Bridge-Headerの設定をします。
まず下図のように、File > New > Fileをクリックします。
クリックすると、下図のような画面が表示されるので、
iOS > Source > Cocoa Touch Classを選択します。
Class名を入力する画面が出るので、Class名を入力します。(何でも良いです。)
※Languageは”Objective-C” にしておいてください。
Class名を入力して次に進むと、
- Class名.h
- Class名.m
の2ファイルが作成されるので、
Class名.hに 下記記述を追記します。
[code]
#import "TreasureData.h"
[/code]
そして、下図のように
アプリのプロジェクトファイル > Build Setting > Swift Compiler > Objectrive-C Bridging Headerに先程作成したClass名.hのファイルをドラッグします。
これで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バージョン情報が送付されます。
最後に
今回IDFAを端末情報としてTreasureDataに送ってみましたが、本来のIDFA利用目的に沿わないので、このアプリは審査に絶対通りません。(笑)
アプリから適当なスマホログをTreasureDataに送ってみたいと考えている人の役に立てば幸いです。

関連記事
-
-
GoogleスプレッドシートからTreasureDataへデータを取り込む
AudienceOneの開発を担当しています。skryoです。 またまたTreasureDataネタですが、今回はGoogleスプレッドシートからGoogleAppsScriptを使ってTreasureDataへデータを取り込む手順を紹介したいと思います。 なぜ? Googleスプレッドシート上でマ …
-
-
プログラミング初心者がswiftでゲームアプリ的なものを作ってみた。
こんにちは、DAC2年目のkumataです。 普段は素敵な先輩方に囲まれてインフラ周りのお仕事をさせて頂いていますが、 今回は業務とは全く関係ないプログラミングをやってみました。 全く初心者なのですが、swift+Xcodeで簡単にスマホゲーム的なものが作れました。 初心者の目線から作成方法をつらつ …
-
-
TypeScriptについてまとめてみた
はじめに JavaScript がとりあえずそのまま動くので、雰囲気で使ってしまいがちな TypeScript。初心者向けに基本的なことをまとめてみました。 TypeScript って何? TypeScript はマイクロソフトが開発したプログラミング言語で、オープンソースでメンテナンスされています …
-
-
Scala番外編「Boxに保存したファイルをBox APIを使ってダウンロードしよう!」
はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 Box APIを使う背景・目的 DACはメディアレップです メディアレップとは、インタ …
-
-
ナイーブベイズで羽生さんと羽生くんを分類してみた
はじめに こんにちは。システム開発部の中村です。 機械学習についての理解を促進するため、 データから分類モデルを自動で構築する古典的な方法である、 ナイーブベイズ分類器を実装してみました。 最近はCloudVisionAPIなど専ら画像解析が流行っていますが、 自分のような初学者には敷居が高そうだっ …
-
-
Scala入門 準備編「開発環境構築」 – PHP使いからScala使いへ転身!
はじめに みなさんこんにちは、今月入社しましたプロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 XmediaOneの開発で採用しているプログラム言語はS …
-
-
Railsたった14行でアドサーバーAPIができた話
こんにちは。駆け出しエンジニアの近江です。 最近Railsにハマっているので、私が2年間担当しているアドサーバの、簡易版をRailsで作ってみました。 広告やキャンペーンを登録する管理画面はある前提で、ここからたった14行追加するだけでアドサーバーのHTTP APIを作りたいと思います。ついでに配信 …
-
-
PyStanによるはじめてのマルコフ連鎖モンテカルロ法
はじめに こんにちは。システム開発部の中村です。 社内で行っている『データ解析のための統計モデリング入門』(所謂緑本)の輪読会に参加した所、 大変わかりやすい本だったものの、Macユーザには悲しい事に実装サンプルがWinBUGSだったため、 9章の一般化線形モデルのベイズ推定によるアプローチをPyt …
-
-
Scala入門 基礎編「Scalaの書き方を理解しよう」 – PHP使いからScala使いへ転身!
はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 さて、今回はScala入門第二弾として、Scalaの書き方を紹介する基礎編をお送りしま …
-
-
Qiita Team API と Google Spread Sheet でチーム日報を生成する
チーム日報を活用する MarketOne 開発チームでは複数拠点に分かれての開発を行っています。リモート開発が中心となると口頭でのコミュニケーションに限界があるため、テキストベースのコミュニケーションの比重が高い状態にあります。 チケットシステムやソースコード管理ツール上の議論はもちろんおこなってい …