React Native之配置URL Scheme(iOS Android)
一,需求分析
1.1,需要在網站中打開/喚起app,或其他app中打開app,則需要設置URL Scheme。比如微信的是:weixin://
二,URL Scheme介紹
2.1,URL Scheme是什么?
URL Scheme是一種頁面內跳轉協議,是一種非常好的實現機制,通過定義自己的scheme協議,可以非常方便跳轉app中的各個頁面;通過scheme協議,服務器可以定制化告訴App跳轉那個頁面,可以通過通知欄消息定制化跳轉頁面,可以通過H5頁面跳轉頁面等。
蘋果手機中的APP都有一個沙盒,APP就是一個信息孤島,相互是不可以進行通信的。但是iOS的APP可以注冊自己的URL Scheme,URL Scheme是為方便app之間互相調用而設計的。
URL Scheme必須能唯一標識一個APP,如果你設置的URL Scheme與別的APP的URL Scheme沖突時,你的APP不一定會被啟動起來。因為當你的APP在安裝的時候,系統里面已經注冊了你的URL Scheme。
2.2,URL Scheme應用場景
客戶端應用可以向操作系統注冊一個 URL scheme,該 scheme 用於從瀏覽器或其他應用中啟動本應用。通過指定的 URL 字段,可以讓應用在被調起后直接打開某些特定頁面,比如商品詳情頁、活動詳情頁等等。也可以執行某些指定動作,如完成支付等。也可以在應用內通過 html 頁來直接調用顯示 app 內的某個頁面。綜上URL Scheme使用場景大致分以下幾種:
- 服務器下發跳轉路徑,客戶端根據服務器下發跳轉路徑跳轉相應的頁面
- H5頁面點擊錨點,根據錨點具體跳轉路徑APP端跳轉具體的頁面
- APP端收到服務器端下發的PUSH通知欄消息,根據消息的點擊跳轉路徑跳轉相關頁面
- APP根據URL跳轉到另外一個APP指定頁面
2.3,URL Scheme的協議格式
完整的URL Scheme協議格式:
1 opengs://tasks:8088/tasksDetail?tasksId=102
通過上面的路徑 Scheme、Host、port、path、query全部包含,基本上平時使用路徑就是這樣子的。
- opengs代表該Scheme 協議名稱
- tasks代表Scheme作用於哪個地址域
- tasksDetail代表Scheme指定的頁面
- tasksId代表傳遞的參數
- 8088代表該路徑的端口號
三,URL Scheme配置
3.1,Android配置
URL Scheme的使用要先在AndroidManifest.xml中配置能接受Scheme方式啟動的activity:
1 <activity 2 3 ... 4 5 <!--要想在別的App上能成功調起App,必須添加intent過濾器--> 6 <intent-filter> 7 <!--協議部分,隨便設置--> 8 <data 9 android:host="tasks" 10 android:path="/tasksDetails" 11 android:port="8080"//可以不要 12 android:scheme="opengs"/> 13 <!--下面這幾行也必須得設置--> 14 <category android:name="android.intent.category.DEFAULT"/> 15 <action android:name="android.intent.action.VIEW"/> 16 <category android:name="android.intent.category.BROWSABLE"/> 17 </intent-filter> 18 </activity>
需要配置能被js調起,一定要配置下面這句
1 <category android:name="android.intent.category.BROWSABLE"/>
1 <!--必有項--> 2 <action android:name="android.intent.action.VIEW" /> 3 <!--表示該頁面可以被隱式調用,必須加上該項--> 4 <category android:name="android.intent.category.DEFAULT" /> 5 <!--如果希望該應用可以通過瀏覽器的連接啟動,則添加該項--> 6 <category android:name="android.intent.category.BROWSABLE" />
3.2,iOS配置
注冊URL Scheme,即配置info.plist 文件即可
直接調用URL Scheme也可打開程序, URL identifier是可選的。
四,調用方式
4.1,web端調用
1 <a href="opengs://" onclick="openAppisLink()">打開APP ></a>
如果在2s還沒打開app,則跳轉到下載頁面
1 var appstore, ua = navigator.userAgent; 2 if (ua.match(/Android/i)) { 3 appstore = 'http://www.yingqigroup.top'; 4 } 5 if (ua.match(/iphone|ipod|ipad/)) { 6 appstore = 'http://www.yingqigroup.top'; 7 } 8 function openAppisLink() { 9 var clickedAt = +new Date; 10 // During tests on 3g/3gs this timeout fires immediately if less than 500ms. 11 setTimeout(function () { 12 // To avoid failing on return to MobileSafari, ensure freshness! 13 if ((+new Date - clickedAt) < 12000) { 14 window.location.href = appstore; 15 } 16 }, 3000); 17 }
4.2,app端調用(原生)
android
1 Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("opengs://")); 2 startActivity(intent);
ios
1 NSString *url = @"opengs://"; 2 // NSString *url = @"opengs://com.opengs.www"; 3 if ([[UIApplication sharedApplication] 4 canOpenURL:[NSURL URLWithString:url]]) 5 { 6 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]]; 7 } 8 else 9 { 10 NSLog(@"can not open URL scheme opengs"); 11 }