前言
從蘋果官方微信號微信公共平臺發佈的文章《小程序支持打開移動應用》來看,小程序新增了兩個功能:css
- 支持打開移動應用
- 標題欄區域開放自定義
針對第二個功能,就是開發者能夠自定義小程序菜單欄的顏色風格,根據需求,對小程序菜單外的標題區域進行自定義,好比設置標題區域的顏色。這裏主要介紹一下支持打開移動應用的功能。html
支持打開移動應用
乍一看其實有點標題黨的行爲,支持打開移動應用?
讓我想到的是我能夠用小程序打開任何移動應用?(答案是不能)
那我是否是能夠打開本身的App?(答案是有限制性地打開)
是否是能夠打開系統自帶的瀏覽器?(答案是不能)
是否是能夠打開第三方的移動應用呢?(答案也是不能)objective-c
其實,小程序打開移動應用有一條硬性要求:**從移動應用分享至小程序的頁面,用戶訪問時支持打開來源應用。**接下來進一步解讀一下這條要求。小程序
大部分程序都有微信分享功能,咱們常作的就是將一個圖片、一段文字亦或是一個URL連接進行分享,能夠分享給好友(包括羣)、朋友圈或者是添加到我的收藏,以下:
咱們還能夠分享小程序,如圖:
上面是一個搶票軟件(智行)分享到微信的一個小程序,好友能夠點擊小程序幫忙加速。按照官方文章的說法,分享到微信的小程序裏面若是有一個按鈕,實現以下:微信小程序
<button open-type="launchApp" app-parameter="wechat" binderror="launchAppError">打開APP</button>
那麼當點擊此按鈕時,就會打開源App。在其餘狀況下是沒法打開的,這裏給出了一張可否打開移動APP的圖解:
這裏小程序給出一個場景值概念,只有場景值爲1036(還有個狀態值true或false,它決定是否可以打開APP。場景值爲1036,狀態值爲true)的小程序,纔可以打開源APP,即小程序不能打開任何App,只能跳回分享小程序卡片的APP。官方文檔也對這個標識作了解釋:api
在小程序的生命週期內,這個狀態的初始值爲 false,以後會隨着小程序的每次打開(不管是啓動仍是切到前臺)而改變:
1.當小程序從 1036(App 分享消息卡片) 打開時,該狀態置爲 true。
2.當小程序從 1089(微信聊天主界面下拉)或 1090(長按小程序右上角菜單喚出最近使用歷史)的場景打開時,該狀態不變,即保持上一次打開小程序時該狀態的值。
3.當小程序從非 1036/1089/1090 的場景打開,該狀態置爲 false。瀏覽器
針對第二條,1089和1090那個,個人理解是小程序相似於移動APP,它並無關閉,而是在後臺,因此1089和1090打開小程序只是把小程序喚到前臺,因此小程序狀態不變。狀態若是爲true,也能夠打開移動APP。 以上即是對小程序打開移動應用的介紹,接下來看一下具體代碼實現。微信
代碼實現分享小程序打開移動應用(iOS版本,Android相似)
首先要作的就是新建一個工程,而後集成微信分享,具體如何集成能夠參見官網集成文檔,集成以後,在頁面添加一個按鈕,觸發實現以下:app
- (IBAction)openSmallProgramAction:(id)sender { //分享小程序的實現 WXMiniProgramObject *wxMiniObject = [WXMiniProgramObject object]; wxMiniObject.userName = @"gh_*************"; wxMiniObject.path = @"pages/index/index"; // WXMediaMessage *message = [WXMediaMessage message]; message.title = @"我是小程序"; message.description = @"我是用來測試打開App的小程序"; message.mediaObject = wxMiniObject; SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; req.message = message; req.scene = WXSceneSession; [WXApi sendReq:req]; //原來作分享的實現 // SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; // req.text = @"分享的內容"; // req.bText = YES; // req.scene = WXSceneSession; // [WXApi sendReq:req]; }
這裏是全部的App均可以用上面的實現方式分享小程序麼嗎?答案是否認的。看官方文檔的說法:微信公衆平臺
移動應用分享功能支持小程序類型分享,要求發起分享的APP與小程序屬於同一微信開放平臺賬號。支持分享小程序類型消息至好友會話,不支持「分享至朋友圈」及「收藏」。
也就是說小程序分享是有限制的:
- 發起分享的App與小程序屬於同一微信開放平臺帳號
- 只支持分享小程序類型消息至好友會話(SendMessageToWXReq的scence只支持WXSceneSession)
通過測試,一個帳號不能同時註冊微信開放平臺和微信公衆平臺。也就是說:若是你的帳號註冊了微信開放平臺,那麼該帳號就不能再次註冊微信公衆平臺。
微信開放平臺放的是移動APP。
微信公衆平臺放的是小程序。
那官方所說的屬於同一微信開放平臺帳號就不是一個帳號下既有APP又有小程序(由於小程序是在微信公衆平臺開發的)。打開微信開放平臺頁面以後,第一條就好理解了:
若是你想要在移動APP內分享小程序,你必須在該APP所在的微信開放平臺帳號下綁定微信小程序,這樣才能夠在APP中實現小程序分享。這就是官方所說的APP和小程序屬於同一微信開放平臺帳號。
那麼APP怎麼知道分享哪一個小程序的? 或者說APP是怎麼和小程序關聯的呢?
這就要看上面的那段代碼(前提是你把小程序和APP放到了同一開放平臺帳號下),其中有一行:
wxMiniObject.userName = @"gh_*************";
該userName就是小程序的userName,你能夠登陸微信公衆號平臺|小程序,而後在設置--->基本設置中查看,裏面有個原始id,就是小程序的userName。
這樣你就將APP的分享和小程序關聯起來了。
還有一個問題:分享的小程序如何打開指定的頁面呢?
這就要看另外一行代碼:
wxMiniObject.path = @"pages/index/index";
你須要設置一下小程序的path,這個path的頁面就是你點擊分享的小程序打開的頁面。這裏看一張小程序開發工具的圖:
pages所指的就是頁面,例如上圖的pages文件夾包含了detail和index和logs三個頁面,其中:
index:指代的是信用卡列表頁。
detail:指代的是點擊列表某個item進入的詳情頁。
logs:日誌頁面
因此若是你想跳轉到詳情頁,那麼你在設置wxMiniObject的path時就應該寫成「pages/detail/detail」。這樣就實現了點擊分享的小程序進入指定的頁面了(若是頁面須要參數你也要在分享時傳過去)。
wxml:至關於html
wxss:至關於css
這裏實際上是微信小程序本身定義了後綴。
這個時候你分享的小程序場景值爲1036,且狀態爲true,若是此時你小程序裏面有open-type爲「launchApp」的button,點擊button你就會跳回你的移動APP啦。若是想給APP回傳內容,能夠設置app-parameter。就像這個小按鈕:
<button open-type="launchApp" app-parameter="wechat" binderror="launchAppError">打開APP</button>
到此,我想你應該大概瞭解小程序支持打開移動應用究竟是怎麼回事了。
總結
小程序並非支持打開全部移動APP,就算是同一個微信開放平臺帳號下面的移動APP和小程序,小程序也不必定能夠打開,具體還要看場景。
展望
小程序支持跳轉移動APP是很大的進步,在小程序之後的進一步完善中,它應該會朝着APP直接打開小程序方向邁進,而不只僅是經過分享打開小程序。將來咱們也許會實現點擊移動APP裏面的某個按鈕直接打開某個小程序,而後在小程序操做完成以後再次返回到移動APP。(例如微信支付,能夠從移動APP跳轉到小程序進行微信支付,支付成功後直接返回移動APP)
附參考
1.小程序支持打開移動應用
2.launchApp(OBJECT)