APP启动广告功能实现要从2个方面思考
一是UI方案,怎样处理广告页与主页之间的切换方式。
二是广告页展示时机,是使用后台实时广告数据还是使用本地缓存广告数据。后台数据方式获取广告最新但是用户要等待后台返回数据后才能展示,增加用户等待时间。使用本地缓存启动速度快但数据更新不及时。
 
UI方案实现
双Window方案
广告window在上面,主页window在下面,双方通过调用window.makeKeyAndVisible+UIView动画,切换显示。
// 多window实现,同时存在2个window,1个在下面,1个在上面, 通过调用makeKeyAndVisible()让一个window称为要展示的那个
self.window = UIWindow(frame: UIScreen.main.bounds)
let nav = UINavigationController(rootViewController: TabViewController())
window?.rootViewController = nav
window?.makeKeyAndVisible() self.adWindow = UIWindow(frame: UIScreen.main.bounds)
let adVC = adViewViewController()
let nav = UINavigationController(rootViewController: adVC)
adWindow?.rootViewController = nav
adWindow?.makeKeyAndVisible()
单Window方案
window.rootVC = 广告VC
window.rootVC = 主页VC
双方通过UIView.transition转场动画,切换显示。 UIView.transition(with: appDelegate.window!, duration: 0.5, options: .transitionCrossDissolve) {
appDelegate.window?.rootViewController = appDelegate.rootNavController!
} completion: { _ in
// do something
}
数据存储方案
首次启动时,不展示广告页,进入首页时下载广告数据到本地保存。
后面启动时,先读取本地广告数据,进入广告页展示。广告页展示完后进入主页,然后再次去后台下载新的广告数据覆盖本地就的广告数据。
 
APP唤端调用
当被别的APP通过广告或者其他方式调起时,如何处理?
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can't open for some reason
iOS前后提供了3个系统代理方法来接受唤端调用,而根据现在APP对iOS系统版本支持的情况来说,使用最新的,支持iOS9以上应该满足大部分场景了。上面2个方法在iOS9以上的系统是不调用的。
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0)

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
  self.openUrl(url)
  return true
}
URL Scheme是为方便app之间互相调用而设计的, 就像www.baidu.com这个URL可以唯一定义一台主机, iOS系统中的weibo://这个URL Scheme可以唯一标识一个APP。
这样当通过调用系统的openUrl方式打开其他APP时,系统就可以通过url scheme锁定住哪一个APP,进而打开它。并且可以通过这种方式传递一些参数。
当安装一个APP时,就会向系统中注册一个URL Scheme, 那么如果系统中出现了多个重复的URL Scheme,系统该如何调用的,调用的优先级是系统>先安装的>后安装的。
URL Schemes 解释
平常说的URL是指的网站地址,如:http://www.apple.com
Schemes,表示的是一个 URL 中的一个位置——最初始的位置,即 ://之前的那段字符 http。
 
注册 URLScheme
可以给自己的APP注册URLScheme,这样外界就可以利用注册的URLScheme打开自己的APP了
在Target->Info->URL Types下点击“+”号,为APP定义一个Scheme, 当然也可以定义多个。
注册如下:

用safari在地址栏输入xyz://123就可以打开自己的APP了
其中123为想APP传参的参数。
 
白名单问题
由于iOS9对http的限制,APP需要在info.plist中添加要使用到的Url scheme到白名单中,这样才能使用系统检测是否安装了这些APP,进而打开这些APP。
在“Info.plist”中搜索,添加key:Queried URL Schemes,然后将要使用的URL Schemes列为白名单,这样就可正常检查白名单中的应用是否安装了。
白名单添加如下:

<key>LSApplicationQueriesSchemes</key>
<array>
<!-- 微信 URL Scheme 白名单-->
<string>wechat</string>
<string>weixin</string> <!-- 新浪微博 URL Scheme 白名单-->
<string>sinaweibohd</string>
<string>sinaweibo</string>
</array>
 
参考文章:
https://juejin.cn/post/6939922873591005221
https://blog.csdn.net/shimazhuge/article/details/79450412
 
 

iOS APP启动广告实现方式 与 APP唤端调用的更多相关文章

  1. iOS- 解决iOS10 App启动时放大铺满App Icon的问题

    0.前言 iOS10 App启动时放大铺满App图标 iPad Application shows app icon as launch screen in iOS 10 如图,点击APP后APP图标 ...

  2. 分分钟解决iOS开发中App启动广告的功能

    前不久有朋友需要一个启动广告的功能,我说网上有挺多的,他说,看的不是很理想.想让我写一个,于是乎,抽空写了一个,代码通俗易懂,简单的封装了一下,各种事件用block回调的,有俩种样式的广告,一种是全屏 ...

  3. App启动广告

    需求: App启动的时候获得广告图片链接,如果已经存在,判断是否和本地的相同,不相同才去下载到本地. 流程图: 这些都在广告页的前一个页面操作(logo页或者Application) import a ...

  4. Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

    1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation. ...

  5. Android app启动耗时分析

    前言 app启动耗时过长的话,无论你的app里面的内容多么丰富有趣,作为一个用户,首先是没有耐心去等待的,如果我是一个用户,我会这样想:这是什么垃圾公司出的什么烂app,再等2s不进来就卸载,黑人问号 ...

  6. ios UIApplocation 中APP启动方式

    iOS app启动的方式有哪些: 自己启动(用户手动点击启动) urlscheme启动(关于urlScheme的详解)http://www.cnblogs.com/sunfuyou/p/6183064 ...

  7. 马蜂窝 iOS App 启动治理:回归用户体验

    增长.活跃.留存是移动 App 的常见核心指标,直接反映一款 App 甚至一个互联网公司运行的健康程度和发展动能.启动流程的体验决定了用户的第一印象,在一定程度上影响了用户活跃度和留存率.因此,确保启 ...

  8. iOS开发app启动原理及视图和控制器的函数调用顺序

    main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当于fork+exec+waitpi ...

  9. iOS开发之App启动原理

    iOS程序的启动过程 程序启动的完整过程大致步骤如下: 1.main函数 2.UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的deleg ...

  10. iOS开发(1):设置APP的图标与启动图 | iOS图标的尺寸 | LaunchScreen的使用

    每个APP都应该有自己的图标跟启动图. 这里介绍怎么设置iOS的APP的图标跟启动图. (1)图标 小程的xcode是10.0版本,设置图标的入口如下: 点击入口后,进到设置页面,如下: 可以看到有很 ...

随机推荐

  1. bash transpose csv

    transpose() { awk ' BEGIN { FS = ","; OFS = ","; } { if (max_nf<NF) max_nf=NF ...

  2. Docker基本概念及命令

    1.Docker三个重要概念:仓库(Repository).镜像(image)和容器(Container) Docker基本用法: docker  命令关键字(COMMAND) 一系列的参数 dock ...

  3. 【StoneDB 模块介绍】服务器模块

    [StoneDB 模块介绍]服务器模块 一.介绍 客户端程序和服务器程序本质上都是计算机上的一个进程,客户端进程向服务器进程发送请求的过程本质上是一种进程间通信的过程,StoneDB 数据库服务程序作 ...

  4. Springboot ehcache/redis双缓存问题

    问题1:两个CacheManager 会报两个相同的实现类错误需要继承CachingConfigurerSupport 重写cacheManager方法,指定默认一个返回缓存提供者 @Configur ...

  5. 201971010110-高杨 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告

    项目内容 项目 内容 班级博客链接 https://edu.cnblogs.com/campus/xbsf/2019nwnucs 作业要求 https://edu.cnblogs.com/campus ...

  6. 《MySQL是怎样运行的》第四章小结

  7. 字符集编码cp936、ANSI、UNICODE、UTF-8、GB2312、GBK、GB18030、DBCS、UCS

    一直对字符的各种编码方式懵懵懂懂,什么ANSI.UNICODE.UTF-8.GB2312.GBK.DBCS.UCS--是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们.Let's go!  ...

  8. 【LeetCode回溯算法#07】子集问题I+II,巩固解题模板并详解回溯算法中的去重问题

    子集 力扣题目链接 给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 示例 1: 输入:nums ...

  9. vsftpd2.3.4 后门笑脸漏洞

    漏洞概要 在vsftpd 2.3.4版本中,在登录输入用户名时输入:)类似于笑脸的符号,会导致服务处理开启6200后门端口,直接执行系统命令 漏洞利用 攻击机:kali 2022 msfconsole ...

  10. vue项目如何解决跨域问题

    跨域是什么 跨域本质是浏览器基于同源策略的一种安全手段 同源策略(Sameoriginpolicy),是一种约定,它是浏览器最核心也最基本的安全功能 所谓同源(即指在同一个域)具有以下三个相同点 ​ ...