給App的某個功能添加桌面快捷方式

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

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

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

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

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

PWA的中文名叫漸進式網(wǎng)頁應(yīng)用处渣。它融合了WebApp的一些優(yōu)點,可以在原生App的主屏幕上留下圖標(biāo)而咆』舯龋可以像Native App那樣離線使用。

下面是實現(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頁面

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

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

這個頁面是個空白頁,當(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) 猛擊

更多內(nèi)容歡迎關(guān)注iOSTips
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锐想,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乍狐,更是在濱河造成了極大的恐慌赠摇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異藕帜,居然都是意外死亡烫罩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門洽故,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贝攒,“玉大人,你說我怎么就攤上這事时甚“祝” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵荒适,是天一觀的道長长捧。 經(jīng)常有香客問我,道長吻贿,這世上最難降的妖魔是什么串结? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任尺锚,我火速辦了婚禮英上,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眉撵。我一直安慰自己帐要,他們只是感情好把敞,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榨惠,像睡著了一般奋早。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赠橙,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天耽装,我揣著相機與錄音,去河邊找鬼期揪。 笑死掉奄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凤薛。 我是一名探鬼主播姓建,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缤苫!你這毒婦竟也來了速兔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤活玲,失蹤者是張志新(化名)和其女友劉穎涣狗,沒想到半個月后谍婉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡屑柔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年屡萤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掸宛。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡死陆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唧瘾,到底是詐尸還是另有隱情措译,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布饰序,位于F島的核電站领虹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏求豫。R本人自食惡果不足惜塌衰,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝠嘉。 院中可真熱鬧最疆,春花似錦、人聲如沸蚤告。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杜恰。三九已至获诈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間心褐,已是汗流浹背舔涎。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留檬寂,地道東北人终抽。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像桶至,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匾旭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359