目錄
我們經常看到,在手機上不需要退到桌面,APP之間就可以相互切換,並且可以傳遞數據。比如我在使用知乎APP的時候,需要使用新浪微博賬號登錄,點擊“微博登錄”后,系統自動喚醒新浪微博APP,並將知乎請求登錄的數據傳給了微博APP(微博APP界面上可以看到是知乎請求登錄授權),見下圖:
如上所示,依次點擊“微博登錄”、“確定”,手機界面自動來回切換,不需要人為干預。另外,如果我們在知乎看到一篇有意思的文章,需要分享給好友(會發送到朋友圈)時,我們可以點擊“分享”菜單中的“發送給QQ好友”,那么系統自動喚醒QQ APP,並將要分享的鏈接(標題)數據傳給了QQ APP,見下圖:
如上圖,依次點擊“分享-QQ”、“發送/或取消”,手機界面可以自動來回切換,不需要人為干預。
那么,手機中怎樣做到APP之間的相互喚醒,並且能夠傳遞數據的呢?上面舉得例子都是android里面的APP,接下來給大家分析一下UWP應用怎樣喚醒另外一個UWP應用並且給它傳遞數據。
注意這里“喚醒”的意思,是指打開另外一個APP的界面,不管該APP是否曾經打開過。APP之前的狀態可以是Stopped、也可以是Suspended。
在UWP中,一個APP喚醒另外一個APP有兩種方式:
- 文件喚醒;
- 協議喚醒。
前者很好理解,跟傳統桌面軟件類似,將APP與某一類文件進行關聯,之后我只要打開該類文件,那么與之關聯的APP就可以自動喚醒,並且可以將文件路徑傳遞給喚醒的APP,之后APP便可以讀取文件中的內容。
后面的一種其實我們也見過,比如我們在程序中碰到“HTTP://”開頭的文本字符串時,通常直接可以打開與之關聯的程序(瀏覽器),這里的“協議喚醒”大概也是這個意思,只是這里的協議可以自定義,比如我可以將我的APP與“MYAPP://”這樣的協議關聯上,之后碰到所有的“MyAPP://”開頭的協議類型時,系統都會自動打開我的APP,注意協議頭后面可以接一些參數,這個跟http中get方式類似。
Windows 10系統中存在一些預定義的協議,這些協議已經關聯上了一些APP:
- ms-windows-store:// (打開windows 應用商店APP)
- ms-settings://(打開系統中設置 APP)
- mailto://(打開默認郵件 APP)
- 還有好多
比如我要打開 Windows應用商店APP,並且查找所有“周見智”發布的APP時,可以使用下面的方式:
Uri uri = new Uri("ms-windows-store://publisher/?name=周見智");
var success = await Windows.System.Launcher.LaunchUriAsync(uri); //協議啟動對應APP
系統自動打開Windows 應用商店APP,並且APP能跳到“周見智”發布APP的結果頁面。這個原理很好理解,APP接收到協議字符串后,會分析之中的參數(比如publisher、周見智等),然后執行一些命令(比如查找、跳轉頁面等)。
詳細請訪問:https://msdn.microsoft.com/en-us/library/windows/apps/mt228340.aspx?f=255&MSPPError=-2147217396
下面我以UWP版微信為例,講一下自己開發的APP怎樣與微信APP交換數據(自動喚醒)。假設現在我開發了一款APP,當在APP中看到一篇好的文章時,我需要有一個功能,那就是分享到微信朋友圈、或者微信好友。
如上圖所示,一個分享過程包含兩次界面切換。My APP->微信APP、微信APP->My APP,同時包含兩次數據交換:
- My APP將數據傳給微信APP(比如要分享的鏈接、標題、縮略圖等);
- 微信APP將結果傳給My APP,My APP根據結果顯示“分享成功/分享失敗”。
那么這里就有一個疑問了,靠什么傳遞數據呢?其實根據上面喚醒APP方式的說明,我們不難看出,完全可以使用協議字符串或者文件傳遞數據。沒錯,UWP版微信APP就是通過文件和其他APP進行數據傳遞的。默認情況下,微信APP與.wechat類型的文件進行關聯,當我們需要給微信APP傳遞數據時,只需要往一個.wechat類型的文件中寫入數據,然后將其打開即可,這樣微信APP就可以被喚醒並且讀取文件中的數據。反過來,微信APP如果要給我們的APP傳遞數據,它也會向一個文件中寫入數據(至於這個文件的類型需要你開發的時候指定)。
傳遞數據的介質我們知道怎么搞了,那數據傳遞的格式是怎樣的呢?微信開放平台提供了WP版的開發SDK,使用該SDK開發與微信交互的APP時,不用關心具體傳遞數據的格式,只需要調用相關API接口寫入即可:
下面看我完成分享的功能(知乎日報UWP版中的一個分享功能,具體可以參考 ):
如上圖,知乎日報UWP版現將數據傳遞給微信APP,微信收到數據后,直接轉到分享界面,分享完成后(成功),自動切換到知乎日報UWP版界面,然后給出提示。最后一張是我朋友圈的效果,分享給好友的原理類似。界面在兩個APP之間自動來回切換。以下是分享網頁給微信好友的代碼:
注意:我目前的APP並沒有在微信開發平台上創建應用並通過審核,所以微信APP上顯示“未審核的應用”。這個不影響使用,因為分享的過程並不要求登錄授權,畢竟最終的分享決定權還在微信界面上。
具體的代碼會在整個知乎日報UWP版完成之后上傳到github,有興趣的童鞋可以關注一下本博客,到時候下下去看一下。另外,為了驗證,我的APP是通過.wechat類型的文件喚醒微信APP的,我在自己電腦上做了一個測試,由於電腦沒有安裝微信,當我點擊“分享到微信好友”時,奇跡發生了:
如上。當電腦上沒有APP與.wechat文件關聯時,會出現這種情況,是不是很熟悉?
APP之間交互是兩個人的事情,單方面是不可能單獨完成的,傳遞數據需要雙方同時遵循一套規范(協議),不然你說我不懂,我說你不懂。所以,在開發一款要與其他APP進行交互的APP時,必須使用其他APP的SDK,這樣發送的數據別人才能理解。另外,其他APP收到數據后要知道該怎樣去處理,所以總的來說,兩個APP之間必須是你情我願的。
再次說一下,源碼稍后不久會上傳,感興趣的可以關注本博客,謝謝。多謝點贊。
注意單純的交互數據是不需要其他APP登錄授權的,所以不要跟OAuth授權搞混淆了。如果APP之間可以交互,那么Oauth授權就可以很簡單,直接找安裝在本地的APP就行,比如微博APP,它授權完成后會告訴你對應的AccessToken。