웹 프론트엔드 HTML 튜토리얼 Android Native App与WebView交互技巧_html/css_WEB-ITnose

Android Native App与WebView交互技巧_html/css_WEB-ITnose

Jun 21, 2016 am 08:46 AM

这次项目中有一个主页面完全是H5的页面,要求H5调用Native,js交互传值,看起来貌似很简单,网上教程一大堆,但是在实际开发过程中还是遇到很多问题,在这里记录一下。

  1. 首先,设置user agent,使前端可区分请求来自APP ,这里我设置的是"android_app/1.0.0",名称加版本号,具体设置什么大家可随意。
WebSettings settings = webView.getSettings();String ua = settings.getUserAgentString();settings.setUserAgentString(ua + "; android_app/1.0.0");
로그인 후 복사

2.H5页面的登录,因为我们的应用不需要登录也能浏览,H5的页面有些也是不需要登陆的,所以点击H5页面需要登录的地方,要跳转到Native的页面登录,登录成功刷新H5页面,设置cookie,使WebView页面保持登录状态,具体代码如下:注:WebSettings的一些设置一定要放到设置cookie前面执行。设置cookie要注意作用域的问题,以及setCookie的时候最好分步设置,大家可以看下面的代码,我setCookie()了四次,不要把所有字符串拼接起来再一次setCookie,一次setCookie可能只会设置成功第一个分号前的cookie值。

public void synCookies(Context context, String host, String cookies) {        try {            CookieSyncManager.createInstance(context);            CookieManager cookieManager = CookieManager.getInstance();            // 5.0以上版本的webview做了较大的改动,如:同步cookie的操作已经可以自动同步、但前提是我们必须开启第三方cookie的支持。            // cookieManager.setAcceptThirdPartyCookies(webView, true);//5.0以下的手机崩溃            cookieManager.setAcceptCookie(true);            cookieManager.removeSessionCookie();//移除            cookieManager.removeAllCookie();            //base64加密//            String base64Cookies = Base64Utils.encodeStr(getCookies());            //根据RFC822规定,BASE64Encoder编码每76个字符,还需要加上一个回车换行。            //使用 commons-codec-1.10.jar 不会换行而且效率更高            //这里我使用的是sun.misc.BASE64Decoder.jar,每76个字符会换行,所以下面去掉换行,为什么不用上面的呢,使用commons-codec-1.10.jar,Android Studio编译提示方法重复,没找到解决办法。//            base64Cookies = base64Cookies.replace("\n", "");//            Log.i("base64Cookies:", base64Cookies);            Calendar calendar = Calendar.getInstance();            calendar.add(Calendar.DAY_OF_MONTH, 7);            String expiresTime = calendar.getTime().toGMTString();            Log.i("expiresTime =", expiresTime);            //分开设置,不然只会设置第一个分号之前的cookie//            cookieManager.setCookie(host, "Token=" + base64Cookies);            //不加密            cookieManager.setCookie(host, "Token=" + cookies);            //注意host的值,类似于这个网址:http://www.jianshu.com/writer#/notebooks/2498434/notes/4304102/preview,host可以取:www.jianshu.com或者.jianshu.com,注意作用域,不要把整个url都放上了。            cookieManager.setCookie(host, "Domain=" + host);            cookieManager.setCookie(host, "Path=/");            // Expires变量是一个只写变量,它确定了Cookie有效终止日期。该属性值DATE必须以特定的格式来书写:            // 星期几,DD-MM-YY HH:MM:SS GMT,GMT表示这是格林尼治时间。反之,不以这样的格式来书写,系统将无法识别。            // 该变量可省,如果缺省时,则Cookie的属性值不会保存在用户的硬盘中,而仅仅保存在内存当中,Cookie文件将随着浏览器的关闭而自动消失。            cookieManager.setCookie(host, "Expires=" + expiresTime);            CookieSyncManager.getInstance().sync();            String newCookie = cookieManager.getCookie(host);            if (newCookie != null) {                Log.i("getCookie:", newCookie);            }        } catch (Exception e) {            Log.e("failedCookie=%s", e.toString());        }    }
로그인 후 복사

3.自定义scheme、js交互传值、调用js方法及document对象

例如:登录scheme为 goto://just/loginref=http://www.baidu.com&callback=loginWeb  webView.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                //1.登录scheme    url = goto://just/login?callback=loginWeb                if (url.startsWith("goto://just/login")) {                    //登录,跳转到native得LoginActivity                    //成功后在onActivityResult()方法中执行js的回调方法loginWeb传toekn值给H5                    return true;                    //2.跳转新activity scheme    url = goto://just/newweb?ref=http://www.baidu.com                } else if (url.startsWith("goto://just/newweb")) {                    //页面加载不在本页webview加载,而是新打开此MainActivity(标准模式,为了循环复用)                    String ref = "http://www.baidu.com";                    Intent intent = new Intent(MainActivity.this, MainActivity.class);                    intent.putExtra("webUrl", ref);                    startActivity(intent);                    return true;                }                return super.shouldOverrideUrlLoading(view, url);            }            @Override            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {                super.onReceivedError(view, request, error);                //页面错误                llError.setVisibility(View.VISIBLE);            }            public void onPageFinished(WebView view, String url) {                Log.d("WebView", "onPageFinished ");                //获取整个页面的Html                view.loadUrl("javascript:window.weixinObj.getHtml('<head>'+" +                        "document.getElementsByTagName('html')[0].innerHTML+'</head>');");                //通过document.title 获取页面的title                view.loadUrl("javascript:window.weixinObj.getTitle(document.title)");                //此方法也可以通过document.title 获取标题,但是需要Api19才能使用//                view.evaluateJavascript("document.title", new ValueCallback<String>() {//                    @Override//                    public void onReceiveValue(String title) {////                    }//                });                super.onPageFinished(view, url);            }        }); @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        //登录页返回后执行        String callback = "loginWeb";        synCookies(this, host, cookies);        webView.loadUrl("javascript:" + callback + "('" + cookies + "')");        webView.reload();    } private class InterfaceObject {        @JavascriptInterface        public void getHtml(String html) {            //获取html的内容        }        @JavascriptInterface        public void getTitle(String title) {            //获取标题        }    }
로그인 후 복사

4.以上是我在项目中使用到的一些交互,经过测试是可用的,其实上面写的这些网上有很多,但是比较分散,我就自己总结了一下,例子无法运行的(没有调试,可能有些逻辑错误),因为没有网页测试,如果使用本地html的也不好模拟网络上环境,所以只写了一些逻辑,需要大家自行写h5测试。

资源:Example下载

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

& lt; Progress & Gt의 목적은 무엇입니까? 요소? & lt; Progress & Gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:34 PM

이 기사는 HTML & lt; Progress & Gt에 대해 설명합니다. 요소, 그 목적, 스타일 및 & lt; meter & gt의 차이; 요소. 주요 초점은 & lt; progress & gt; 작업 완료 및 & lt; meter & gt; Stati의 경우

& lt; datalist & gt의 목적은 무엇입니까? 요소? & lt; datalist & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:33 PM

이 기사는 HTML & LT; Datalist & GT에 대해 논의합니다. 자동 완성 제안을 제공하고, 사용자 경험을 향상시키고, 오류를 줄임으로써 양식을 향상시키는 요소. 문자 수 : 159

HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? Mar 17, 2025 pm 12:20 PM

기사는 HTML5 크로스 브라우저 호환성을 보장하기위한 모범 사례에 대해 논의하고 기능 감지, 점진적 향상 및 테스트 방법에 중점을 둡니다.

& lt; meter & gt의 목적은 무엇입니까? 요소? & lt; meter & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:35 PM

이 기사는 HTML & lt; meter & gt에 대해 설명합니다. 범위 내에 스칼라 또는 분수 값을 표시하는 데 사용되는 요소 및 웹 개발의 일반적인 응용 프로그램. & lt; meter & gt; & lt; Progress & Gt; 그리고 Ex

html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? Mar 12, 2025 pm 04:05 PM

이 기사는 html5 & lt; time & gt; 시맨틱 날짜/시간 표현 요소. 인간이 읽을 수있는 텍스트와 함께 기계 가독성 (ISO 8601 형식)에 대한 DateTime 속성의 중요성을 강조하여 Accessibilit를 향상시킵니다.

HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? Mar 17, 2025 pm 12:27 PM

이 기사에서는 브라우저에서 직접 사용자 입력을 검증하기 위해 필요한, Pattern, Min, Max 및 Length 한계와 같은 HTML5 양식 검증 속성을 사용하는 것에 대해 설명합니다.

뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? 뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? Mar 20, 2025 pm 05:56 PM

이 기사는 모바일 장치의 반응 형 웹 디자인에 필수적인 Viewport Meta Tag에 대해 설명합니다. 적절한 사용이 최적의 컨텐츠 스케일링 및 사용자 상호 작용을 보장하는 방법을 설명하는 반면, 오용은 설계 및 접근성 문제로 이어질 수 있습니다.

& lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? & lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? Mar 20, 2025 pm 06:05 PM

이 기사는 & lt; iframe & gt; 외부 컨텐츠를 웹 페이지, 공통 용도, 보안 위험 및 객체 태그 및 API와 같은 대안을 포함시키는 태그의 목적.

See all articles