1

Phonegap を使用してネイティブの iPhone アプリを開発しているので、すべて HTML と JS で行われます。分析に Flurry SDK を使用しており、

[FlurryAPI logEvent:@"EVENT_NAME"];

イベントを追跡する方法。Javascriptでこれを行う方法はありますか? したがって、リンクを追跡するときは、次のようなものを使用することを想像します

<a onClick="flurryTrackEvent("Click_Rainbows")" href="#Rainbows">Rainbows</a>
<a onClick="flurryTrackEvent("Click_Unicorns")" href="#Unicorns">Unicorns</a>

「FlurryAPI.h」には以下があります。

@interface FlurryAPI : NSObject {
}

+ (void)startSession:(NSString *)apiKey;
+ (void)logEvent:(NSString *)eventName;
+ (void)logEvent:(NSString *)eventName withParameters:(NSDictionary *)parameters;
+ (void)logError:(NSString *)errorID message:(NSString *)message exception:(NSException *)exception;

+ (void)setUserID:(NSString *)userID;
+ (void)setEventLoggingEnabled:(BOOL)value;
+ (void)setServerURL:(NSString *)url;
+ (void)setSessionReportsOnCloseEnabled:(BOOL)sendSessionReportsOnClose;

@end

私は logEvent メソッドにのみ興味があります。まだはっきりしていない場合は、私は JS には慣れていますが、回復中の Obj-C 初心者です。Apple docsを読みましたが、そこに記載されている例はすべて新しく宣言されたメソッド用であり、Obj-C メソッドが既に定義されているため、実装が簡単になると思います。

ご意見をお寄せいただきありがとうございます。

4

4 に答える 4

3

これを行う 1 つの方法は、shouldStartLoadEvent を持つ UIWebView でデリゲートをセットアップすることです。そのイベント内で、UIWebView がナビゲートしようとしている URL を確認します。JavaScript から Objective-C に通信するには、さまざまなアクションをトリガーする独自のカスタム アンカーを指定する必要があります。たとえば、何かをログに記録するために、アンカー「#FAPI_LogEvent_Click_Rainbows」を使用することを決定できます。

JavaScript では、メソッドを次のように定義できます。

function flurryTrackEvent(text) {
  window.location.href = 'FAPI_LogEvent' + text;
}
function flurrySetUserID(userID) {
  window.location.href = 'FAPI_SetUserID' + userID;
}

次に、Objective-C で shouldStartLoadEvent を実装し、これらの href ナビゲーションを「キャプチャ」して、ブラウザーにロードしないように指示します。文字列を自分で分割し、適切な関数を呼び出す必要があります。ここにいくつかのコードがあります:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType () {
  NSString *theAnchor = [[request URL] fragment];
  if ([theAnchor hasPrefix:@"FAPI_LogEvent"]) {
    NSString *textToLog = [theAnchor substringFromIndex:[@"FAPI_LogEvent" length]];
    [FlurryAPI logEvent:textToLog];
    return NO; // prevent the UIWebView from navigating to this anchor
  } else if ([theAnchor hasPrefix:@"FAPI_SetUserID"]) {
    NSString *userID = [theAnchor substringFromIndex:[@"FAPI_SetUserID" length]];
    [FlurryAPI setUserID:userID];
    return NO; // prevent the UIWebView from navigating to this anchor
  }
}

適切な Objective-C メソッドを呼び出すには、独自のルーティング動作を実装する必要があるため、イベントが既に Objective-C で定義されているという事実はあまり役に立ちません。メソッドが Objective-C で既に定義されているという事実を利用し、ルーティング ロジックのハード コーディングを回避できる唯一の方法は、Objective-C で利用可能な @selectors または同様の動的関数呼び出しを使用することです。ただし、これは実装がはるかに複雑であり、セキュリティ上のリスクが生じる可能性があります。上記のコードに示されているようなルーティング ロジックを実装することをお勧めします。

于 2010-04-28T23:30:44.297 に答える
0

私が書いた Phonegap Flurry Plugin は、次の場所にあります。

https://github.com/designerkamal/Phonegap-Flurry-Plugin

于 2011-11-17T10:42:25.220 に答える
0

PhoneGap にはネイティブ プラグインを追加する機能があり、iOS 用の Flurry ログ イベント プラグインを追加するには、次のようにします。

PGFlurryPhoneGap プラグイン クラスを追加します。

PGFlurry.h

#import <PhoneGap/PGPlugin.h>

@interface PGFlurry : PGPlugin
- (void)logEvent:(NSArray*)arguments withDict:(NSDictionary*)options;
@end

PGFlurry.m

#import "PGFlurry.h"
#import "FlurryAPI.h"

@implementation PGFlurry
// if you init Flurry somewhere else you can remove this method
- (PGPlugin*) initWithWebView:(UIWebView*)theWebView {
  self = [super init];
  if (self == nil) {
    return nil;
  }

  // init and start Flurry
  [FlurryAPI startSession:@"API key"];

  return self;
}

- (void)logEvent:(NSArray*)arguments withDict:(NSDictionary*)options {
  [FlurryAPI logEvent:[arguments objectAtIndex:0]];
}
@end

JavaScript プラグイン ヘルパーをwwwフォルダーに追加します。

Flurry.js

PhoneGap.addConstructor(function() {
  if(!window.plugins) {
    window.plugins = {};
  }

  window.plugins.flurry = {
    logEvent: function(name) {
      return PhoneGap.exec("PGFlurry.logEvent", name);
    }
  }
});

PhoneGap.plistキーと値の両方が「PGFlurry」であるキーと値のペアを「プラグイン」ディクショナリに追加して、プラグインを追加します。

これで、次のように使用できるはずです。

<!DOCTYPE html>
<html>
  <head>
    <script src="phonegap.js" type="text/javascript"></script>
    <script src="flurry.js" type="text/javascript"></script>
    <script type="text/javascript">
      document.addEventListener("deviceready", function() {
        window.plugins.flurry.logEvent("Testing");
      }, false);
    </script>
  </head>
  <body>
  </body>
</html>
于 2011-10-26T15:35:33.120 に答える
0

Objective-C ライブラリを使用せず、js ライブラリを使用すると、objective-c について心配する必要はありません。:)

于 2013-08-12T20:46:33.220 に答える