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

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

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

方案1,3DTouch的入口不太容易發(fā)現(xiàn),方案2,是跟Siri做的語(yǔ)音交互,下面重點(diǎn)說(shuō)下方案三。

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

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

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

在Xcode的Target->Info->URL Types的URL Schemes添加addshortcuts,作為跳轉(zhuǎn)url的協(xié)議頭。

我們給app中需要添加快捷方式的功能頁(yè)設(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對(duì)應(yīng)的功能頁(yè)面表示一切正常。

2. 設(shè)置添加快捷方式到桌面的引導(dǎo)H5頁(yè)面和跳轉(zhuǎn)到App的H5頁(yè)面

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

2. 跳轉(zhuǎn)到App的H5頁(yè)面

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

<a?id=”redirect”?href=”addshortcuts: profile”=””></a>

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

3. 搭建可以打開(kāi)編碼后H5頁(yè)面的本地server

1. h5編碼

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

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

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

2. 搭建本地server

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

那支付寶是怎么做的呢?它是直接把這個(gè)頁(yè)面部署到了服務(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)