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 文档,但其中描述的示例都是针对新声明的方法,我想这可能更容易实现,因为已经定义了 Obj-C 方法。

提前感谢您的任何意见。

4

4 回答 4

3

一种方法是在具有 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 中定义并避免硬编码路由逻辑这一事实的唯一方法是使用 @selectors 或 Objective-C 中可用的类似动态函数调用。但是,这实现起来要复杂得多,并且可能会带来安全风险。我建议实现路由逻辑,如上面的代码所示。

于 2010-04-28T23:30:44.297 回答
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 回答
0

您可以在以下位置找到我编写的 Phonegap Flurry 插件

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

于 2011-11-17T10:42:25.220 回答