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