精华内容
下载资源
问答
  • 安卓Android苹果IOS双端多用途通讯录短信定位获取系统,hbiulderX打包出来的和原生APP一样 源码适用于:金融业务型公司(当你和客人达成资金担保合作协议,在抄录其50个备用联系人的时候,直接进行读取,省去了一...
  • 短信链接唤起app

    千次阅读 2017-08-16 11:00:50
    在Android中点击链接打开APP是一个很常见的需求。例如,电商为用户发送优惠券之后经常会下发一条短信:某某优惠券已发送到您的账户中,点击 xxx 链接即可查看!此时当用户点击链接之后会直接打开本地APP,进入相关...

    Android中点击链接打开APP是一个很常见的需求。例如,电商为用户发送优惠券之后经常会下发一条短信:某某优惠券已发送到您的账户中,点击 xxx 链接即可查看!此时当用户点击链接之后会直接打开本地APP,进入相关页面。 

    功能实现: 

    1.在manifest中为相应的activity添加intent-filter:

    
       
    < activity
    android:name = ".TestActivity" >
    <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
    android:host = "mywebsite.com"
    android:pathPrefix = "/openApp"
    android:scheme = "http" />
    </intent-filter>
    </ activity >
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.在手机上模拟发一条短信,包含链接  http://mywebsite.com/openApp ,手机一般都能自动识别链接,点击链接后系统会弹出选择框,如下: 

    点击自己的APP(AndroidTest)之后,系统就会自动打开AndroidTest这个程序的TestActivity这个页面。 

    3.然而,上述做法显然是不完美的,因为用户很可能会选择浏览器打开此链接!为了解决这个问题,可以将scheme属性修改为自定义的,例如:

    
       
    < data
    android:host= "mywebsite.com"
    android:pathPrefix= "/openApp"
    android:scheme= "myapp" />
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    此时,对应的链接地址为 myapp://mywebsite.com/openApp . 因为手机本地只有我们自己的程序能够识别 myapp 这个协议,所以会直接打开APP。然而依旧存在问题: 
    (1)如果把该链接放在网页上,希望希望用户点击链接后打开APP,那么上述做法是没有问题的。例如网页中添加如下代码即可:

    <a href='myapp://mywebsite.com/openApp'>点击打开APP</a>
       
    • 1
    • 1

    (2)但是,如果把链接放在短信中就不行了。因为 myapp 这个协议系统的短信程序也不能识别,所以不会标记为链接样式,也就是说用户不能直接点击。 
    解决该问题的方法是使用网页重定向功能,例如在短信中发送链接:  http://abc.com/openApp ,然后在该网页上添加重定向:

    <meta http-equiv="Refresh" content="0;url=myapp://mywebsite.com/openApp?name=zhangsan&age=20" />
       
    • 1
    • 1

    用户在短信中点击后会使用浏览器打开链接,然后自动打开自己的APP。 
    4.最后,在TestActivity中可以获取链接url传递的参数:

    
       
    Intent intent = getIntent() ;
    String action = intent .getAction () ;
    if (Intent .ACTION _VIEW .equals (action)) {
    Uri uri = intent .getData () ;
    if (uri != null) {
    String name = uri .getQueryParameter ( "name" ) ;
    String age = uri .getQueryParameter ( "age" ) ;
    Toast .makeText (this, "name=" + name + ",age=" + age, Toast .LENGTH _SHORT) .show () ;
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    本篇完,欢迎讨论。

    自己很喜欢的一片文章,转载过来希望能帮助到更多同学!

    展开全文
  • 写这篇文章,也是缘于运营的一个需求:在 App 运营过程中,会有大量的推广短信,里面附有链接,目的是引导用户参与活动。如果用户手机没有安装我们的 App 就引导其去下载页,如果用户已经安装了我们的 App 就直接在 ...

    一、需求描述

    写这篇文章,也是缘于运营的一个需求:在 App 运营过程中,会有大量的推广短信,里面附有链接,目的是引导用户参与活动。如果用户手机没有安装我们的 App 就引导其去下载页,如果用户已经安装了我们的 App 就直接在 App 中打开对应的活动。

    二、方案讨论

    对需求进行分析,归纳起来实际上就是一个问题,如何从短信唤起App?

    这里有两种方案。

    第一种,也是最理想的直接从短信唤起,也就是点击短信中的链接后如果安装了 App 就跳转到 App,如果没有安装就在浏览器打开对应页面

    方案一 : 点击短信直接唤起

    第二种,经浏览器中转唤起,也就是点击短信链接后先用浏览器打开对应页面,在页面中进行“判断”(实际上不是真正的判断,而是发一个scheme给系统)如果安装了 App 就跳转到 App,否则就停留在当前页。

    方案二 : 点击短信经浏览器中转唤起

    下面将对第二种方案进行分析、实施。

    三、经浏览器中转唤起 App

    用户往往会首先跳转到浏览器(对应的是下载页面),经过浏览器中转,唤起 App。

    而实现这一途径我们可以采用Shareinstall。

    Shareinstall减少了应用的代码冗余,提供了通用的一键拉起接口。通过 URL Scheme 和 Universal Links 实现在不同浏览器中拉起APP。

    以下是Shareinstall的工作原理:

    (1)

    由于安全隐私的原因,目前在网页端是无法通过js脚本直接判断某个APP是否已经安装,只能首先通过js尝试性的启动app,然后再进入安装流程。web网页上启动app的方式有两种:1)URL Scheme;2)Universal Link

    (2)

    URL Scheme:

    android与ios均支持自定义scheme,通过访问自定义schema的url即可启动对应的app,如weixin://dl/scan这个url,这里的weixin就是自定义的schema。js启动app的具体方法主要有iframe.src,window.location等,如下:

    var iframe = document.createElement(“iframe”);

    iframe.style.display = “none”;

    iframe.src = schemaUrl;

    document.body.appendChild(iframe);

    window.location=schemaUrl;

    (3)

    部分浏览器由于人为限制无法直接使用scheme启动app,例如微信与QQ的内置浏览器,但在微信与QQ中,可以通过集成应用宝的微下载来启动app,下面就来介绍下应用宝的具体情况:

    目前主要通过监听各种dom事件(如:pagehide,visibilitychange,unload等)或通过setTimeout根据时间差来(早期ios系统中,通过schema可立即启动app,同时导致浏览器js脚本暂停运行,脚本恢复运行时通过时间差就能大致的判断app是否启动成功)。但现实情况下,由于各种浏览器与系统的差异性,无法通过js百分百的准确判断app是否启动成功;比如从ios9.2开始,通过schema启动app时,ios系统会弹出一个非模态的系统提示框,询问用户是否同意启动,在用户没有做出选择前,js脚本将继续运行,这将导致js完全无法判断app是否启动成功。

    (4)

    Universal Link(通用链接):

    ios9开始提供通用链接的特性,app开发时可配置一个与app对应的关联域名,在ios9以上系统的所有浏览器中,访问任何一个url链接前,系统将检查本地是否已安装与url域名相对应的app,如果已安装对应的app,将进一步检查链接url的路径,是否应当启动该app,而不在浏览器中访问此url链接。但是通用链接存在一个容易让人迷惑的地方,在经过通用链接启动app后,用户可以选择使用safari访问此url,系统会默默的记住用户的选择,在下次访问通用链接的url时,系统将不再启动app,而是直接在浏览器中访问此url,并且没有明显的提示;(在safari中,用户只有手动往下拽了该页面时,才会出现一个询问用户打开app的banner,其它浏览器则未必有此功能,而是完完全全的忽略掉通用链接)

    (5)

    应用宝微下载:

    正常情况下,微信内置浏览器中,无法通过scheme启动app,无法下载apk,也无法跳转到app store,但微信与QQ均集成了对应用宝的支持。通过使用应用宝的微下载功能,android下的微信与QQ帮助判断某个app是否已安装,已安装的情况下,提示用户直接启动app(在应用宝中需配置启动用的scheme),未安装的情况下,可直接下载已上架到应用宝的apk文件;ios下,由于无法判断某个应用是否已安装(特别是ios>=9.2出现的提示窗口),应用宝只提供了跳转app store的功能,而没有启动app的功能。

    展开全文
  • 更新应用程序的react-native-scripts依赖关系应该像更改package.json的版本号并重新安装项目的依赖关系一样简单。 升级到React Native的新版本需要更新react-native , react和expo软件包版本,并在app.json设置...
  • 前言: 随着APP产品的迭代,运营的过程...导致沉睡用户无法送达的,除非你是微信这样的大佬才行,所以,此时通用一点方式就是通过短信发送一条活动链接,通过点击这条链接可以直接跳转到我们的APP。 实现效果: ...

    前言:

    随着APP产品的迭代,运营的过程中往往会有一些活动希望通知到用户,或者唤起沉睡用户,就我们Android而言,当然有推送,长连接一类的方法,但是,基于国内的推送环境,只能APP自己启动长连接,没有统一的系统级别的推送支持,导致沉睡用户无法送达的,除非你是微信这样的大佬才行,所以,此时通用一点方式就是通过短信发送一条活动链接,通过点击这条链接可以直接跳转到我们的APP。

    实现效果:

    6.0以上版本:
    这里写图片描述
    不考虑兼容性的任意版本:
    这里写图片描述

    实现思路

    要唤起我们的App大致工作流程如下:

    Created with Raphaël 2.1.2 点击短信链接(http/https) 系统6.0+? verifyOk? APP 弹框 app支持? 浏览器 yes no yes no yes no

    所以,一共有三条线路可以到达我们的APP,在任何安卓版本中,我们走或者中间右边那条线(Deep_Link),6.0之后,我们走左边那条线!(App Link)

    首先我们的试试中间这条线:

    在Android 系统中点击链接会发送一条 action = VIEW 的隐式意图 ,我们只需要在我们的APP 中加入相应的Intent 过滤器去满足这条规则即可,下面我们开始实现,首先我们试试中线方案:

    1.注册需要接受的Activity:
    通常情况下,我们都注册我们APP的启动Activity:

      <activity
                android:name=".Activity.WelcomeActivity"
                android:label="@string/app_name"
                android:theme="@style/AppTheme.NoActionBar">
    
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
    
                <!-- for deep-link -->
                <intent-filter>
    
                    <!-- 必须加否否无法响应点击链接的 Intent-->
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
    
                    <category android:name="android.intent.category.BROWSABLE" />
    
                    <data
                        android:scheme="http"
                        />
                </intent-filter>
            </activity>

    通过加上以上信息,我们的应用就可以响应以http开头的链接了。

    为了验证以上代码,我写了一个Demo,启动页里是WeclcomeActivity,然后延时1.5秒跳转到首页(这里模拟真正App里面的初始化等一些列操作)在WelcomeActivity加入了以上逻辑,然后我们在短信中随便输入一个链接地址,然后我们看看效果:
    这里写图片描述
    嗯,看上去,问题似乎是解决了,我们点击了一个链接,跳转到了我们的App。但是,似乎又延伸出了另外几个问题:

    2.遇到的问题:

    • 如果我如何点击我们自己的网站跳到我们的App而不是任意的链接?
    • 如果我想通过链接跳转到App中不同的页面,应该怎么做?
    • 刚刚出现了一个弹框让我二次确认(一般是选择浏览器,只要是浏览器,都会相应http或者http开头的shceme,如果你的APP安装了多个浏览器,都会出现在这个弹框的选项中),我如何去掉这个恶心的选择浏览器的的弹框?

    为解决我们前面两个问题,我们需要将我们的链接定义成如下格式:

    [scheme]://[host]/[path]?[query]

    刚刚scheme 我们已经定义了,也就是说,为了唤起我们的App,只需要定义scheme就可以了,但是如果我们为了让我们的唤起更加精确,比如我要点击自己的官网跳转到我的App,而不是点击百度也可以,我们就需要在host里面加入我们自己的个性域名,(这里的path也可添加用作区分,也可以不加,如果公司有多个App,可以额外加这个做区分)
    如果我们需要知道在点击这个链接跳到APP之后做不同的事情比如:跳不同的页面、展示不同的数据等,我们就需要在query后面加一些参数。
    我们先现在在短信中输入这样一个链接:

    //http:www.qw.com/data?page=2&text=page2

    修改我们Manifest配置文件添加一个host:

         <data
            android:host="www.qw.com"
            android:scheme="http" />

    在WelcomeActivity里面声明参数的接收:

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_wlecome);
    
    
            Intent intent = getIntent();
    
            //接受数据
            if (null != intent.getData()) {
                Uri uri = intent.getData();
                Log.d("qw", uri.toString());
                String pageTarget = uri.getQueryParameter("page");
                String pageText = uri.getQueryParameter("text");
                if (TextUtils.isEmpty(pageTarget))
                    pageTarget = "";
                if (TextUtils.isEmpty(pageText))
                    pageText = "";
    
                Toast.makeText(this, "去页面:" + pageTarget + "\n" + "text: " + pageText, Toast.LENGTH_LONG).show();
    
            }
    
    
            //延迟2秒去主页,模拟数据初始化操作
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
                    finish();
                }
            }, 2000);
        }

    我们再来看看效果:
    这里写图片描述

    加上host之后,我先点击之前那个链接,果然就是直接浏览器访问了,不会提示选择到我们的App了,然后我们点击下面的链接,在Welcome里面也就能展示到我们的数据了,我们可以根据这些数据做一些不同事情。
    到这里大家可能有疑问了,我为什么不直接在我需要跳转的Activity上面声明呢?
    第一:如果我们声明了多个Activity ,即使通过以上规则匹配上,你点击跳转以后,如果用户结束这个Activity的话,就直接回到桌面了,这个是比较奇怪的。

    第二:你的很多配置的初始化可能会在Welcome里面,如果直接去某个页面可能会配置未初始化什么的,所以每次点击链接跳转WelcomActivity,然后传到首页MainActivity,然后在 MainActivty 里面接受数据再做路由才是比较好的做法。

    首先修改我们的WelcomeActivity:

      @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_wlecome);
    
    
            final Intent intent = getIntent();
    
            //接受数据
    //        if (null != intent.getData()) {
    //            Uri uri = intent.getData();
    //            Log.d("qw", uri.toString());
    //            String pageTarget = uri.getQueryParameter("page");
    //            String pageText = uri.getQueryParameter("text");
    //            if (TextUtils.isEmpty(pageTarget))
    //                pageTarget = "";
    //            if (TextUtils.isEmpty(pageText))
    //                pageText = "";
    //
    //            Toast.makeText(this, "去页面:" + pageTarget + "\n" + "text: " + pageText, Toast.LENGTH_LONG).show();
    //
    //        }
    
    
            //延迟2秒去主页,模拟数据初始化操作
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    Intent mainActivityIntent = new Intent(WelcomeActivity.this, MainActivity.class);
                    //我们不再在这个页面处理数据,改到首页去做这件事
                    if(null != intent.getData()){
                        mainActivityIntent.setData(intent.getData());
                    }
                    startActivity(mainActivityIntent);
                    finish();
                }
            }, 2000);
        }

    首页MainActivity:

    public class MainActivity extends AppCompatActivity {
        private final static String TARGET_ONE = "1";
        private final static String TARGET_TWO = "2";
    
        public final static String TEXT_EXTRA = "text";
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            dealWithIntent();
    
        }
    
        private void dealWithIntent() {
    
            Intent intent = getIntent();
            if (null == intent)
                return;
    
            Uri uri = intent.getData();
            if (null == uri)
                return;
    
            String pageTarget = uri.getQueryParameter("page");
            String pageText = uri.getQueryParameter("text");
            if (TextUtils.isEmpty(pageTarget))
                pageTarget = "";
            if (TextUtils.isEmpty(pageText))
                pageText = "";
    
            Intent launchIntent;
            switch (pageTarget) {
                default:
                case TARGET_ONE:
                    launchIntent = new Intent(this, OneActivity.class);
                    break;
                case TARGET_TWO:
                    launchIntent = new Intent(this, TwoActivity.class);
                    break;
    
            }
            launchIntent.putExtra(TEXT_EXTRA, pageText);
            startActivity(launchIntent);
    
        }
    }

    最后是目标Activity,就更简单了,接收那个text,展示一个Toast:

    public class TwoActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_page_2);
    
            Intent intent = getIntent();
            if (null != intent.getExtras()) {
                Toast.makeText(this, intent.getExtras().getString(MainActivity.TEXT_EXTRA) + "", Toast.LENGTH_LONG).show();
            }
        }
    }

    我们看看效果:
    这里写图片描述

    ok,现在前两个问题都解决了,可以点击我们自己的网站跳到APP,也可以拿到数据去做我们想要的事情,只剩下最棘手的一个问题了:这个弹框怎么办?一般情况下,如果出现了弹框,用户可能就不会按照你的意愿去选择我们APP打开链接,也许会选择浏览器,总之体验很不好,只要是scheme是 http 或者https的浏览器都会出现在弹框中!那我自定义scheme不就好了?
    现在我们继续改Manifest文件:

    <data
         android:host="www.qw.com"
         android:scheme="app" />

    然后我们把之间短信的链接改为app:// 开头再运行看看效果:
    这里写图片描述

    奇怪?怎么没跳到我的App?还是跳到了浏览器,我打开浏览器的链接,发现还是访问的http…..原来我在短信里面添加的链接自定义的scheme被短信认为不是一个scheme。。。
    这里写图片描述
    可见红色部分没有被识别,浏览器默认给我加了http….
    既然这样…总是跳不开浏览器的访问,那么我可不可以在浏览器访问某个指定页面的时候,再去重定向跳转到我们的App呢?每次直接访问浏览器,我们就再也不用弹框确认了,所以中线方案最终以体验不好告终,我们选择右线方案!

    3.终究跳不开的http/https访问

    所以我们写一个html 页面,在代码里面做一个重定向,比如我在短信里面点击的链接是 http://www.test.com/data?text=1,我们在html 里面将http或者https改成我们自己定义的app:// 然后保持后面的部分不变:
    现在我拿真机实测一下,我先写一个html网页:

    
    <html>
      <head>
        <meta charset="utf-8">
        <title>测试重定向</title>
      </head>
      <body>
        <script>
          var app = ''
          var url = location.href
          app = url.replace(url.slice(0, 5) === 'https' ? 'https' : 'http', 'app')
    
          location.href = app
        </script>
      </body>
    </html>
    

    然后把它传到服务器上得到的url地址是:
    http://p5ml3g4x2.bkt.clouddn.com/open_app.html
    所以我们把我们APP里面的域名改为:p5ml3g4x2.bkt.clouddn.com

    <data
        android:host="p5ml3g4x2.bkt.clouddn.com
        android:scheme="app" />

    运行:
    这里我用了两个测试机,大部分手机都是这两种情况:
    vivo:
    这里写图片描述
    1加5:
    这里写图片描述

    到这里,如果是原声安卓,直接访问打开,大部分第三方手机有二次确认弹框,点击可以跳转到我们应用,我在短信里面额外添加了的参数,也能顺利拿到并执行逻辑,至此,大功告成,此方法可以覆盖90%以上的手机。

    4.阶段性总结
    我们最终通过浏览器作为跳板,访问任意链接,在网页内部再次重定向,从而精准的唤起我们的应用,而跳过了让用户选择多个APP的过程(在短信里面打开一般就是系统浏览器,即使让你选择也是选择浏览器,不会出现选择某个APP的让用户困惑的情况),从而提高用户的活跃度,对于运营需求有很大的意义。但是这个方法美中不足的是,我从APP退出以后,会回到浏览器的界面,所以,一般这个页面我们可以做成我们的官网,或者APP的下载页面,如果用户没有安装APP,顺带可以为用户提供下载的渠道,一举两得。

    有没有更好的解决方案呢?——有!我们下一步的重头戏——APP Link!

    app link 是在谷歌在android M即(Android 6.0) 推出的一种软件之间的关联方式,通俗点讲,就是可以让我们的APP和我们的web域名相关联,当用户点击一个链接时候,可以直接跳到我们的APP,回到我们之前的问题,在6.0之前,我们点击一个链接的时候,如果想跳到我们的APP,我们需要在scheme声明 http或者https ,所以点击链接的时候会出现一个选择弹框,所以我们选择通过链接来重定向,而现在有了APP LINK ,我们大可不必这么做了,点击就能跳过去,无需浏览器作为跳板。

    首先我们贴上一张对比图:

    DEEP LINKAPP LINK
    Intent URL schemehttp, https, or a custom schemeRequires http or https
    Intent actionAny actionRequires android.intent.action.VIEW
    Intent categoryAny categoryRequires android.intent.category.BROWSABLE and android.intent.category.DEFAULT
    Link verificationNoneRequires a Digital Asset Links file served on you website with HTTPS
    PipeMay show a disambiguation dialog for the user to select which app to open the linkNo dialog; your app opens to handle your website links
    CompatibilityAll versionAndoid 6.0+

    相比我们之前的Deep Link ,APP Link 多了许多约束条件,比如scheme 必须是http 或者 https的,但是体验更好,没有用户选择弹框,(实测下来,原生系统直接唤起来,大部分定制系统会提示是否打开链接,如果用户确认以后,就直接跳到APP)调起APP之后逻辑都一样,可以用同样的方式取数据等。

    首先:我们在我们的Manifest 文件中继续对WelcomeActivity 添加配置:

                <intent-filter android:autoVerify="true">
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data
                        android:host="o18dxim1q.qnssl.com"
                        android:scheme="http" />
                    <data
                        android:scheme="https" />
                </intent-filter>

    这里跟之前的区别没太多,就是分别添加了 http和https 的scheme,然后最关键的是这个:

    android:autoVerify="true"

    那这个属性是干嘛的呢?
    当然就是为了验证我们点击的链接和我们的APP是否有关联嘛~
    那是怎么关联的呢?
    所以我们还需要一个服务端文件让APP 知道关联关系,APP,在安装的时候会去校验这个文件,校验文件上声明的应用包名、文件所在的域名、以及文件声明的APP密钥,是否能和app中的配置匹配上,如果匹配上了,在点击该域名下的任何链接的时候,都会直接定向到我们的APP。

    我现在已经将文件传到服务器:
    https://o18dxim1q.qnssl.com/.well-known/assetlinks.json
    内容很明显:

    {
    relation: [
    "delegate_permission/common.handle_all_urls"
    ],
    target: {
    namespace: "android_app",
    package_name: "com.qw.applink",
    sha256_cert_fingerprints: [
    "8C:8A:4D:58:E2:00:2E:0B:E2:46:54:74:7D:3E:F2:27:CE:46:FE:08:8D:CF:F7:34:54:B8:36:6D:7B:32:58:A0"
    ]
    }
    }
    

    注意点:

    • 这个文件的格式的content-type必须是application/json
    • 这个文件只能放在https的链接中,不管你之前在action中声明的是http或者https
    • 这个文件不能有任何重定向,并且必须是以/.well-known/assetlinks.json 后缀结尾,注意看我上传的文件示例

    • 你也可以在这个文件上声明多个APP,注意看它的格式,是一个list

    我们也可以通过Android studio 自己生成这个文件:
    点击Tools-App Links Assitant、我们看看第三步:

    这里写图片描述

    第一步填入我们文件的域名,第二个填入我们的包名,第三就能生成这个文件了,然后传入它指定的路径即可。
    测试一下:
    我们用一个6.0的模拟器做测试:
    这里写图片描述

    我分别点击了3个链接,如果是我们这个域名下的,就能直接跳转到APP,如果你添加了额外的数据,当然也跟之前一样拿到,不同的是,我们APP退出的时候,没有出现浏览器,这样体验是不是很完美?

    再来个一加5做实验,真机上面一般会有二次弹框:
    这里写图片描述

    总结:

    目前就目前Android 6.0以上的分布情况来看,已经占到接近60%,随着时间的推移,这个比例会越来越大,相信往后各个手机定制厂商对APP LINK的支持也会越来越好,新技术毕竟是要慢慢普及和用起来的,目前我们还是可以暂时使用DEEP LINK 重定向的方式解决我们的大部分的问题。

    DEMO:https://gitee.com/_soul/DeepLink.git
    参考文献:
    https://developer.android.com/studio/write/app-link-indexing.html

    展开全文
  • Android 短信链接唤起app

    千次阅读 2018-01-22 11:33:46
    ...例如,电商为用户发送优惠券之后经常会下发一条短信:某某优惠券已发送到您的账户中,点击 xxx 链接即可查看!此时当用户点击链接之后会直接打开本地APP,进入相关页面。 

    转自:http://blog.csdn.net/qq_37788558/article/details/77232528

    Android中点击链接打开APP是一个很常见的需求。例如,电商为用户发送优惠券之后经常会下发一条短信:某某优惠券已发送到您的账户中,点击 xxx 链接即可查看!此时当用户点击链接之后会直接打开本地APP,进入相关页面。 

    功能实现: 

    1.在manifest中为相应的activity添加intent-filter:

    
       
    < activity
    android:name = ".TestActivity" >
    <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
    android:host = "mywebsite.com"
    android:pathPrefix = "/openApp"
    android:scheme = "http" />
    </intent-filter>
    </ activity >
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 1

    2.在手机上模拟发一条短信,包含链接  http://mywebsite.com/openApp ,手机一般都能自动识别链接,点击链接后系统会弹出选择框,如下: 

    点击自己的APP(AndroidTest)之后,系统就会自动打开AndroidTest这个程序的TestActivity这个页面。 

    3.然而,上述做法显然是不完美的,因为用户很可能会选择浏览器打开此链接!为了解决这个问题,可以将scheme属性修改为自定义的,例如:

    
       
    < data
    android:host= "mywebsite.com"
    android:pathPrefix= "/openApp"
    android:scheme= "myapp"  />
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4
    • 1

    此时,对应的链接地址为 myapp://mywebsite.com/openApp . 因为手机本地只有我们自己的程序能够识别 myapp 这个协议,所以会直接打开APP。然而依旧存在问题: 
    (1)如果把该链接放在网页上,希望希望用户点击链接后打开APP,那么上述做法是没有问题的。例如网页中添加如下代码即可:

    <a href='myapp://mywebsite.com/openApp'>点击打开APP</a>
       
    • 1
    • 1
    • 1

    (2)但是,如果把链接放在短信中就不行了。因为 myapp 这个协议系统的短信程序也不能识别,所以不会标记为链接样式,也就是说用户不能直接点击。 
    解决该问题的方法是使用网页重定向功能,例如在短信中发送链接:  http://abc.com/openApp ,然后在该网页上添加重定向:

    <meta http-equiv="Refresh" content="0;url=myapp://mywebsite.com/openApp?name=zhangsan&age=20" />
       
    • 1
    • 1
    • 1

    用户在短信中点击后会使用浏览器打开链接,然后自动打开自己的APP。 
    4.最后,在TestActivity中可以获取链接url传递的参数:

    
       
    Intent intent = getIntent() ;
    String action = intent .getAction () ;
    if (Intent .ACTION _VIEW .equals (action)) {
    Uri uri = intent .getData () ;
    if (uri != null) {
    String name = uri .getQueryParameter ( "name" ) ;
    String age = uri .getQueryParameter ( "age" ) ;
    Toast .makeText (this,  "name="  + name +  ",age="  + age, Toast .LENGTH _SHORT) .show () ;
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 1

    本篇完,欢迎讨论。


    展开全文
  • Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证码,一些app马上就能自动获取并填上验证码,省去我们手动填写验证码。原理就是通过Android的ContentProvider组件间接访问系统的...
  • 短信编辑器

    2015-06-30 11:50:20
    这个是本人学习过程中开发的一个小例子,可以通过安卓获取系统联系人和系短信,然后可以根据这些信息来进行短信的发送,经过真机测试,程序真实可行
  • 用手机APP实现PLC远程监控

    千次阅读 2019-06-10 10:38:03
    在互联网+制造的大背景下,一种实现软硬件对接的手机APP远程监控PLC系统以其远程、高效、便捷的管理特点逐渐被自动化生产企业熟悉和认可,成为节约人力成本,提高产品效益的重要手段。 二、系统实现 手机APP远程...
  • 模拟器是可以发送短信的,还可以两个模拟器之间互相发,由IDE给模拟器发短信。 模拟器边上,有个编辑框,下面有个...,点击,选择phone,这里就可以给模拟器发短信了。还可以设置发出者的号码。 2,android...
  • 本文实例讲解了Android自动提取短信验证码解决方案,分享给大家供大家参考,具体内容如下 主要功能及优点 ... 修改正则表达式内容来匹配自己想要获取的字符串 private String patternCoder = \\d{4}
  • 我们今天就来探讨下如何更好的设计好这个看似小的功能给APP设计一个获取手机验证码的接口根据业务逻辑,初步总结了可能会有以下业务场景 需要用到手机验证码的验证功能大家来看下图片吧login:登录 register:注册 ...
  • 这里写自定义目录标题什么是“本机号码校验”?“本机号码校验”最大优势是安全升级“本机号码校验”更多应用于风险控制场景我们的优势 卓望认证子产品除一键登录外,另一个拳头产品就是本机号码校验。 什么是...
  • 手机 App 测试

    2020-08-24 15:45:41
    一、手机 App 测试的范围 功能模块测试 交叉事件测试 性能测试 安全测试 兼容性测试 安装/卸载测试 接口测试 网络测试 二、手机 App 测试的方法 1. 功能模块测试 1.1 运行 App 安装完成后的试运行,可正常打开...
  • 进入移动互联网时代,使用短信验证来校验身份已是非常普遍的方式,但是接收验证短信时间过长,安全性弱,是一道大难题。本机号码校验能力,将很好的为开发者们解决这一难题。
  • 手机APP项目测试点(内容)总结 对于手机项目(应用软件),主要是进行系统测试。 而针对手机应用软件的系统测试,我们通常从如下几个角度开展测试工作: 功能模块测试 交叉事件测试 性能测试 安全测试 容量测试 兼容...
  • 但当记者打开手机上权限管理,却发现,除了位置和存储权限,其他包括手机百度自启动权限、读取本机识别码、读取联系人权限、获取上网记录权限、读取已安装应用列表等5个权限都是对其“允许访问”的,而这些权限在...
  • 手机APP的常见功能测试用例 1、安装和卸载 安装和卸载是最基本的功能,一旦出错就是优先级为critical的缺陷,因此APP的安装和卸载作为一个测试点应该多加重视,主要关注以下几个方面 (1)应用是否可以正常安装(从...
  • 手机APP软件测试点详解

    千次阅读 2017-07-26 17:19:01
    APP测试有很多方面需要考虑到,我列几点有明显特征的: 功能测试:手机软件的基本功能。倒不一定完全由测试人员来完全执行,但却是所有测试中最重要的,需要测试人员做很好的测试策略和职责划分。 稳定性测试:...
  • 手机APP测试流程&方法

    千次阅读 2020-04-21 14:36:31
    1APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目...
  • h5 发送短信 这里安卓直接跳到发短信页面 ios 会弹出提示框 提示框内容 不可改 只能修改发送内容 <a href="sms:10010">发送短信</a> <a href="sms:10010?body=短信内容"></a> uni app ...
  • 发现之前的页面布局显示有问题,如在短信列表页面,当某条短信内容较长时,应该采用单行显示,超过一行的部分应该被隐藏,因此对主布局文件activity_main.xml和列表项布局文件list_item.xml也做了修改,如下文所示。...
  • wincc实现手机APP远程监控

    千次阅读 2018-07-25 17:47:16
    wincc是西门子公司开发的上位机视窗监控编程软件,用户可以利用软件提供的控件、脚本、方法等进行开发,将控制系统动做成动画画形式的人界面,从而实现对控制系统的监控。现在智能手机已经可以实现电脑的很多功能...
  • 手机APP项目测试点(内容)总结

    千次阅读 2020-07-21 22:16:40
    获取App在典型使用场景下帧率 4、安全测试: 软件权限 –扣费风险:包括发送短信、拨打电话、连接网络等 –隐私泄露风险:包括访问手机信息、访问联系人信息等 –对App的输入有效性校验、认证、授权、敏感数据存储、...
  • App测试中常见的测试点
  • android发送短信代码,主要用于短信验证等,如获取验证码.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • Appium 是一个自动化测试开源工具,看到没,做测试用的,它有点类似Selenium,可以自动操作APP实现一系列的操作。 标记重点,可以使用python对Appium编写脚本,实现对App的抓取。 今天就给你写一个100%叫你...
  • 可以实现自动回复短信,浏览短语记录,回拨电话,更改回复消息,数据储存等功能,利用本地微数据库储存,实测可用,有完整的APK文件和aia文件,可以直接使用或自行修改,适合App Inventor深度学习

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,172
精华内容 12,868
关键字:

修改本机短信的app