首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS谷歌广告降低了应用程序的性能

iOS谷歌广告降低了应用程序的性能
EN

Stack Overflow用户
提问于 2022-05-16 16:22:56
回答 1查看 145关注 0票数 5

我们效仿谷歌在TableView中的广告:

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

将谷歌广告整合到iOS项目中。当我们使用演示广告单元id(/6499/例/横幅)时,一切都很好。

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

广告显示在集合视图中。我们用Google的例子来缓存广告

代码语言:javascript
运行
复制
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)
     }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-31 10:30:44

滚动时缓存广告,意味着在滚动的同时不断增加应用程序的内存占用。

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

缓存应该如下所示,请按照google的演示(您不必使用标记,只需将视图缓存在字典中):

代码语言:javascript
运行
复制
let cache = [AdvertismentA, AdvertismentB, AdvertismentC, AdvertismentD, AdvertismentE]

var hasLoaded: [GADBannerView: Bool]

注意:collectionView手机不应该打网络电话,因为你会被谷歌禁止。

如果用户从AdvertisementE 进一步滚动,请不要使用

overloading)

  • 再次加载带有不同标记的广告(API垃圾邮件)
  • 缓存(内存
  • )

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72262463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档