Yandex.Metrics for iPhoneのクライアントを作成しています


おそらくご存じのとおり、Yandex.Metricaには、カウンターのデータをXMLまたはJSONで受信できるすばらしいAPIがあります。

長い間、私の手はモバイルクライアントを書くために手を傷つけました。 日中、私はよく自分が行っているリソースの出席者数を調べます。

iPhoneの既存のクライアントは私にとってひどく思えたので、ついに私の手は引っかかれなくなり、書き始めました

クライアントの作成は、次の手順に分割できます。

  1. Yandexでアプリケーションを登録する
  2. OAuthユーザー認証とトークンの取得
  3. トークンを保存しています
  4. さまざまなデータを取得する
  5. ディスプレイ

登録


アプリケーションを登録すると、すべてが明確になります-アプリケーションを追加し、アプリケーションが受け取りたい権利をメモします。 承認中、ユーザーはデータを受信する許可を許可または拒否する必要があり、アプリケーションが要求する権利を確認します。

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]; 


トークンを保存しています


妄想的な人々にとって重要な点は、受け取ったトークンの保存です。 もちろん、NSUserDefaultsに入れることもできますが、たとえば、ジェイルブレイクがある場合は安全ではないので、このトークンを選択できると彼らは言います。 KeyChainにアクセスキー、ログイン、その他の重要なものを保存することをお勧めします。すべてがそこで暗号化され、保護されます。

彼の母国語の記事であっても、初めて彼の能力を選ぶことで、何かについて頭を打ちたいというわずかな欲求があります。 このすべてを理解するために、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のラッパー)

Source: https://habr.com/ru/post/J217989/


All Articles