Один из способов сделать это - настроить делегата в UIWebView, который имеет shouldStartLoadEvent. Внутри этого события вы проверяете, по какому URL пытается перейти UIWebView. Теперь для связи с 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, вы должны реализовать mustStartLoadEvent, «перехватить» эти 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. Однако это гораздо сложнее реализовать и, вероятно, представляет угрозу безопасности. Я бы рекомендовал реализовать логику маршрутизации, как показано в коде выше.