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

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

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

方案1,3DTouch的入口不太容易發現,方案2,是跟Siri做的語音交互,下面重點說下方案三。

方案三是利用了Safari的PWA功能,將編碼好的網頁內容和圖標保存到桌面。點擊桌面快捷方式打開網頁執行JS,跳轉到App對應的功能。

下面是實現步驟

1. 配置App跳轉的URL

在Xcode的Target->Info->URL Types的URL Schemes添加addshortcuts,作為跳轉url的協議頭。

我們給app中需要添加快捷方式的功能頁設置好跳轉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,如果可以跳轉到App對應的功能頁面表示一切正常。

2. 設置添加快捷方式到桌面的引導H5頁面和跳轉到App的H5頁面

1. 引導添加桌面快捷方式的H5頁面

2. 跳轉到App的H5頁面

這個頁面是個空白頁,當我們點擊快捷方式的時候,通過這個空白頁跳轉到App。

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

打開空白頁,執行下面這段JS,模擬點擊上面的a標簽

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);

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

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

1. h5編碼

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

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

在Safari中輸入上面那串URL,會顯示一個iOSTips的標簽。跟正常的標簽一樣,這是因為上面的URL是我們經過base64編碼后處理的。同樣我們可以把h5頁面轉化成這種URL編碼格式。

2. 搭建本地server

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

那支付寶是怎么做的呢?它是直接把這個頁面部署到了服務端,我們可以參考這種方法,用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)