おそらくご存じのとおり、Yandex.Metricaには、カウンターのデータをXMLまたはJSONで受信できるすばらしいAPIがあります。
長い間、私の手はモバイルクライアントを書くために手を傷つけました。 日中、私はよく自分が行っているリソースの出席者数を調べます。
iPhoneの既存のクライアントは私にとってひどく思えたので、ついに私の手は引っかかれなくなり、書き始めました
クライアントの作成は、次の手順に分割できます。
- Yandexでアプリケーションを登録する
- OAuthユーザー認証とトークンの取得
- トークンを保存しています
- さまざまなデータを取得する
- ディスプレイ
登録
アプリケーションを登録すると、すべてが明確になります-アプリケーションを追加し、アプリケーションが受け取りたい権利をメモします。 承認中、ユーザーはデータを受信する許可を許可または拒否する必要があり、アプリケーションが要求する権利を確認します。
OAuth認証
個人的には、あるサービスのために非公式のクライアントをインストールするとき、私は少し腹を立てます。彼はフォームにログインとパスワードを入力するように頼みます。 彼らがどこへ行くのか誰が知っています。 私の意見では、ブラウザーのウィンドウがサービスのWebサイトで承認されてポップアップする場合、承認手順はより透明に見えます。
技術的には、OAuth承認は非常に簡単です。YandexWebサイト(アプリケーションが登録された場所)のアプリケーション設定で、独自のURLスキームをアプリケーション(myappなど)に追加し、myapp://のようなものを指定します。承認後、アプリケーションがmyapp://でURLを開こうとするようにコーディングします。そのため、アプリケーションでURLが開き、access_tokenを含むすべてのデータが既にあります。
Habréには、 Yandex向けの、まさにそのような認可を備えた優れた記事があり、時間を節約しました。したがって、認可が繰り返されないように特に説明しません。 承認後、トークンを取得し、保存します。
技術的なニュアンス :いつかユーザーがアプリケーションからログアウトすることは論理的です。 そのため、誰かが自分以外の統計にアクセスしたり、別のアカウントでログインしたりすることはできません。 ブラウザーを介して(つまり、UIWebViewを介して)認証する場合、以前に受信したトークンを削除するだけでは不十分です。 UIWebViewでの認証は記憶されているため、ユーザーをログアウトするときは、アプリケーションサンドボックスのCookieを消去する必要があります。そうでない場合は、認証時に同じアカウントに自動的にログインします。 私の場合、単純なコードで十分でした:
NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (cookie in [storage cookies]) { [storage deleteCookie:cookie]; } [NSUserDefaults standardUserDefaults] synchronize];
トークンを保存しています
彼の母国語の記事であっても、初めて彼の能力を選ぶことで、何かについて頭を打ちたいというわずかな欲求があります。 このすべてを理解するために、n文字を保存し、そこからそれらを取り出すだけでよい場合、私は本当にしたくありません。 私のような怠け者のために、AppleはドキュメントにKeychainItemWrapperクラスを添付しました。 名前はそれ自体を物語っています-KeyChainのラッパーです。 確かに、このクラスはARCサポートなしで長い間書かれていましたが、githubではARCサポート付きのフォークを簡単に見つけることができます。 これは、たとえば(CocoaPodsを介して接続することもできます)。
さて、トークンの保存と削除は数行に減りました:
// KeychainItemWrapper *keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"OAuthToken" accessGroup:nil]; [keychainWrapper setObject:@"accountName" forKey:(__bridge id)(kSecAttrAccount)]; [keychainWrapper setObject:tokenToSave forKey:(__bridge id)(kSecValueData)];
// KeychainItemWrapper *keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"OAuthToken" accessGroup:nil]; [keychainWrapper resetKeychainItem];
さまざまなデータを取得する
個人的には、JSONでデータを取得するのが好きです。 リクエストはすべて非常に簡単です。APIからメソッドに必要なリクエストを送信し、ヘッダーにAuthorization:OAuth <access_token>を含めます。 ところで、トークンはgetパラメーターとして渡すこともできます。例:
api-metrika.yandex.ru/counters?oauth_token=<access_token>
セキュリティについては当初から妄想しているため、すべてのリクエストはhttps経由で送信できます(http経由でも可能です)。 JSONでデータを取得し、組み込みのNSJSONSerializationを介して解析します。
dataObject = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingMutableContainers error:&e];
たとえば、カウンターのリストを取得する結果:
それでは、受信したデータを何らかの方法で表示する必要があります。
ディスプレイ
メトリックWebインターフェイスを見ると、基本的に2つのデータ表現があります-テキストデータとグラフを含むテーブルです。
テーブルについてはすべて明らかなようです-UITableViewを使用します。 ほとんどすべてのデータには、ビュー、訪問、ユニークビジター、表示深度、サイトでの時間、直帰率などの同じ一般的な指標が含まれています。 したがって、UIViewControllerのそれぞれで同じコードの束を生成しないようにUITableViewCellの子孫クラスを作成し、その後メソッドで
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
すでに受信したデータを使用してセルを作成するだけです。次に例を示します。
NSString *CellIdentifier = [NSString stringWithFormat:@"CellId_%li_%li", (long)indexPath.section, (long)indexPath.row]; SourcesTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if ( cell == nil ) { cell = [[SourcesTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier textOnLabel:@"" labelTextColor:[UIColor black]]; } // [cell changeValuesWithpageViewsNum:pageViewsNum visitTime:visitTime denials:denialsValue visitsNum:visitsNum ];
ちなみに、サイトで費やされた時間は秒単位で返されるため、mm:ss形式で美しく表示する必要があり、失敗率は0から1であるため、50%は0.5として返されます。
グラフの描画には、いくつかの既成のソリューションがあります。 また、何かがHabréにあります。 個人的には、githubのPNChartが好きでした。 CocoaPodsを介して接続します。
PNChartでチャートを作成する例は、Githubのプロジェクトページにあります。
UITabsViewControllerですべてを構成し、少し調べて、出力としてポケットの高速統計を取得します。
結果をAppStoreにアップロードすることにしました。誰でもインストールできます。
開発を継続するインセンティブを得るために、私はアプリケーションに支払いをしました。 10個のプロモーションコードを同封しています。
A49RNFA4W6KR
37LWRW7TYH36
RMPHML3EL6EL
JKWWFATEJ4YE
4RETFRLEPRFW
AWKN4LYRM4LK
L4K6NJNTN4RJ
NT9Y97HN7HKA
TRPXHFXX47PE
E96MN3JP9X9Y
便利なリンク:
CocoaPodsは、Objective-C開発者の手による強力なツールです
iOSでのYandex OAuth認証
PNChart (チャート)
KeychainItemWrapper (KeyChainのラッパー)