2015-01-20 37 views
6

Ứng dụng của tôi có lược đồ URL tùy chỉnh và có thể sử dụng liên kết sâu để chuyển thẳng từ URL đến một số nội dung. Tôi muốn nhân rộng hành vi trong ứng dụng Facebook Groups gần đây, cho phép người dùng nhấn nút "Thêm vào màn hình chính" trong ứng dụng, đưa họ đến trang localhost được thiết kế tùy chỉnh trong Safari, cho phép họ chạm vào Chia sẻ của Safari và Thêm vào nút Màn hình chính, sau đó sẽ thêm biểu tượng vào màn hình chính của họ, khi được nhấn, đưa họ vào ứng dụng Nhóm và đến nhóm cụ thể được đề cập.Liên kết tới Safari "Thêm vào Màn hình chính" từ bên trong ứng dụng?

Vấn đề của tôi là nếu tôi gửi liên kết sâu của lược đồ URL tùy chỉnh đến Safari, trước khi người dùng có thể nhấn Thêm vào Màn hình chính, nó sẽ đi theo liên kết đó và kết thúc ngay trong ứng dụng của tôi. Tôi cần phải gửi một cái gì đó để Safari mà sẽ không thực sự làm theo các liên kết sâu, nhưng vẫn sẽ liên kết với nó nếu người dùng thêm nó vào màn hình chủ của họ, và tôi không có ý tưởng làm thế nào để làm điều đó. liên kết được tạo ra

Facebook Groups' trong thanh địa chỉ trình duyệt Safari giống như thế này, có lẽ họ nhúng JavaScript trực tiếp vào URL ?:

data:text/html;charset=UTF-8;base64, <tens of thousands of characters in an alpha-numeric string> 

Bất kỳ ý tưởng gì có nghĩa là, và làm thế nào tôi có thể làm điều gì đó tương tự ?

Trả lời

8

Nếu bạn dán những nhân vật này vào bất kỳ bộ giải mã Base64 trực tuyến, bạn sẽ nhận được như sau:

<!DOCTYPE HTML> 
<html> 

<head id="htmlHead"> 
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;" /> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <meta name="apple-mobile-web-app-capable" content="no" /> 
    <title>Promote Groups or Pages</title> 
    <link rel="apple-touch-icon-precomposed" href="data:image/png;base64, 
</head> 

<body> 
    <a id="redirect" href="fb-groups://group?id=1503507809911018&s=s"></a> 
</body> 

</html> 
<script type="text/javascript"> 
    function jump() { 
     var e = document.getElementById('redirect'); 
     var ev = document.createEvent('MouseEvents'); 
     ev.initEvent('click', true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null); 
     e.dispatchEvent(ev); 
     window.close(); 
    } 
    if (("standalone" in window.navigator) && window.navigator.standalone) { 
     document.body.style.backgroundColor = '#000000'; 
     jump(); 
    } else { 
     var time = 1422371365; 
     var timeout = new Date().getTime()/1000; 
     if (timeout > time + 4) { 
      document.write('</head><body bgcolor="#fff"><div align="center"></div>'); 
      jump(); 
     } else { 
      document.write(
       #### 
         )} 
    } 
</script> 

Thay vì #### có được những điều sau đây:

<style> 
    html, 
    body, 
    div, 
    span, 
    object, 
    iframe, 
    h1, 
    h2, 
    h3, 
    h4, 
    h5, 
    h6 { 
     margin: 0; 
     padding: 0; 
     border: 0; 
     font-size: 100%; 
     vertical-align: baseline; 
     font-family: HelveticaNeue-Light, sans-serif; 
     -webkit-touch-callout: none; 
     -webkit-user-select: none; 
     -khtml-user-select: none; 
     -moz-user-select: none; 
     -ms-user-select: none; 
     user-select: none 
    } 
    a { 
     color: inherit; 
     text-decoration: none 
    } 
    #headerBox { 
     width: 100%; 
     height: 48px; 
     border-bottom: .5px solid #979797; 
     background-color: #F6F6F6; 
     text-align: center 
    } 
    #popoverBox { 
     position: absolute; 
     bottom: 15px; 
     width: 290px; 
     height: 132px; 
     -webkit-border-radius: 11px; 
     border-radius: 11px; 
     background-color: #2891F7; 
     border: none; 
     margin-left: -145px; 
     left: 50% 
    } 
    #popoverBox:after { 
     top: 100%; 
     left: 50%; 
     border: solid transparent; 
     content: " "; 
     height: 0; 
     width: 0; 
     position: absolute; 
     pointer-events: none; 
     border-color: rgba(40, 145, 247, 0); 
     border-top-color: #2891F7; 
     border-width: 13px; 
     margin-left: -13px 
    } 
    .icon { 
     margin-bottom: 5px 
    } 
    #groupIconContainer { 
     margin-left: 40px; 
     width: 60px; 
     float: left; 
     height: 100% 
    } 
    #groupIcon { 
     height: 60px; 
     width: 60px; 
     -webkit-border-radius: 14px; 
     border-radius: 14px; 
     background-color: #FFF; 
     margin-top: 25px 
    } 
    #addToHomeIconContainer { 
     margin-right: 40px; 
     width: 60px; 
     float: right; 
     height: 100% 
    } 
    #addToHomeIcon { 
     margin-top: 25px 
    } 
    #arrow { 
     margin: 0 auto; 
     display: block; 
     margin-top: 49px 
    } 
    #infoText { 
     color: #141823; 
     font-size: 18px; 
     line-height: 28px; 
     text-align: center; 
     width: 280px; 
     height: 160px; 
     margin: auto; 
     position: absolute; 
     top: 0; 
     left: 0; 
     bottom: 0; 
     right: 0 
    } 
    .iconLabelContainer { 
     font-size: 12px; 
     color: #FFF; 
     line-height: 14px; 
     width: 100px; 
     height: 30px; 
     margin-left: -20px; 
     text-align: center 
    } 
    #groupCoverImage { 
     box-sizing: border-box; 
     -webkit-box-sizing: border-box; 
     background-size: cover; 
     background-position: center; 
     background-image: url("data:image/png;base64, 
     width: 52px; 
     height: 52px; 
     border-radius: 50%; 
     position: relative; 
     top: 4px; 
     left: 4px; 
     border: 0.5px solid rgba(0, 0, 0, 0.10); 
    } 
</style> 

<body> 
    <div id="headerBox"><span style="font-size:17px;color:#2891F7;line-height:20px;position:relative;top:13.5px"><a href="fb-groups://">Отмена</a></span> 
    </div> 
    <div id="infoText">Коснитесь кнопки 
     <svg style="vertical-align:text-bottom" width="22px" height="30px" viewbox="0 0 44 60" version="1.1"> 
      <defs></defs> 
      <g id="Final" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 
       <g id="Add-Group-to-Home-Screen" transform="translate(-299.000000, -459.000000)"> 
        <g id="Tap-+-below-+-Share-Icon" transform="translate(231.000000, 458.000000)"> 
         <g id="share-icon" transform="translate(60.000000, 0.000000)"> 
          <path d="M20.4,12 L30,2.4 L39.6,12" id="Shape" stroke="#3F75FF" stroke-width="2"></path> 
          <path d="M30,39.0000013 L30,2.7996" id="Shape" stroke="#3F75FF" stroke-width="2"></path> 
          <rect id="Rectangle-path" x="0" y="0" width="60" height="60"></rect> 
          <path d="M20.2682927,20 L9,20 L9,60 L51,60 L51,20 L39.7317073,20" id="Shape" stroke="#3F75FF" stroke-width="2"></path> 
         </g> 
        </g> 
       </g> 
      </g> 
     </svg> ниже, 
     <br>Затем коснитесь &ldquo;Добавить на основной экран&rdquo;</div> 
    <div id="popoverBox"> 
     <div id="groupIconContainer"> 
      <div id="groupIcon" class="icon"> 
       <div id="groupCoverImage"></div> 
      </div> 
      <div class="iconLabelContainer">Promote Groups or Pages</div> 
      <!-- Replace with dynamic name --> 
     </div> 
     <div id="addToHomeIconContainer"> 
      <svg id="addToHomeIcon" width="60px" height="60px" viewbox="0 0 120 120" version="1.1"> 
       <defs></defs> 
       <g id="Add-Group-to-Home-Screen-Spec" transform="translate(-410.000000, -802.000000)"> 
        <g id="Add-to-Home-Screen" transform="translate(367.000000, 802.000000)"> 
         <g id="Add-to-Home-Screen-Icon" transform="translate(43.000000, 0.000000)"> 
          <rect id="Rectangle-6" fill="#FFFFFF" x="0" y="0" width="120" height="120" rx="28"></rect> 
          <rect id="Rectangle-6" fill="#686870" x="25" y="25" width="70" height="70" rx="15"></rect> 
          <path d="M58,58 L58,46.991617 C58,45.8978404 58.8954305,45 60,45 C61.1122704,45 62,45.8916773 62,46.991617 L62,58 L73.008383,58 C74.1021596,58 75,58.8954305 75,60 C75,61.1122704 74.1083227,62 73.008383,62 L62,62 L62,73.008383 C62,74.1021596 61.1045695,75 60,75 C58.8877296,75 58,74.1083227 58,73.008383 L58,62 L46.991617,62 C45.8978404,62 45,61.1045695 45,60 C45,58.8877296 45.8916773,58 46.991617,58 L58,58 Z" id="Rectangle-8" fill="#FFFFFF"></path> 
         </g> 
        </g> 
       </g> 
      </svg> 
      <div class="iconLabelContainer">Добавить на 
       <br>основной экран</div> 
     </div> 
     <svg id="arrow" width="12px" height="20px" viewbox="0 0 24 40" version="1.1"> 
      <defs></defs> 
      <g id="Explorations" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 
       <g id="Add-Group-to-Home-Screen" transform="translate(-307.000000, -847.000000)" stroke-linecap="round" stroke="#FFFFFF" stroke-width="5"> 
        <g id="Group" sketch:type="MSLayerGroup" transform="translate(30.000000, 752.000000)"> 
         <path d="M297,132 L280,115 L297,98" id="Path-35" transform="translate(288.500000, 115.000000) rotate(-180.000000) translate(-288.500000, -115.000000) "></path> 
        </g> 
       </g> 
      </g> 
     </svg> 
    </div> 
    <div id="popoverNub"></div>'); 

Vì vậy, tôi tin rằng thực hiện của họ là như sau:

1) Có một máy chủ web được nhúng trong ứng dụng (chẳng hạn như RoutingHTTPServer). Nó đang chạy trên một số cảng như 5555 và cấu hình để trở lại một trang với nội dung như sau:

<HTML><script>window.location.href=[data:text/html;charset=UTF-8;base64, tens of thousands of characters in an alpha-numeric string]</script></HTML> 

Cú pháp là sai, nhưng ý tưởng là để thay thế các URL hiện tại (http://localhost:5555) với dữ liệu mã hóa base64.

2) Khi bạn nhấn add to home page trong ứng dụng, nó sẽ mở liên kết http://localhost:5555 trong Safari, máy chủ web bên trong ứng dụng phản hồi với trang web, chứa tập lệnh thay thế URL bằng dữ liệu được mã hóa base64 (dữ liệu này chứa thời điểm hiện tại, khi kịch bản được tạo ra)

3) Từ các nội dung của mã hóa base64 dữ liệu bạn có thể thấy rằng có hai kiểm tra:

a) nếu ứng dụng đang chạy không trong Safari, nhưng độc lập

b) nếu một thời gian trôi qua kể từ khi tập lệnh được phát hành ed

Nếu bất kỳ câu nào trong số này là đúng, bạn sẽ được chuyển hướng đến ứng dụng bằng liên kết sâu. Nếu cả hai đều sai, trang nhắc người dùng thêm liên kết đến màn hình chính được hiển thị (đó là những gì tôi đã thay thế bằng ####).

Khi liên kết được thêm vào màn hình chính, tất cả các tập lệnh và trang web này được nhúng vào liên kết đó dưới dạng dữ liệu được mã hóa base64.

+1

Điều này có vẻ hoàn toàn đúng - cảm ơn rất nhiều vì đã đào sâu vào điều này! – Luke

+0

Tính năng này hoạt động như thế nào trong nền?Ví dụ: khi bạn chạm vào liên kết và mở trang web trong Safari, ứng dụng sẽ không còn chạy nền trước nữa để ứng dụng xử lý yêu cầu HTTP trong nền như thế nào? – Crashalot

Các vấn đề liên quan