场景

最近一个项目中,因为没有原生安卓开发人员,只有选择webview嵌套网页方式打包程序,不知道什么域名总是在微信和QQ里面被报违规,就得很频繁得更新下载域名,后面下载通过中间页面方式解决了,居安思危,想到了之前做了一个博客还被人DDos攻击, 万一程序里面请求数据得域名无法访问了,那已下载用户岂不是很尴尬,想来想去,也没有找到好的解决方案,后面在做IM消息推送时候,得到了灵感,我主动获取网址可能不行,那我可以被动接受啊, 那可以借助第三方推送实现把域名推送安卓壳子,反正三方sdk得域名一般有专人维护,大不了交点费用, 壳子收到域名后,重新loadUrl即可。仅凭自己n年前学的安卓基础,想到了极光推送

极光推送

极光推送注意几点
* 尽量不要发广播广播每天免费只有10次机会,能用设备注册ID推送的就用ID推送
* 集成过程最好直接下载好的sdk全部拷贝过去,参考文档修改已有的代码。
* 如果是在已有的项目集成需要注意sdkbaseApplication中一些初始化工作,我就是集成到已有项目中,一些初始工作没有做,导致一直不成功

嵌套webview的坑

* alert出框会有网址这个我们不希望看到的,可以选择重写可以js直接自己封装一个美化版本alert
* 默认状态是不允许选择文件
* 默认状态下如果js使用window.location.href=进行跳转的不能跳转页面,需要重写方法才行

webview填坑代码

 webview.setWebChromeClient(new WebChromeClient() {
            // For Android < 3.0
            public void openFileChooser(ValueCallback<Uri> valueCallback) {
                uploadMessage = valueCallback;
                openImageChooserActivity();
            }
            // For Android  >= 3.0
            public void openFileChooser(ValueCallback valueCallback, String acceptType) {
                uploadMessage = valueCallback;
                openImageChooserActivity();
            }
            //For Android  >= 4.1
            public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
                uploadMessage = valueCallback;
                openImageChooserActivity();
            }
            // For Android >= 5.0
            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
                uploadMessageAboveL = filePathCallback;
                openImageChooserActivity();
                return true;
            }
        });
  webview.setWebViewClient(new WebViewClient() {
            /**
             * 拦截 url 跳转,在里边添加点击链接跳转或者操作
             */
            public boolean shouldOverrideUrlLoading(WebView view, String url) 
                view.loadUrl(url);
                return true;//返回true,立即跳转;返回false,打开网页延时
            }
            /**
             * 在开始加载网页时会回调
             */
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                //mProgressDialog.show();//加载转圈圈
            }
            /**
             * 在结束加载网页时会回调
             */
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                //mProgressDialog.hide();//关闭转圈圈
            }
        });

php服务端推送域名给APP

composer安装Jpush库

use JPushClient as JPush;
$client = new JPush($app_key, $master_secret);
//向所有人推送
$client->push()
    ->setPlatform('all')
    ->addAllAudience()
    ->setNotificationAlert('Hello, JPush')
    ->send();
//指定设备注册ID推送
$result = $client->push()
         ->setPlatform('android')
         ->addRegistrationId($id)
         ->androidNotification('系统更新', ['extras' =>  ['host' => $host]])
         ->send();

动态更换域名

调用php推送以后,在安卓端会有一个方法
在这里插入图片描述
收到字符串以后,需要转为json, 这里用的GSON转的。
获取域名以后放入缓存中,webview加载url的时候都是从缓存读取的,没有的话就默认加载我们代码中写死的网址
在这里插入图片描述
放入缓存以后,可以广播方式通知webview更改加载的url 也可以直接退出程序,重新打开程序url就被更新了。

备注册ID和用户绑定

这一点也是突发奇想来的,最近短信费用不够用了,如果能够使用推送消息方式替换短信,就需要把设备ID和用户信息进行一个绑定,这时候就需要安卓和webview进行通信了。

这里介绍最简单的一种,直接在安卓代码获取到设备ID,在加载页面完成以后,直接传到页面上去。

传送代码
在这里插入图片描述
接收代码:

//这里data就是传送过来的 registrationIDEncode
function javacalljswithargs(data){
   //这里可以,把data 传到后台通过session存储用户,和设备注册ID进行一个绑定
}

总结

这里只是做了最简单demo演示,后面还有一些细节性的代码没有给出,比如集成过程遇到的小问题,设备注册ID接收以后格式判断,以及从android 向网页发送数据进行加密传输,APP的混淆防止别人反编译。需要代码可以小窗我。

原文地址:https://blog.csdn.net/abc8125/article/details/122614161

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_48290.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注