一、场景

App需要接入广告,包括开屏广告和插屏广告。

二、问题出现和分析处理

1、ios 端启动图方式变更以及缓存问题调试

将三方广告的sdk demo 拿过来进行运行, 其pod 文件是屏蔽掉所有依赖的,于是自己打开对应依赖,运行pod install ,发现一直拉不下来, 此时才知道默认的cdn 地址是:https://cdn.jsdelivr.net/cocoa/Specs/

没有类似的阿里镜像源这种国内可以加速的方式。

有说这种方式:

使用 GitHub Specs(本地缓存)

pod repo remove trunk

pod repo add master https://github.com/CocoaPods/Specs.git

Podfile:

source 'https://github.com/CocoaPods/Specs.git'

可以加快,但是自己没试,直接用了代理方式:

临时使用代理

http_proxy=http://127.0.0.1:7890

https_proxy=http://127.0.0.1:7890

pod install
 

Downloading dependencies

Installing Ads-CN (7.3.0.7)

Installing AnyThinkiOS (6.4.96)

Installing BaiduMobAdSDK (5.401)

Installing BeiZiSDK-iOS (4.90.7.8)

Installing DSPSDK (1.0.3.1)

Installing GDTMobSDK (4.15.65)

Installing SigmobAd-iOS (4.20.6)

Installing ZJSDK (2.6.0.3)

Generating Pods project

Integrating client project

Pod installation complete! There are 7 dependencies from the Podfile and 17 total pods installed.

将这些处理完之后,最终成功运行了demo ,将开屏广告展示出来了。

然后将这部分功能接入到自己的App框架中, 功能是可以,但是在发现一个问题,就是在启动图到广告展示window 这个过程中,虽然都是使用的同一个图,但是展示效果确实有差异的,会产生一个跳变的现象,用户体验不好。

问题分析和处理

刚开始使用的是自定义window 方式来作为广告展示VC, 里面是通过imageview 控件来加载app 中的 2x 和 3x 资源,然后启动图里面也是堆满了各种分辨率的启动图,就从分辨率的方向去考量,总以为是两者的分辨率不同造成的,但是调试了很多次,还是没有成功。

期间更换启动图的时候,发现老的图片可以显示,但是换了一套图之后,启动图就变成空白了,没有出来,一路问AI ,最终才之后,现在的启动图加载方式已经变天了,可以不用原先那么多图了,直接通过一张母图就可以适配所有。于是将老的LaunchImage 方式改为了现在流行的 LauchScreen 模式:
 

<key>UILaunchStoryboardName</key>

<string>LaunchScreen.storyboard</string>

通过AI问诊,决定直接使用启动图直接作为广告占位VC 来处理,但是这样调试也还是有问题:

        UIStoryboard *sb = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];

        UIViewController *launchVC = [sb instantiateInitialViewController];

        self.window.rootViewController = launchVC;

        [self.window makeKeyAndVisible];

总会有一种启动图和广告占位图用的不是同一个图片的感觉,因为自己的2x 和 3x 里面都有放置图片,两个分辨率不同,其实这个时候自己的思维还是没有完全转变过来,还是用老的各个机型分辨率的思维在分析和处理这个问题。然后提供给AI 的调试结果也还是往这条老路上面走,然后再一次偶然的调试上,我将2x和3x 的图片都换成了同一张图片,然后再手机上运行了一次,莫名奇妙地就好了,通过这个入口,自己又开始了反复调试,最终在多次和AI 沟通之后,只需要再2x 中放置一个对应分辨率的图片就可以了。

本以为问题已经告一段落,但是过了个周末回来后,再次将Xcode 运行时,发现有一台手机上面的启动图还是会有跳变,经过反反复复调试,才知道是缓存的问题,因为更换了应用包名之后就正常了。

2、iOS 端 wkwebview 代理冲突

在接入插屏广告时,三方提供了js ,支持混合开发方式,于是按照其文档接入,将自己的wkwebview 传入注册给三方sdk,  加载其demo url 正常,当换到自己的前端地址时,直接报错挂死:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Completion handler passed to -[ZJJSBridgeAdPlugin webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:] was not called'

刚开始以为是要引入对方的js, 但是多次尝试无果。后面通过各种对比调试,还是要回归报错日志。原来是这边的wkwebview 集成了开源框架https://github.com/wendux/DSBridge-IOS, 通过dsbridge通信,三方那边也有自己的通信机制,两边都设置了 WKUIDelegate ,这边前端地址只要引用了dsbridge ,就会出现冲突问题。

3、Android 端广告单独库模块

由于三方广告集成中还需要修改Androdmanifest.xml 文件,但是这个又想做成配置,于是刚开始想将其单独做一个module, 座位library 使用。 但是三方提供的是aar库文件,使用工具打包就会报错:

Direct local .aar file dependencies are not supported when building an AAR.

经过一番折腾,最后还是放弃这个思路,将其作为一个单独的adLibs 使用compileOnly 控制apk 大小,同时Androdmanifest.xml 使用flavor 不同渠道打包方式来控制。

三:总结

这次本来以为一个比较简单的功能接入集成,结果花费了远超乎之前预估的时间。感觉还是技术思维层面的问题,有些老的技术实现方式早已经更新了,自己还没有使用,在调试问题时,还在老的思维模式中琢磨,例如ios那个启动图到广告跳变的问题,在老的思维模式中调试了好久。当然启动图的缓存问题这个是很难避坑的,如果没有AI 的确认,估计自己还会花更多时间。有时候碰到一些匪夷所思,怀疑人生的问题时,可能真的要放一放,等过一阵子突然换种模式调试发现会找到突破口,事后会觉得自己之前浪费的时间真是可惜,但是凡是都有个过程,不能因为吃完第三个包子饱了,就觉得前面两个包子没用。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐