iOS Google Ads 降低应用程序的性能

The*_*ras 5 admob ios swift

我们遵循 Google 在 TableView 中展示广告的示例:

https://github.com/googleads/googleads-mobile-ios-examples/blob/master/Swift/advanced/BannerTableViewExample/BannerTableViewExample/TableViewController.swift

在 iOS 项目上集成 google 广告。当我们使用演示广告单元 id(/6499/example/banner) 时,一切正常。

然而,当我们切换到制作广告时,我们的设备开始过热,并且应用程序明显滞后。

广告显示在集合视图中。我们以与 Google 示例相同的方式缓存广告

class AdvertisementManager{
     static let TAG_A = 1
     static let TAG_B = 2
     static let TAG_C = 3
     static let TAG_D = 4
     static let TAG_E = 5
     static let TAG_F = 6
     // .............
}

struct GoogleAdvertisementMetadata {
    weak var delegate: GADBannerViewDelegate?
    weak var adSizeDelegate: GADAdSizeDelegate?
    weak var rootViewController: UIViewController?
    let validAdSizes: AdSizesOption
    let targetingMetadata: AdTargetingMetadata
}

private func preLoadAdvertisements() {
    let targetingVals = interactor?.getTargetingValues()
    let targetingMetadata = AdTargetingMetadata(targetingValues: targetingVals)
    let googleAdvertisementMetadata = GoogleAdvertisementMetadata(
    delegate: self,
    adSizeDelegate: self,
    rootViewController: attachedView,
    validAdSizes: advertisementSizes,
    targetingMetadata: targetingMetadata)
    googleMetadata = googleAdvertisementMetadata
    cachedAdvertisements.removeAll()
    cachedAdvertisements = 
    advertisementManager.createAdvertismentsForSections(googleAdvertisementMetadata)
}
func createAdvertismentsForSections(_ googleAdvertisementMetadata: GoogleAdvertisementMetadata) -> [String: GAMBannerView] {
      var cachedAdvertisements: [String: GAMBannerView] = [:]
      let adA = AdvertisementConstants.FeedAdvertisementSectionA
      let adB = AdvertisementConstants.FeedAdvertisementSectionB
      let adC = AdvertisementConstants.FeedAdvertisementSectionC
      let adD = AdvertisementConstants.FeedAdvertisementSectionD
      let adE = AdvertisementConstants.FeedAdvertisementSectionE
      cachedAdvertisements[adA + "\(tagA)"] = createAdvertisement(with: adA, tag: tagA, metadata: googleAdvertisementMetadata)
     cachedAdvertisements[adB + "\(tagB)"] = createAdvertisement(with: adB, tag: tagB, metadata: googleAdvertisementMetadata)
     cachedAdvertisements[adC + "\(tagC)"] = createAdvertisement(with: adC, tag: tagC, metadata: googleAdvertisementMetadata)
     cachedAdvertisements[adD + "\(tagD)"] = createAdvertisement(with: adD, tag: tagD, metadata: googleAdvertisementMetadata)
     cachedAdvertisements[adE + "\(tagE)"] = createAdvertisement(with: adE, tag: tagE, metadata: googleAdvertisementMetadata)
     return cachedAdvertisements
}

private func createAdvertisement(with adID: String, tag: Int, metadata: GoogleAdvertisementMetadata) -> GAMBannerView {
   let view = GAMBannerView(adSize: GADAdSizeMediumRectangle)
   view.adUnitID = adID
   view.tag = tag
   view.delegate = metadata.delegate
   view.adSizeDelegate = metadata.adSizeDelegate
   view.rootViewController = metadata.rootViewController
   view.validAdSizes = getAdSizes(sizeOption: metadata.validAdSizes)
   let request = GAMRequest()
request.customTargeting = AdTargetingManager().makeCustomAdTargetingDictionary(metadata: metadata.targetingMetadata)
view.load(request)
  return view
 }

func setupAdvertisements() {
      datasource = datasource.filter({($0 as? AdvertisementCellConfigurator) == nil})
      let adA = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionA, tagCell: AdvertisementManager.TAG_A)
      let adB = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionB, tagCell: AdvertisementManager.TAG_B)
      let adC = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionC, tagCell: AdvertisementManager.TAG_C)
      let adD = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionD, tagCell: AdvertisementManager.TAG_D)
      let adE = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionE, tagCell: AdvertisementManager.TAG_E)
datasource.addAdvertisments(firstAdPosition: 3, frequency: 5, ads: [adA, adB, adC, adD, adE])
      let adCount = datasource.count(where: {$0 is AdvertisementCellConfigurator})
      if adCount > AdvertisementManager.TAG_E {
            datasource = datasource.filter({($0 as? AdvertisementCellConfigurator) == nil})
          var advertisements = [adA, adB, adC, adD, adE]
          for counter in (AdvertisementManager.TAG_E + 1)...adCount {
          let adE = AdvertisementConstants.FeedAdvertisementSectionE
          advertisements.append(AdvertisementModel(adId: adE, tagCell: counter))
          if counter > cachedAdvertisements.count {
             cachedAdvertisements[adE + "\(counter)" ] = advertisementManager.requestRepeatingAdvertisement(with: adE, metadata: googleMetadata)
         }
        }
       datasource.addAdvertisments(firstAdPosition: 3, frequency: 5, ads: advertisements)
     }
}
Run Code Online (Sandbox Code Playgroud)

小智 1

滚动时缓存广告意味着滚动时您会不断增加应用程序的内存占用量。

您应该尝试临时解决方案。尝试仅缓存不同的广告。例如缓存从A到E的广告。那么你应该利用集合视图的重用机制。例如,标记已加载布尔值的广告并防止重新加载广告。

缓存应该如下所示,请仔细关注 google 的演示(您不必使用标签,只需将视图缓存在字典中):

let cache = [AdvertismentA, AdvertismentB, AdvertismentC, AdvertismentD, AdvertismentE]
Run Code Online (Sandbox Code Playgroud)

var hasLoaded: [GADBannerView: Bool]

注意:该collectionView单元不应进行网络调用,因为您将被谷歌禁止。

如果用户从AdvertisementE do not进一步滚动:

  • 再次加载广告(API垃圾邮件)
  • 缓存不同标签相同的广告(内存超载)

只需显示带有广告的重复使用的集合视图单元格即可。