ฉันได้รับคำขอไร้สายเมื่อสองวันก่อน ในฐานะมือใหม่ ฉันยุ่งมาหลายวันแล้ว... มีลิงก์อยู่ในหน้านี้ หากผู้ใช้ติดตั้ง APP แล้ว ให้คลิกเพื่อเปิด APP ที่เกี่ยวข้อง หากผู้ใช้มี ไม่ได้ติดตั้ง คลิกเพื่อเปิดแอปที่เกี่ยวข้อง ฉันค้นหาทางออนไลน์และโดยทั่วไปบอกว่าสามารถทำได้ แต่สถานการณ์จริงไม่เป็นไปในทางที่ดี
แน่นอนว่ามันเป็นเพียงข้อกำหนดหนึ่งเท่านั้น ปัจจุบันนี้ยังมีแอปต่างๆ มากมายที่แชร์ โดยปกติแล้วจะมีปุ่มให้เปิดทันที หากเป็นเช่นนั้น ยังไม่ได้ติดตั้ง ให้ข้ามไปดาวน์โหลด นี่เป็นกลยุทธ์ปกติมากสำหรับการส่งเสริมการขายและการเปลี่ยนเส้นทางการเข้าชม เมื่อเร็วๆ นี้ ผู้จัดการผลิตภัณฑ์ได้หยิบยกความต้องการดังกล่าว โดยทำให้แถบดาวน์โหลดที่เปิดแอปอยู่ เช่น ฟังก์ชัน Toutiao เป็นต้น และฉันจะไม่พูดถึงส่วนที่เหลือ!
มาถึงหัวข้อหลักวันนี้ H5 เปิดหรือเปิดใช้งานแอปท้องถิ่นบนโทรศัพท์มือถือได้อย่างไร เมื่อดูคำตอบบน Baidu และ Google มีเพียงสองประเภทเท่านั้น:
วิธีแรก:โดยการกำหนดค่าสคีมาทางฝั่ง Android โดยตรงใน href ในแท็กของ HTML แน่นอนว่าหากมีการกำหนดค่าโฮสต์อื่น ๆ เพียงปฏิบัติตามการกำหนดค่าและโค้ดฝั่ง Android มีดังนี้:
การกำหนดค่าฝั่ง Android:
<activity android:name = .MainActivity> <intent-filter> <action android:name = android.intent.action.MAIN /> <category android:name = android.intent.category.LAUNCHER /> </intent-filter> <intent-filter> <action android:name=android.intent.action.VIEW/> <category android:name=android.intent.category.DEFAULT/> <หมวดหมู่ android:name=android.intent.category.BROWSABLE/> <data android:host=jingewenku.com android:scheme=abraham/> </intent-filter> </กิจกรรม>
หมายเหตุ: หากมีการกำหนดค่านี้ในหน้าเริ่มต้น จะต้องวางเคียงข้างกันกับป้ายกำกับ ไม่เช่นนั้นจะไม่มีไอคอนของแอปมือถือหลังจากทำงาน โปรดทราบว่าโปรโตคอลสคีมาจะต้องเป็นตัวพิมพ์เล็ก มิฉะนั้นจะมีข้อยกเว้น ที่ไม่สามารถตอบสนองได้!
รหัสเอชทีเอ็ม:
<html> <head> <meta http-equiv=Content-Type content=text/html; <title>ใส่ชื่อที่นี่</title> </head> <body> <a href=abraham: //jingewenku.com/?pid=1>เปิดแอป</a><br/> </body></html>
ต่อไปนี้เราจะดูที่รูปแบบของโปรโตคอล splicing schema:
< a href=[scheme]://[host]/[path]?[query]>เริ่มแอปพลิเคชัน</a>
ความหมายของแต่ละรายการมีดังนี้:
โครงการ: ระบุแอปที่เริ่มต้น ※รายละเอียดจะอธิบายในภายหลัง
โฮสต์: คำอธิบายที่เหมาะสม
เส้นทาง: รหัสที่จำเป็นเมื่อส่งผ่านค่า ※หากไม่มีก็ไม่เป็นไร
แบบสอบถาม: รับคีย์และค่าของค่า ※หากคุณไม่มีก็ไม่เป็นไร
ข้อมูลข้างต้นสามารถใช้เปิดแอปในเครื่องได้แน่นอนเมื่อมีแอปดังกล่าวอยู่ไม่เช่นนั้นจะไม่มีการตอบกลับ
คุณอาจถามว่า schema protocol ที่กำหนดค่าใน Android ไม่ได้รับการกำหนดค่าในโค้ด HTML ด้านบนใช่หรือไม่ เห็นได้ชัดว่าฉันไม่ได้กำหนดค่า pid ทำไมฉันจึงควรเขียนสิ่งนี้ เนื่องจากบางครั้งเมื่อเราเรียกใช้แอปท้องถิ่น เราอาจส่งพารามิเตอร์บางอย่างไปยังแอป เราสามารถกำหนดค่าพารามิเตอร์เหล่านี้ได้ที่นี่ เราเพียงแต่ต้องรับพารามิเตอร์เหล่านี้ใน oncreate เท่านั้น
เจตนาเจตนา = getIntent(); Uri uri = intent.getData(); if (uri != null) { String pid = uri.getQueryParameter(pid);
หากคุณยังต้องการกำหนดค่าโปรโตคอลสคีมาใน Android คุณสามารถทำได้ดังนี้:
Uri uri = getIntent().getData();if(uri != null) { // กรอกข้อมูล url String url = uri.toString(); Log.e(TAG, url: + uri); โครงการ = uri.getScheme(); Log.e(TAG, โครงการ: + โครงการ); // ส่วนโฮสต์ โฮสต์สตริง = uri.getHost(); Log.e(TAG, โฮสต์: + โฮสต์); // ส่วนพอร์ต int port = uri.getPort (); Log.e (TAG, โฮสต์: + พอร์ต); // เส้นทางการเข้าถึง String path = uri.getPath (); Log.e (TAG, เส้นทาง: + เส้นทาง); รายการ <String> pathSegments = uri.getPathSegments(); // แบบสอบถามส่วนสตริงแบบสอบถาม = uri.getQuery(); Log.e(TAG, แบบสอบถาม: + แบบสอบถาม); //รับค่าพารามิเตอร์ที่ระบุ String GoodsId = uri.getQueryParameter(goodsId); Log.e(TAG, GoodsId: + GoodsId);}
วิธีตรวจสอบว่า Schema ถูกต้องหรือไม่:
PackageManager packageManager = getPackageManager();Intent intent = newIntent(Intent.ACTION_VIEW, Uri.parse(abraham://jingewenku.com:8888/goodsDetail?goodsId=10011002));List กิจกรรม <ResolveInfo> = packageManager.queryIntentActivities(intent, 0);บูลีนที่ถูกต้อง = !activities.isEmpty();if(isValid) { startActivity(เจตนา);}
วิธีนี้ยังเป็นวิธีที่ได้รับความนิยมมากที่สุดใน Baidu แต่จะทำให้เกิดปัญหา ข้อกำหนดข้างต้นคือต้องมีการเชื่อมต่อบนหน้าเว็บ หากผู้ใช้ติดตั้งแอปดังกล่าว ให้คลิกเพื่อเปิดแอปที่เกี่ยวข้อง หากไม่ใช่ ติดตั้งแล้ว คลิกเพื่อเปิดการเชื่อมต่อการตั้งค่าที่เกี่ยวข้อง ซึ่งเห็นได้ชัดว่าไม่ตรงตามข้อกำหนดและสามารถใช้ได้เฉพาะกับความต้องการบางอย่างเท่านั้น
วิธีที่สอง:เนื่องจากไม่สามารถกำหนดค่าโปรโตคอลสคีมาใน href ได้ จึงสามารถทำได้ผ่านโค้ด js เท่านั้น ด้วยวิธีนี้เท่านั้นที่สามารถเปิดแอปตามการพิจารณาเมื่อพร้อมใช้งาน และข้ามไปที่ลิงก์ดาวน์โหลดเพื่อดาวน์โหลดเมื่อไม่มี
เรารู้ว่า ไม่ได้ถูกติดตั้ง จากนั้นข้ามไปที่หน้าดาวน์โหลด แน่นอนว่านี่ไม่ใช่สิ่งที่ฉันคิดขึ้นมา แต่เป็นสิ่งที่คนตัวใหญ่บนอินเทอร์เน็ตคิด ที่นี่เราต้องแบ่งย่อยออกเป็นสองสถานการณ์
1. ตื่นขึ้นมาโดยตรง
หมายเหตุ: คุณสามารถเปลี่ยนแอปผ่าน h5 ได้ ตัวอย่างเช่น ไปที่ URL คลิกปุ่ม และเปิดแอปพลิเคชัน หากไม่ได้ติดตั้งแอป ให้ข้ามไปที่หน้าดาวน์โหลด APP ของ App Store โดยตรง ดีขึ้นโดยการคลิก หากติดตั้งด้วยแอป ก็สามารถเปิดใช้งานได้ในเบราว์เซอร์มือถือหลัก ๆ (เบราว์เซอร์ 360, เบราว์เซอร์ uc, เบราว์เซอร์ Sogou, เบราว์เซอร์ QQ, เบราว์เซอร์ Baidu) และไคลเอนต์ QQ WeChat, ลูกค้า Sina Weibo และลูกค้า Tencent Weibo ไม่สามารถปลุกได้
รหัสมีดังนี้:
<html xmlns=http://www.w3.org/1999/xhtml><head><meta http-equiv=Content-Type content=text/html;charset=utf-8><head><script src=http://libs.baidu.com/jquery/1.9.0/jquery.js></script><title>คลิกเพื่อปลุกการสาธิต</title></head><body><style>#zjmobliestart {font -size:40px;}</style><!--Description: คุณสามารถเปลี่ยนแอปผ่าน h5 ได้ ตัวอย่างเช่น เข้าถึง URL คลิกปุ่ม และเปิดแอปพลิเคชัน หากไม่ได้ติดตั้งแอปพลิเคชัน ข้ามไปที่แอพโดยตรง หน้าดาวน์โหลด APP ของ Store โดยคลิก ความเข้ากันได้ดี หากติดตั้งแอปแล้ว สามารถเปิดใช้งานได้ในเบราว์เซอร์มือถือหลักๆ ทั้งหมด (เบราว์เซอร์ 360, เบราว์เซอร์ uc, เบราว์เซอร์ Sogou, เบราว์เซอร์ QQ, เบราว์เซอร์ Baidu) และไคลเอนต์ QQ WeChat, ลูกค้า Sina Weibo และลูกค้า Tencent Weibo ไม่สามารถปลุกได้ --><a href=zjmobile://platformapi/startapp id=zjmobliestart target=_blank>ตื่นขึ้นมาที่ Zhejiang Mobile Mobile Business Hall! </a><script type=text/javascript> function applink(){ return function(){ var clickedAt = +new Date; setTimeout(function(){ !window.document.webkitHidden && setTimeout(function(){ ถ้า ( +วันที่ใหม่ - คลิกเมื่อ < 2000){ window.location = 'https://itunes.apple.com/us/app/zhe-jiang-yi-dong-shou-ji/id898243566#weixin.qq.com'; } }, 500) }; .getElementById(zjmobliestart).onclick = applink(); </script> </body></html>
2. คลิกเพื่อปลุก
หมายเหตุ: คุณสามารถปลุกแอปได้ผ่าน h5 หากคุณไปที่ URL คุณสามารถเปิดแอปพลิเคชันได้โดยตรง หากไม่ได้ติดตั้งแอปพลิเคชัน ให้ข้ามไปที่หน้าดาวน์โหลด APP ของ App Store โดยตรง ความเข้ากันได้ทั่วไป: สามารถปลุกได้ในเบราว์เซอร์โทรศัพท์มือถือหลัก ๆ (เบราว์เซอร์ 360, เบราว์เซอร์ uc, เบราว์เซอร์ Sogou, เบราว์เซอร์ QQ และเบราว์เซอร์ Baidu) WeChat, ลูกค้า QQ, ลูกค้า Sina Weibo และลูกค้า Tencent Weibo ไม่สามารถปลุกได้
รหัสมีดังนี้:
<!Doctype html><html xmlns=http://www.w3.org/1999/xhtml><head><meta http-equiv=Content-Type content=text/html;charset=utf-8><head> <สคริปต์ src=http://libs.baidu.com/jquery/1.9.0/jquery.js></script><title>ปลุกการสาธิตโดยตรง</title></head><body><style>#zjmobliestart{ font -size:40px;}</style><!--คำอธิบาย: คุณสามารถปลุกแอปผ่าน h5 ได้ หากคุณไปที่ URL คุณสามารถเปิดแอปพลิเคชันได้โดยตรง หากไม่ได้ติดตั้งแอปพลิเคชัน APP ให้ข้ามไปโดยตรง ไปที่แอป หน้าดาวน์โหลดแอปของ Store มีความเข้ากันได้ทั่วไป: สามารถเปิดใช้งานได้ในเบราว์เซอร์มือถือหลักๆ ทั้งหมด (เบราว์เซอร์ 360, เบราว์เซอร์ uc, เบราว์เซอร์ Sogou, เบราว์เซอร์ QQ, เบราว์เซอร์ Baidu) ลูกค้า WeChat QQ, ลูกค้า Sina Weibo, ลูกค้า Tencent Weibo ไม่สามารถถูกปลุกได้ --><p id=zjmobliestart>ตื่นขึ้นมาที่ Zhejiang Mobile Mobile Business Hall! </p><script type=text/javascript> function applink(){ window.location = 'zjmobile://platformapi/startapp'; var clickedAt = +new Date; setTimeout(function(){ !window.document.webkitHidden && setTimeout(function(){ if (+new Date - clickedAt < 2000){ window.location = 'https://itunes.apple.com/us/app/zhe-jiang-yi-dong-shou-ji/id898243566#weixin.qq.com'; }, 500) }applink() ;</script> </body></html>
ด้วยวิธีนี้ ความต้องการของเราจึงเสร็จสมบูรณ์ ในระหว่างกระบวนการนี้ เรายังพบกับคำอธิบายของผู้คนที่กระตือรือร้นมากมาย ฉันจะบันทึกไว้ที่นี่ ในตอนแรก บางคนไม่เข้าใจความต้องการของฉัน และคิดว่าฉันกำลังนำไปใช้ในฝั่ง Android พวกเขาขอให้ฉันส่งชื่อแพ็คเกจเพื่อตรวจสอบว่าติดตั้งแอพแล้วหรือไม่ ให้บันทึกวิธีการที่นี่ รหัสจะเป็นดังนี้:
สำหรับวิธีการเพิ่มเติม โปรดดูคลาสเครื่องมือของฉัน: CommonUtilLibrary
คนอื่นคิดว่าฉันต้องการเรียกใช้แอปในเครื่องโดยโหลด webview ในแอป ฉันจะบันทึกไว้ที่นี่ด้วย
webView.setWebViewClient(new WebViewClient(){ @Override บูลีนสาธารณะ shouldOverrideUrlLoading(มุมมอง WebView, String url) { Uri uri=Uri.parse(url); if(uri.getScheme().equals(abraham)&&uri.getHost() เท่ากับ (jingewenku.com)){ สตริง arg0=uri.getQueryParameter(arg0); arg1=uri.getQueryParameter(arg1); }else{ view.loadUrl(url); } กลับจริง;
ควรสังเกตว่าหากมีการเรียกใช้แอปท้องถิ่นใน WeChat WeChat บนโทรศัพท์มือถือจะใช้เบราว์เซอร์ในตัวของ WeChat (คุณสามารถส่งที่อยู่ของหน้าที่ได้รับก่อนหน้านี้บนเซิร์ฟเวอร์ไปยังผู้ติดต่อของคุณคลิก ส่งข้อความเพื่อเปิดหน้าเว็บ) เปิดหน้า HTML แบบธรรมดานั้น หมายเหตุ: ไม่สามารถเปิด Scheme://host/datastring โดยตรงได้ WeChat จะไม่แยกวิเคราะห์สตริงอักขระนี้ลงใน URL แต่จะต้องถูกรวมไว้ในเว็บ หน้าที่จะเรียกดูด้วย WeChat อุปกรณ์เปิดอยู่ เข้ามาแล้วจะเจอหน้าที่เราเพิ่งออกแบบไป ในขณะนี้ การคลิกเพื่อเริ่มแอปพลิเคชันโดยตรงจะไม่ปลุกแอปที่ติดตั้งไว้ก่อนหน้านี้ เนื่องจาก WeChat ได้บล็อกไว้ คุณจึงต้องเลือกเปิดในเบราว์เซอร์จากเมนูที่มุมขวาบน ในขณะนี้ เบราว์เซอร์บางตัวสามารถเริ่มทำงานได้ แต่เบราว์เซอร์บางตัวไม่สามารถทำงานได้ ตัวอย่างเช่น หากเบราว์เซอร์ในตัวบนเครื่องทดสอบ MX4 ของผู้เขียนไม่ทำงาน UC Browser ก็สามารถเริ่มทำงานได้ เบราว์เซอร์บางตัวไม่สามารถปลุกได้ ฉันได้ศึกษาข้อมูลมากมายและไม่สามารถแก้ไขได้ทั้งหมด สิ่งเดียวที่ฉันคิดได้ตอนนี้คือปล่อยให้ส่วนหน้าตัดสินเบราว์เซอร์ที่พบปัญหา ไม่รองรับและควรใช้เบราว์เซอร์ใด หากผู้อ่านท่านใดมีวิธีแก้ปัญหากรุณาฝากข้อความไว้ขอบคุณ!
คำลงท้าย:
เหตุใดฉันจึงไม่สามารถปลุกแอปใน WeChat และจำเป็นต้องเปิดด้วยเบราว์เซอร์
เนื่องจาก WeChat ได้ใช้การป้องกันโครงร่างในการเชื่อมต่อการแชร์ทั้งหมด กล่าวคือ การเรียกไปยังโครงร่างทั้งหมดในการเชื่อมต่อการแชร์ถูกบล็อกโดย WeChat
เหตุใดบางแอปพลิเคชันจึงสามารถปรากฏขึ้นได้ เช่น Dianping และ Didi Taxi
จากมุมมองที่ไม่ใช่ด้านเทคนิค เนื่องจาก Dianping และ Didi Taxi พวกเขาจึงเป็นทั้งลูกทูนหัวและบุตรทางสายเลือดของ WeChat เขามีความเอาใจใส่เป็นพิเศษสำหรับลูกชายของเขา
จากมุมมองทางเทคนิค WeChat มีรายการที่อนุญาตพิเศษ และการเรียกแบบแผนจะไม่ถูกบล็อกสำหรับการเชื่อมต่อที่แชร์ในรายการที่อนุญาต
ไม่เข้าใจเหรอ? ลองยกตัวอย่าง
ตัวอย่างเช่น ลิงก์การแชร์ของ Dianping คือ http://dazhongdianping.share.1.com
ตามรายการที่อนุญาตของ WeChat จะมีรายการ http://dazhongdianping การแชร์ทั้งหมดที่มาจากการเชื่อมต่อนี้จะไม่บล็อกโครงการ
ตัวอย่างเช่น http://dazhongdianping.share.2.com
http://dazhongdianping.share.3.com
แม้แต่บริษัทในเครือของ Dianping ก็สามารถใช้ http://zigongsi.dazhongdianping.share.3.com ได้ ชื่อโดเมนรูทยังอยู่ใน whitelist ดังนั้นจึงสามารถใช้ได้
ณ จุดนี้ ทุกคนควรเข้าใจว่าเป็นไปไม่ได้ที่จะหลีกเลี่ยงปัญหานี้ด้วยการยืมแผนของ Dianping เว้นแต่ลิงก์การแชร์ของคุณจะสามารถเชื่อมโยงกับชื่อโดเมนรากของ Dianping ได้
ควรอธิบายคำถามนี้ให้ชัดเจน อีกสิ่งหนึ่งที่ต้องพูดถึงคือเมื่อต้องดาวน์โหลด APK WeChat จะบล็อกแอปพลิเคชันใด ๆ และลูก ๆ ก็ไม่มีข้อยกเว้น คุณไม่สามารถหลบหนีโดยใช้เบราว์เซอร์เพื่อเปิดได้
ภาคผนวก: แบบแผน URL สำหรับแอปพลิเคชันทั่วไป
1. แอปพลิเคชันเริ่มต้นของระบบ
ชื่อ | โครงการ URL | ตัวระบุบันเดิล |
---|---|---|
ซาฟารี | http:// | |
แผนที่ | http://maps.google.com | |
โทรศัพท์ | โทร: // | |
เอสเอ็มเอส | ข้อความ::// | |
จดหมาย | เมลถึง:// | |
ไอบุ๊คส์ | ไอบุ๊คส์:// | |
แอพสโตร์ | itms-apps://itunes.apple.com | |
ดนตรี | ดนตรี:// | |
วิดีโอ | วิดีโอ::// |
2. ซอฟต์แวร์บุคคลที่สามที่ใช้กันทั่วไป
ชื่อ | โครงการ URL | ตัวระบุบันเดิล |
---|---|---|
คิวคิว | ตรมค: // | |
วีแชท | เว่ยซิน:// | |
เทนเซ็นต์ เว่ยป๋อ | TencentWeibo:// | |
เถาเป่า | เถาเป่า:// | |
อาลีเพย์ | อาลีเพย์:// | |
เว่ยป๋อ | ซินาไวป๋อ:// | |
เว่ยโก้ เว่ยป๋อ | เว่ยโก::// | |
เบราว์เซอร์ QQ | mqqbrowser:// | com.tencent.mttlite |
เบราว์เซอร์ uc | ปลาโลมา:// | com.dolphin.browser.iphone.chinese |
เปิดเบราว์เซอร์ | ohttp:// | com.oupeng.mini |
เบราว์เซอร์ Sogou | โซโกMSE:// | com.sogou.SogouExplorerMobile |
แผนที่ไป่ตู้ | ใบดูแมป:// | com.baidu.map |
โครเมียม | กูเกิลโครม:// | |
ยูกุ | คุณคุ::// | |
จิงตง | openapp.jdmoble:// | |
ทุกคน | เร็นเรน:// | |
เหม่ยถวน | เหมือนกัน: // | |
ร้านค้าหมายเลข 1 | wccbyihaodian:// | |
ฉันจะตรวจสอบ | wcc: // | |
พจนานุกรมโหยวเต่า | yddictproapp: // | |
จือหู | จื่อหู:// | |
ทบทวน | เตี่ยนผิง:// | |
ไมโครดิสก์ | ซินาฟดิสก์:// | |
เดาบันเอฟเอ็ม | doubanradio:// | |
NetEase เปิดคลาส | ntesopen:// | |
ราชานามบัตรรอบด้าน | แคมการ์ด:// | |
คิวคิว มิวสิค | คิวคิวมิวสิค:// | |
วีดีโอเทนเซ็นต์ | สิบวิดีโอ:// | |
ภาพยนตร์ Douban | เดาบันมูฟวี่:// | |
NetEase คลาวด์มิวสิค | ออร์ฟัส: // | |
ข่าวเน็ตอีส | แอปข่าว::// | |
แอปพลิเคชั่น NetEase | แอป::// | |
ลอตเตอรี่ NetEase | เทสไกเปียว:// | |
บันทึกเมฆ Youdao | คุณดาวโน้ต:// | |
ดูเพิ่มเติม | duokan-reader: // | |
ดัชนีคุณภาพอากาศแห่งชาติ | สกปรกปักกิ่ง:// | |
เพลงไป่ตู้ | ไป่ตู้มิวสิค:// | |
ไปที่ห้องครัว | xcfapp: // |
ข้างต้นคือเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการศึกษาของทุกคน ฉันหวังว่าทุกคนจะสนับสนุน VeVb Wulin Network