給App的某個(gè)功能添加桌面快捷方式

iOS中給App添加快捷方式的幾種方案:

  1. 3DTouch,長按App喚起3DTouch菜單,這個(gè)同時(shí)也可以當(dāng)做小組件添加到首屏左邊的快捷方式頁面中。
  2. 通過Siri喚醒對應(yīng)的App。
  3. 直接在桌面添加對應(yīng)的快捷方式,點(diǎn)擊快捷方式直接跳到某個(gè)App的某個(gè)功能。

方案1,3DTouch的入口說實(shí)話一般人還是不太容易發(fā)現(xiàn)的。
方案2,跟Siri語音交互個(gè)人覺得有點(diǎn)蠢。
方案3,我覺得最合適了,我們用支付寶刷地鐵或公交就可以通過添加桌面快捷方式,直接跳到支付二維碼。

那么問題來了,支付寶是怎么做到的呢?

其實(shí)是利用了SafariPWA功能,將編碼好的網(wǎng)頁內(nèi)容和圖標(biāo)保存到桌面。點(diǎn)擊桌面快捷方式打開網(wǎng)頁執(zhí)行JS,跳轉(zhuǎn)到App對應(yīng)的功能。

PWA的中文名叫漸進(jìn)式網(wǎng)頁應(yīng)用。它融合了WebApp的一些優(yōu)點(diǎn),可以在原生App的主屏幕上留下圖標(biāo)??梢韵?code>Native App那樣離線使用。

下面是實(shí)現(xiàn)步驟

1. 配置App跳轉(zhuǎn)的URL

XcodeTarget->Info->URL TypesURL 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)到AppH5頁面

1. 引導(dǎo)添加桌面快捷方式的H5頁面

這個(gè)引導(dǎo)頁面支付寶做的不錯(cuò),幾經(jīng)輾轉(zhuǎn),我拿到了這個(gè)頁面,稍微修改了下,界面效果如下圖

addshortcuts.png
2. 跳轉(zhuǎn)到AppH5頁面

這個(gè)頁面是個(gè)空白頁,當(dāng)我們點(diǎn)擊快捷方式的時(shí)候,通過這個(gè)空白頁跳轉(zhuǎn)到App。

<a id="redirect" href="addshortcuts://profile"></a>

打開空白頁,執(zhí)行下面這段JS,模擬點(diǎn)擊上面的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);

其實(shí)引導(dǎo)頁和跳轉(zhuǎn)頁可以放到一起,通過window.navigator.standalone檢測Safari打開的Web應(yīng)用程序是否全屏顯示。如果是全屏顯示表示是從桌面快捷方式進(jìn)入的,那么就顯示空白頁,自動執(zhí)行上面那段JS。如果不是全屏顯示表示是從app跳轉(zhuǎn)過去的引導(dǎo)頁。

3. 搭建可以打開編碼后H5頁面的本地server

1. h5編碼

Safari可以直接打開一串包含頁面內(nèi)容編碼的URL,這個(gè)URL包含了這個(gè)頁面需要的所有信息。

data:text/html;base64,PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0RhcmllbENoZW4vaU9TVGlwcyI+aU9TVGlwczwvYT4=

Safari中輸入上面那串URL,會顯示一個(gè)<a >iOSTips</a>的標(biāo)簽。跟正常的標(biāo)簽一樣,這是因?yàn)樯厦娴?code>URL是我們經(jīng)過base64編碼后處理的。同樣我們可以把h5頁面轉(zhuǎn)化成這種URL編碼格式。

2. 搭建本地server

iOS中不能用UIApplication.shared.open(url)的方式打開包含Base64編碼的URL,如果我們用SFSafariViewController,它也是不能夠識別這個(gè)格式的URL。這個(gè)問題好像是出在蘋果那邊。

那支付寶是怎么做的呢?它是直接把這個(gè)頁面部署到了服務(wù)端,我們可以參考這種方法,用Swifter搭建一個(gè)本地的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é)

整個(gè)操作流程如下圖所示。

這種方式有個(gè)問題,多次添加桌面快捷方式會出現(xiàn)多個(gè)相同的圖標(biāo),有解決方法的同學(xué)歡迎留言。

具體實(shí)現(xiàn) 猛擊

更多內(nèi)容歡迎關(guān)注iOSTips
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容