iOS中給App添加快捷方式的幾種方案:
- 3DTouch柬姚,長按App喚起3DTouch菜單,這個同時也可以當(dāng)做小組件添加到首屏左邊的快捷方式頁面中蝇率。
- 通過Siri喚醒對應(yīng)的App。
- 直接在桌面添加對應(yīng)的快捷方式,點擊快捷方式直接跳到某個App的某個功能恼布。
方案1,3DTouch的入口說實話一般人還是不太容易發(fā)現(xiàn)的搁宾。
方案2折汞,跟Siri語音交互個人覺得有點蠢。
方案3盖腿,我覺得最合適了爽待,我們用支付寶刷地鐵或公交就可以通過添加桌面快捷方式,直接跳到支付二維碼翩腐。
那么問題來了鸟款,支付寶是怎么做到的呢?
其實是利用了Safari
的PWA
功能茂卦,將編碼好的網(wǎng)頁內(nèi)容和圖標(biāo)保存到桌面何什。點擊桌面快捷方式打開網(wǎng)頁執(zhí)行JS,跳轉(zhuǎn)到App對應(yīng)的功能等龙。
PWA的中文名叫漸進式網(wǎng)頁應(yīng)用处渣。它融合了
Web
和App
的一些優(yōu)點,可以在原生App的主屏幕上留下圖標(biāo)而咆』舯龋可以像Native App
那樣離線使用。
下面是實現(xiàn)步驟
1. 配置App
跳轉(zhuǎn)的URL
在Xcode
的Target
->Info
->URL Types
的URL Schemes
添加addshortcuts
暴备,作為跳轉(zhuǎn)url
的協(xié)議頭悠瞬。
我們給app
中需要添加快捷方式的功能頁設(shè)置好跳轉(zhuǎn)url
:addshortcuts://profile
。并在AppDelegate
中添加如下代碼
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
let featureVc = storyboard.instantiateViewController(withIdentifier: "FeatureViewController")
if let navController = window?.rootViewController as? UINavigationController, let topController = navController.topViewController{
if topController.isKind(of: FeatureViewController.self) {
return true
}
if url.absoluteString == "addshortcuts://profile" {
navController.pushViewController(featureVc, animated: false)
}
}
return true
}
到這里我們可以在瀏覽器中輸入addshortcuts://profile
,如果可以跳轉(zhuǎn)到App
對應(yīng)的功能頁面表示一切正常浅妆。
2. 設(shè)置添加快捷方式到桌面的引導(dǎo)H5
頁面和跳轉(zhuǎn)到App
的H5
頁面
1. 引導(dǎo)添加桌面快捷方式的H5
頁面
這個引導(dǎo)頁面支付寶做的不錯望迎,幾經(jīng)輾轉(zhuǎn),我拿到了這個頁面凌外,稍微修改了下辩尊,界面效果如下圖
2. 跳轉(zhuǎn)到App
的H5
頁面
這個頁面是個空白頁,當(dāng)我們點擊快捷方式的時候康辑,通過這個空白頁跳轉(zhuǎn)到App
摄欲。
<a id="redirect" href="addshortcuts://profile"></a>
打開空白頁,執(zhí)行下面這段JS疮薇,模擬點擊上面的a標(biāo)簽
var element = document.getElementById('redirect');
var event = document.createEvent('MouseEvents');
event.initEvent('click', true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
document.body.style.backgroundColor = '#FFFFFF';
setTimeout(function() { element.dispatchEvent(event); }, 25);
其實引導(dǎo)頁和跳轉(zhuǎn)頁可以放到一起胸墙,通過window.navigator.standalone
檢測Safari
打開的Web應(yīng)用程序是否全屏顯示。如果是全屏顯示表示是從桌面快捷方式進入的按咒,那么就顯示空白頁迟隅,自動執(zhí)行上面那段JS。如果不是全屏顯示表示是從app
跳轉(zhuǎn)過去的引導(dǎo)頁励七。
3. 搭建可以打開編碼后H5
頁面的本地server
1. h5
編碼
Safari
可以直接打開一串包含頁面內(nèi)容編碼的URL智袭,這個URL
包含了這個頁面需要的所有信息。
data:text/html;base64,PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0RhcmllbENoZW4vaU9TVGlwcyI+aU9TVGlwczwvYT4=
在Safari
中輸入上面那串URL
,會顯示一個<a >iOSTips</a>
的標(biāo)簽掠抬。跟正常的標(biāo)簽一樣吼野,這是因為上面的URL
是我們經(jīng)過base64
編碼后處理的。同樣我們可以把h5
頁面轉(zhuǎn)化成這種URL
編碼格式剿另。
2. 搭建本地server
iOS中不能用UIApplication.shared.open(url)
的方式打開包含Base64
編碼的URL
箫锤,如果我們用SFSafariViewController
,它也是不能夠識別這個格式的URL
。這個問題好像是出在蘋果那邊雨女。
那支付寶是怎么做的呢?它是直接把這個頁面部署到了服務(wù)端阳准,我們可以參考這種方法氛堕,用Swifter
搭建一個本地的server
。
guard let deeplink = URL(string: "addshortcuts://profile") else {
return
}
guard let shortcutUrl = URL(string: "http://localhost:8244/s") else {
return
}
guard let iconData = UIImage(named: "feature_icon")?.jpegData(compressionQuality: 0.5) else {
return
}
let html = htmlFor(title: "功能快捷方式", urlToRedirect: deeplink.absoluteString, icon: iconData.base64EncodedString())
guard let base64 = html.data(using: .utf8)?.base64EncodedString() else {
return
}
server["/s"] = { request in
return .movedPermanently("data:text/html;base64,\(base64)")
}
try? server.start(8244)
4. 總結(jié)
整個操作流程如下圖所示野蝇。
這種方式有個問題讼稚,多次添加桌面快捷方式會出現(xiàn)多個相同的圖標(biāo),有解決方法的同學(xué)歡迎留言绕沈。
具體實現(xiàn) 猛擊