您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

android,ios配置scheme,react-native获取url

时间:2023-03-06 13:08:30  来源:CSDN  作者:

scheme协议定义

scheme 是一种页面之间跳转的协议,不仅可以用于App之间进行跳转,还可以用于 H5 页面跳转到app页面。
通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
无论Android还是IOS,都可以通过在H5页面中打开 scheme 协议的地址,从而打开本地app。

  • 苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的。
    注意:
    URL Scheme必须能唯一标识一个APP,如果你设置的URL Scheme与别的APP的URL Scheme冲突时,你的APP不一定会被启动起来。因为当你的APP在安装的时候,系统里面已经注册了你的URL Scheme。

URL Scheme应用场景:

客户端应用可以向操作系统注册一个 URL scheme,该 scheme 用于从浏览器或其他应用中启动本应用。通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定页面,比如商品详情页、活动详情页等等。也可以执行某些指定动作,如完成支付等。也可以在应用内通过 html 页来直接调用显示 app 内的某个页面。综上URL Scheme使用场景大致分以下几种:

  • 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
  • H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
  • APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
  • APP根据URL跳转到另外一个APP指定页面

scheme协议格式

scheme 协议定义和 http 协议类似,都是标准的 URI 结构。

[scheme:][//host:port][path][?query][#fragment]
scheme : 协议名称 - 必须
host : 协议地址 - 必须
port : 协议的端口,可以不填
path : 协议路径,可用 / 连接多个
query : 携带的参数可用 & 连接多个
fragment : 锚点
例子
下面看一个例子:

wexin://tencent.com:8080/dl/news/open?data=902323&params=test
  • weixin : 协议名称
  • tencent.com : 域名
  • 8080 : 端口
  • /dl/news/open : 页面的路径
  • data,params : 传递的参数

URL Scheme如何使用

Android配置

  1. 在AndroidManifest.xml中对<activity />标签增加<intent-filter />设置Scheme(只有第一步是必须配置的)
    在MAInAcrtivity
JAVA
        <activity
            android:name="com.app.MainActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:windowsoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <!--协议部分,随便设置-->
                <!-- 下面的scheme地址为 xl://goods -->
                <data android:scheme="xl"
                    android:host="goods"/>
                <!--下面这几行也必须得设置-->
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>
        </activity>

在其他Activity

Java
<activity
   android:name=".GoodsDetailActivity"
   android:theme="@style/AppTheme">
   <!--要想在别的App上能成功调起App,必须添加intent过滤器-->
   <intent-filter>
       <!--协议部分,随便设置-->
       <!-- 下面的scheme地址为 xl://goods:8888/goodsDetail -->
       <data android:scheme="xl" 
                 android:host="goods" 
                 android:path="/goodsDetail" 
                 android:port="8888"/>
       <!--下面这几行也必须得设置-->
       <category android:name="android.intent.category.DEFAULT"/>
       <action android:name="android.intent.action.VIEW"/>
       <category android:name="android.intent.category.BROWSABLE"/>
   </intent-filter>
</activity>

注释:
需要配置能被js调起,一定要配置下面这句

Java
<category android:name="android.intent.category.BROWSABLE"/>
Java
<!--必有项-->
<action android:name="android.intent.action.VIEW" />
<!--表示该页面可以被隐式调用,必须加上该项-->
<category android:name="android.intent.category.DEFAULT" />
<!--如果希望该应用可以通过浏览器的连接启动,则添加该项-->
<category android:name="android.intent.category.BROWSABLE" />

扩展:
上面的 data 节点中可以包含下面的信息来对相应的scheme进行过滤,一般需要配置 scheme 和 host。

Java

<data 
    android:scheme=""
    android:host=""
    android:port=""
    android:path=""
    android:mimeType=""
    android:pathPattern=""
    android:pathPrefix=""
    android:ssp=""
    android:sspPattern=""
    android:sspPrefix=""
/>

然后在相应的 activity 可以获取 uri 中参数。

Java

public class DeepLinkActivity extends AppCompatActivity {
    private static final String TAG = "DeepLinkActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = getIntent();
        Log.e(TAG, "scheme:"  + intent.getScheme());
        Uri uri = intent.getData();
        Log.e(TAG, "scheme: " + uri.getScheme()); // 获取 scheme 名称
        Log.e(TAG, "host: " + uri.getHost());     // 获取 scheme 的host
        Log.e(TAG, "path: " + uri.getPath());     // 获取 scheme 的路径
        Log.e(TAG, "queryString: "+  uri.getQuery()); // 获取 scheme 的参数,?后面的部分
        Log.e(TAG, "queryParameter: " + uri.getQueryParameter("param")); // 获取 scheme 中的 param 参数
    }
}

其中的 intent 实例有下面的方法可以获取相应的 scheme 信息:

  • getScheme() :获取Uri中的scheme名称:[scheme:]
  • getSchemeSpecificPart() :获取Uri中的scheme-specific-part:部分:[//host:port][path]
  • getFragment() :获取Uri中的Fragment部分:[#fragment]
  • getAuthority() :获取Uri中Authority部分:[//host:port]
  • getPath() :获取Uri中path部分:[path]
  • getQuery() :获取Uri中的query部分:[?query]
  • getHost() :获取Authority中的Host字符串
  • getPost() :获取Authority中的Port字符串
  • List< String> getPathSegments() :依次提取出Path的各个部分的字符串,以字符串数组的形式输出
  • getQueryParameter(String key) :获取query部分中 key 对应的参数值
  1. 注意事项
    正常情况下,以上配置后,就可以正常进行跳转了,但是在安卓上,还需要进行一步配置,如果你的应用被其注册过的外部 url 调起,如果要在现有的 MainActivity 中监听传入的 intent,那么需要在AndroidManifest.xml中将 MainActivity 的launchMode设置为singleTask
Java
<activity
  android:name=".MainActivity"
  android:launchMode="singleTask">
  1. 问题:当app在后台运行,用scheme链接打开,url获取为null,不会跳转到对应页面
    原因:
    因为react native只配置了一个activity,整个应用都是在这个activity里运行的。当app尚未启动,由scheme唤起时,activity会执行onCreate生命周期钩子,初始化intent,此时你将会得到全新的url:null。当app已经运行在后台,由scheme唤起时,activity不会执行onCreate方法,你得到的url还是旧值:null。
    在android/app/src/main/java/com/lka/MainActivity.java的最下面添加:
Java
@Override
public void onNewIntent(Intent intent){
    super.onNewIntent(intent);
    setIntent(intent);
}

注:
singTask 启动模式在从后台唤醒时它的生命周期:

如果IntentActivity处于任务栈的顶端,也就是说之前打开过的Activity,现在处于
onPause
onStop 状态的话,
其他应用再发送Intent的话,执行顺序为:

onNewIntent
onRestart
onStart
onResume

IOS配置

只需要配置info.plist 文件,只需要配置URL Schemes就可以了,identifier是可选配置
在这里插入图片描述

H5打开app测试

自己编写一个html页面,发到微信,用qq浏览器打开,点击"打开app"按钮,会提示是否“允许”,点击允许,自动打开app。
如果打开的 scheme 在本地没有对应的 app,则点击连接不会反应。
例子

Html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div >
  <a href="app://www.aaa.com/list">打开app</a>
</div>
</body>
</html>

注:
1.这种的缺点是只能用qq浏览器打开
2.浏览器打开如下html代码,即可启动App

Html
<a href="myscheme://">打开app</a>

用原生代码获取参数

浏览器打开App时,如何获取网页带过来的数据(用原生代码获取)

Html
<a href="myscheme://?arg0=0&arg1=1">打开app</a>
Java
(1).假如你是通过浏览器打开这个网页的,那么获取数据的方式为:

Uri uri = getIntent().getData();  
String test1= uri.getQueryParameter("arg0"); 
String test2= uri.getQueryParameter("arg1");

(2)如果使用webview访问该网页,获取数据的操作为:

webView.setWebViewClient(new WebViewClient(){
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
          Uri uri=Uri.parse(url);
          if(uri.getScheme().equals("myscheme")){
              String arg0=uri.getQueryParameter("arg0");
              String arg1=uri.getQueryParameter("arg1"); 
          }else{
              view.loadUrl(url);
          }
         return true;
  }
});
、

从APP上用原生代码调用实现跳转(没有测试)

android调用

Java
 Intent action = new Intent(Intent.ACTION_VIEW);
 StringBuilder builder = new StringBuilder();
 builder.append("caishilive://caishi:8080/loadtooldetail?tool_id=100");
 action.setData(Uri.parse(builder.toString()));
 startActivity(action);
 或
 Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
 startActivity(intent);

ios调用

Java
  NSString *url = @"opengs://";
 //    NSString *url = @"opengs://com.opengs.www";
 if ([[UIApplication sharedApplication]
      canOpenURL:[NSURL URLWithString:url]])
 {
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
 }
 else
 {
     NSLog(@"can not open URL scheme opengs");
 }

URL Scheme是否有效

跳转前要判断一下该URL Scheme是否有效

Html
private boolean schemeValid() {
        PackageManager manager = mContext.getPackageManager();
        Intent action = new Intent(Intent.ACTION_VIEW);
        action.setData(Uri.parse("caishilive://caishi:8080/loadtooldetail?tool_id=100"));
        List list = manager.queryIntentActivities(action, PackageManager.GET_RESOLVED_FILTER);
        return list != null && list.size() > 0;
    }

react-native获取url 见下节 http://t.csdn.cn/h40sw


附录:常见应用的URL Scheme

1、记录使用过的URL Scheme

名称 URL Scheme 对应的普通链接
witter发消息 Twitter://messages/compose?text=[yourText] https://twitter.com/messages/compose?text=[yourText]
Twitter发动态 twitter://intent/tweet?text=[yourText] https://twitter.com/intent/tweet?text=[yourText]
打开Email mailto:?body=[yourText]  
给某人发Email mailto:[emailAddress]?body=[yourText]  
发短信SMS sms:body=hello(AOS)sms:&body=hello(IOS)  
whatsapp发消息 whatsapp://send?text=[yourText]  
fbmessenger发消息(分享链接) fb-messenger://share/?link=[yourShareURL] https://www.facebook.com/dialog/send?display=popup&app_id=[yourAppID]&link=[yourShareURL]&redirect_uri=[yourShareURL]
fbmessenger发消息(指定对象) fb-messenger://m.me/[yourPageID](通用) fb-messenger-public://user-thread/[yourPageID](IOS) https://www.messenger.com/t/[yourPageID] / https://m.me/[yourPageID]
fb打开相关主页 fb://page/[yourPageID] https://www.facebook.com/[yourPageID]
Amazon打开产品详情页 com.amazon.mobile.shopping://www.amazon.com/dp/[yourAsin] https://www.amazon.com/dp/[yourAsin]
打开App Store中应用详情页 itms-apps://itunes.apple.com/cn/app/[yourAppID] https://itunes.apple.com/cn/app/[yourAppID]
打电话 tel:[telephoneNumber]  

2、系统默认应用

名称 URL Scheme Bundle Identifier
Safari http://  
maps http://maps.google.com  
Phone tel://  
SMS sms://  
Mail mailto://  
iBooks ibooks://  
App Store itms-apps://itunes.apple.com  
Music music://  
Videos videos://  
3、常用第三方软件    
名称 URL Scheme Bundle Identifier
QQ mqq://  
微信 weixin://  
腾讯微博 TencentWeibo://  
淘宝 taobao://  
支付宝 alipay://  
微博 sinaweibo://  
weico微博 weico://  
QQ浏览器 mqqbrowser:// com.tencent.mttlite
uc浏览器 dolphin:// com.dolphin.browser.iphone.chinese
欧朋浏览器 ohttp:// com.oupeng.mini
搜狗浏览器 SogouMSE:// com.sogou.SogouExplorerMobile
百度地图 baidumap:// com.baidu.map
Chrome googlechrome://  
优酷 youku://  
京东 openapp.jdmoble://  
人人 renren://  
美团 imeituan://  
1号店 wccbyihaodian://  
我查查 wcc://  
有道词典 yddictproapp://  
知乎 zhihu://  
点评 dianping://  
微盘 sinavdisk://  
豆瓣fm doubanradio://  
网易公开课 ntesopen://  
名片全能王 camcard://  
QQ音乐 qqmusic://  
腾讯视频 tenvideo://  
豆瓣电影 doubanmovie://  
网易云音乐 orpheus://  
网易新闻 newsapp://  
网易应用 apper://  
网易彩票 ntescaipiao://  
有道云笔记 youdaonote://  
多看 duokan-reader://  
全国空气质量指数 dirtybeijing://  
百度音乐 baidumusic://  
下厨房 xcfapp://  

原文链接:https://blog.csdn.NET/weixin_42895400/article/details/87799262
https://blog.csdn.net/wangkeke1860/article/details/49850997



Tags:android   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Android Emulator黑屏怎么办 Android模拟器黑屏解决方法
Android Emulator黑屏问题困扰了非常多的玩家,Android Emulator作为一款安卓模拟器,可以让你在电脑上运行和浏览安卓应用程序,但是程序本身不是很稳定,很容易会出现黑屏,启动不了...【详细内容】
2024-03-04  Search: android  点击:(37)  评论:(0)  加入收藏
Android 谷歌三件套:解锁谷歌生态!
大家是不是遇到这个情况?当我们需要下载一些国外的游戏或者软件的时候,需要在手机里面安装Google Play商店,然后通过Google Play商店下载国外软件!为了帮助大家使用上各种好用的...【详细内容】
2024-01-02  Search: android  点击:(113)  评论:(0)  加入收藏
Android开发中常见的Hook技术有哪些?
Hook技术介绍Hook技术是一种在软件开发中常见的技术,它允许开发者在特定的事件发生时插入自定义的代码逻辑。常见的应用场景包括在函数调用前后执行特定的操作,或者在特定的事...【详细内容】
2023-12-25  Search: android  点击:(85)  评论:(0)  加入收藏
在Android应用开发中使用NFC功能
NFC介绍NFC是指“近场通讯”(Near Field Communication),它是一种短距离无线通信技术,允许设备在非接触或极短距离内进行通信。NFC通常用于移动支付、门禁系统、智能标签和其他...【详细内容】
2023-12-22  Search: android  点击:(102)  评论:(0)  加入收藏
关于Android图像Bitmap类,你要知道的一切
Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色...【详细内容】
2023-12-19  Search: android  点击:(99)  评论:(0)  加入收藏
Android开发中如何进行单元测试?
单元测试介绍单元测试是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是函数或方法)是否按预期工作。单元测试通常由开发人员编写,旨在隔离和测试代码的特定部...【详细内容】
2023-12-11  Search: android  点击:(167)  评论:(0)  加入收藏
我的手机我做主,如何为Android手机应用换图标?
作为一名Android用户,你是否曾经为自己的手机桌面感到单调而乏味?虽然Android系统的桌面定制性已经非常强大,但有时候我们还是希望能够在细节上做出一些改变,尤其是对于那些每天...【详细内容】
2023-12-10  Search: android  点击:(61)  评论:(0)  加入收藏
了解Android系统架构中的HAL硬件抽象层
在Android系统中,HAL的存在使得不同厂商的硬件可以统一被上层的应用程序调用,从而提高了系统的兼容性和可移植性。HAL还可以帮助开发者更方便地开发应用程序,因为他们不需要为...【详细内容】
2023-12-06  Search: android  点击:(203)  评论:(0)  加入收藏
谷歌 CEO 皮查伊建议 Android 用户不要侧载应用,称非常危险
iOS和Android的一个显著差异是,Android支持用户从第三方渠道安装应用程序(即“侧载”)。然而,谷歌似乎并不希望用户这样做。最近,在与Epic Store的法律诉讼中,谷歌首席执行官桑达...【详细内容】
2023-11-20  Search: android  点击:(167)  评论:(0)  加入收藏
Android数据对象序列化原理与应用
序列化与反序列化「序列化」是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换...【详细内容】
2023-11-14  Search: android  点击:(273)  评论:(0)  加入收藏
▌简易百科推荐
Android Emulator黑屏怎么办 Android模拟器黑屏解决方法
Android Emulator黑屏问题困扰了非常多的玩家,Android Emulator作为一款安卓模拟器,可以让你在电脑上运行和浏览安卓应用程序,但是程序本身不是很稳定,很容易会出现黑屏,启动不了...【详细内容】
2024-03-04  18183游戏网    Tags:Android Emulator   点击:(37)  评论:(0)  加入收藏
Android开发中常见的Hook技术有哪些?
Hook技术介绍Hook技术是一种在软件开发中常见的技术,它允许开发者在特定的事件发生时插入自定义的代码逻辑。常见的应用场景包括在函数调用前后执行特定的操作,或者在特定的事...【详细内容】
2023-12-25  沐雨花飞蝶  微信公众号  Tags:Android   点击:(85)  评论:(0)  加入收藏
在Android应用开发中使用NFC功能
NFC介绍NFC是指“近场通讯”(Near Field Communication),它是一种短距离无线通信技术,允许设备在非接触或极短距离内进行通信。NFC通常用于移动支付、门禁系统、智能标签和其他...【详细内容】
2023-12-22  沐雨花飞蝶  微信公众号  Tags:Android   点击:(102)  评论:(0)  加入收藏
关于Android图像Bitmap类,你要知道的一切
Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色...【详细内容】
2023-12-19  沐雨花飞蝶  微信公众号  Tags:Android   点击:(99)  评论:(0)  加入收藏
Android开发中如何进行单元测试?
单元测试介绍单元测试是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是函数或方法)是否按预期工作。单元测试通常由开发人员编写,旨在隔离和测试代码的特定部...【详细内容】
2023-12-11  沐雨花飞蝶  微信公众号  Tags:Android   点击:(167)  评论:(0)  加入收藏
一篇聊聊Jetpack Room实现数据存储持久性
Room介绍Room 是 Android Jetpack 组件库中的一部分,它是用于在 Android 应用中进行本地数据库访问和管理的库。Room 提供了一个抽象层,使开发者能够更轻松地访问 SQLite 数据...【详细内容】
2023-12-08  沐雨花飞蝶  微信公众号  Tags:Jetpack   点击:(143)  评论:(0)  加入收藏
了解Android系统架构中的HAL硬件抽象层
在Android系统中,HAL的存在使得不同厂商的硬件可以统一被上层的应用程序调用,从而提高了系统的兼容性和可移植性。HAL还可以帮助开发者更方便地开发应用程序,因为他们不需要为...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:Android   点击:(203)  评论:(0)  加入收藏
我们一起聊聊 IntentService 与 Service 的区别?
Service介绍Service组件是Android应用开发中的四大组件之一,用于在后台执行长时间运行的操作或处理远程请求。它可以在没有用户界面的情况下执行任务,并且可以与其他应用组件...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:IntentService   点击:(170)  评论:(0)  加入收藏
Android数据对象序列化原理与应用
序列化与反序列化「序列化」是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换...【详细内容】
2023-11-14  沐雨花飞蝶  微信公众号  Tags:Android   点击:(273)  评论:(0)  加入收藏
你了解Android中的SELinux吗?
SELinux介绍SELinux(Security-Enhanced Linux)是一种安全增强的Linux操作系统,它通过强制访问控制(MAC)机制来提供更高级别的系统安全保护。相比于传统的Linux访问控制机制(DAC),SEL...【详细内容】
2023-11-09  沐雨花飞蝶  微信公众号  Tags:Android   点击:(264)  评论:(0)  加入收藏
站内最新
站内热门
站内头条