diff --git a/iphone/Maps/Bridging-Header.h b/iphone/Maps/Bridging-Header.h index 33552361ee..fed91fa84e 100644 --- a/iphone/Maps/Bridging-Header.h +++ b/iphone/Maps/Bridging-Header.h @@ -3,6 +3,7 @@ // #import +#import #import #import "3party/Alohalytics/src/alohalytics_objc.h" diff --git a/iphone/Maps/Common/Statistics/StatisticsStrings.h b/iphone/Maps/Common/Statistics/StatisticsStrings.h index a6ba136865..8d220512c4 100644 --- a/iphone/Maps/Common/Statistics/StatisticsStrings.h +++ b/iphone/Maps/Common/Statistics/StatisticsStrings.h @@ -156,6 +156,7 @@ static NSString * const kStatOut = @"Out"; static NSString * const kStatPedestrian = @"Pedestrian"; static NSString * const kStatPlacePage = @"Place page"; static NSString * const kStatPlacePageBannerBlank = @"Placepage_Banner_blank"; +static NSString * const kStatPlacePageBannerClick = @"Placepage_Banner_click"; static NSString * const kStatPlacePageBannerError = @"Placepage_Banner_error"; static NSString * const kStatPlacePageBannerShow = @"Placepage_Banner_show"; static NSString * const kStatRB = @"RB"; @@ -175,6 +176,7 @@ static NSString * const kStatProgress = @"Progress"; static NSString * const kStatProvider = @"Provider"; static NSString * const kStatPushReceived = @"Push received"; static NSString * const kStatRate = @"Rate"; +static NSString * const kStatReason = @"Reason"; static NSString * const kStatRecentTrack = @"Recent track"; static NSString * const kStatRegular = @"Regular"; static NSString * const kStatRemove = @"Remove"; diff --git a/iphone/Maps/Core/Ads/Banner.swift b/iphone/Maps/Core/Ads/Banner.swift index 789244efd3..38095e6fc5 100644 --- a/iphone/Maps/Core/Ads/Banner.swift +++ b/iphone/Maps/Core/Ads/Banner.swift @@ -3,7 +3,8 @@ protocol Banner: MWMBanner { typealias ErrorDetails = [String : Any] typealias Success = (Banner) -> Void typealias Failure = (BannerType, EventName, ErrorDetails, NSError) -> Void - func reload(success: @escaping Success, failure: @escaping Failure) + typealias Click = (BannerType) -> Void + func reload(success: @escaping Success, failure: @escaping Failure, click: @escaping Click) var isBannerOnScreen: Bool { get set } var isNeedToRetain: Bool { get } diff --git a/iphone/Maps/Core/Ads/BannersCache.swift b/iphone/Maps/Core/Ads/BannersCache.swift index a42b046b97..650d152d64 100644 --- a/iphone/Maps/Core/Ads/BannersCache.swift +++ b/iphone/Maps/Core/Ads/BannersCache.swift @@ -1,4 +1,5 @@ import Crashlytics +import MyTrackerSDK @objc (MWMBannersCache) final class BannersCache: NSObject { @@ -35,6 +36,8 @@ final class BannersCache: NSObject { assert(false) return } + Statistics.logEvent(kStatPlacePageBannerShow, withParameters: banner.type.statisticsDescription) + MRMyTracker.trackEvent(withName: kStatPlacePageBannerShow) completion(banner, isAsync) banner.isBannerOnScreen = true self.completion = nil @@ -60,14 +63,17 @@ final class BannersCache: NSObject { let banner = bannerType.banner! requests[bannerType] = banner banner.reload(success: { [unowned self] banner in - Statistics.logEvent(kStatPlacePageBannerShow, withParameters: banner.type.statisticsDescription) self.setLoaded(banner: banner) }, failure: { [unowned self] bannerType, event, errorDetails, error in var statParams = errorDetails statParams[kStatErrorMessage] = (error as NSError).userInfo.reduce("") { $0 + "\($1.key) : \($1.value)\n" } Statistics.logEvent(event, withParameters: statParams) Crashlytics.sharedInstance().recordError(error) + MRMyTracker.trackEvent(withName: event) self.setError(bannerType: bannerType) + }, click: { bannerType in + Statistics.logEvent(kStatPlacePageBannerClick, withParameters: bannerType.statisticsDescription) + MRMyTracker.trackEvent(withName: kStatPlacePageBannerClick) }) } diff --git a/iphone/Maps/Core/Ads/FacebookBanner.swift b/iphone/Maps/Core/Ads/FacebookBanner.swift index f6925ca748..235353527c 100644 --- a/iphone/Maps/Core/Ads/FacebookBanner.swift +++ b/iphone/Maps/Core/Ads/FacebookBanner.swift @@ -4,10 +4,12 @@ import FBAudienceNetwork final class FacebookBanner: FBNativeAd, Banner { fileprivate var success: Banner.Success! fileprivate var failure: Banner.Failure! + fileprivate var click: Banner.Click! - func reload(success: @escaping Banner.Success, failure: @escaping Banner.Failure) { + func reload(success: @escaping Banner.Success, failure: @escaping Banner.Failure, click: @escaping Click) { self.success = success self.failure = failure + self.click = click load() requestDate = Date() @@ -109,10 +111,12 @@ final class FacebookBanner: FBNativeAd, Banner { extension FacebookBanner: FBNativeAdDelegate { func nativeAdDidLoad(_ nativeAd: FBNativeAd) { + guard nativeAd === self else { return } success(self) } func nativeAd(_ nativeAd: FBNativeAd, didFailWithError error: Error) { + guard nativeAd === self else { return } // https://developers.facebook.com/docs/audience-network/testing var params: [String: Any] = [kStatBanner : nativeAd.placementID, kStatProvider : kStatFacebook] @@ -128,5 +132,10 @@ extension FacebookBanner: FBNativeAdDelegate { failure(self.type, event, params, e) } + + func nativeAdDidClick(_ nativeAd: FBNativeAd) { + guard nativeAd === self else { return } + click(self.type) + } } diff --git a/iphone/Maps/Core/Ads/RBBanner.swift b/iphone/Maps/Core/Ads/RBBanner.swift index 5e01d2990a..bdb95c0ee2 100644 --- a/iphone/Maps/Core/Ads/RBBanner.swift +++ b/iphone/Maps/Core/Ads/RBBanner.swift @@ -10,6 +10,7 @@ final class RBBanner: MTRGNativeAd, Banner { fileprivate var success: Banner.Success! fileprivate var failure: Banner.Failure! + fileprivate var click: Banner.Click! fileprivate var requestDate: Date? private var showDate: Date? private var remainingTime = Limits.minTimeOnScreen @@ -76,9 +77,10 @@ final class RBBanner: MTRGNativeAd, Banner { } //MARK: - Banner - func reload(success: @escaping Banner.Success, failure: @escaping Banner.Failure) { + func reload(success: @escaping Banner.Success, failure: @escaping Banner.Failure, click: @escaping Click) { self.success = success self.failure = failure + self.click = click load() requestDate = Date() @@ -123,9 +125,16 @@ extension RBBanner: MTRGNativeAdDelegate { func onNoAd(withReason reason: String!, nativeAd: MTRGNativeAd!) { guard nativeAd === self else { return } - let params: [String: Any] = [kStatBanner : bannerID, kStatProvider : kStatRB] + let params: [String: Any] = [kStatBanner : bannerID, + kStatProvider : kStatRB, + kStatReason : reason] let event = kStatPlacePageBannerError let error = NSError(domain: kMapsmeErrorDomain, code: 1001, userInfo: params) failure(self.type, event, params, error) } + + func onAdClick(with nativeAd: MTRGNativeAd!) { + guard nativeAd === self else { return } + click(self.type) + } }