2013-05-05 31 views
14

Tôi đã phát triển một ứng dụng cho iOS và Android truy cập tệp HTML từ máy chủ web của tôi bằng trình duyệt trong ứng dụng (Webview).Phát hiện trình duyệt trong ứng dụng (WebView) bằng PHP/Javascript

Tôi không muốn người dùng có thể truy cập tệp này mà không cần sử dụng ứng dụng. Có khả năng phát hiện, nếu người dùng đang truy cập tệp bằng ứng dụng hoặc trực tiếp qua trình duyệt trên điện thoại thông minh/máy tính bảng/máy tính này? Tôi nghĩ rằng một giải pháp với PHP là tốt hơn nhiều, bởi vì Javascript có thể được tắt. Ít nhất Google Analytics có thể phân biệt giữa Safari và Safari (trong ứng dụng). Nó sẽ hoạt động với mọi phiên bản iOS và Android.

Cảm ơn sự giúp đỡ của bạn.


Giải pháp

Sau nhiều nỗ lực cuối cùng tôi đã tìm thấy một giải pháp làm việc cho tôi!

iOS: Bạn có thể phát hiện sự khác biệt giữa Safari và trình duyệt trong ứng dụng bằng tác nhân người dùng. Có lẽ có một giải pháp đẹp hơn, nhưng nó hoạt động.

// Safari (in-app) 
if ((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false) { 
    echo 'Safari (in-app)'; 
} 

Android: Tên gói từ các ứng dụng được lưu trữ trong các biến PHP $_SERVER['HTTP_X_REQUESTED_WITH'].

// Android (in-app) 
if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app") { 
    echo 'Android (in-app)'; 
} 

Vì Tim van Elsloo đã lưu ý tiêu đề HTTP có thể bị giả mạo và điều này không hoàn toàn an toàn.

+0

giải pháp iOs sẽ thất bại nếu trang được mở từ các trình duyệt khác. Sau một vài thử nghiệm, tôi đã tinh chế nó một chút. Kiểm tra tại đây: http: // stackoverflow.com/questions/2738766/iphone-webapps-là-có-một-cách-để-phát hiện-như-nó-đã-được-nạp-home-screen-vs-safar/20757993 # 20757993 –

Trả lời

5

Tôi không chắc chắn về Android, nhưng khi bạn đang sử dụng SDK của iOS UIWebView, nó sẽ gửi tên và phiên bản ứng dụng của bạn như một phần của tác nhân người dùng (YourApp/1.0).

Sau đó bạn có thể sử dụng PHP để kiểm tra xem webview trong ứng dụng của bạn đang được sử dụng hay không:

if (strpos($_SERVER['HTTP_USER_AGENT'], 'YourApp/') !== false) 

Tôi nghĩ Android làm điều gì đó tương tự.

+1

Xin lưu ý rằng điều này rõ ràng có thể là giả mạo bởi trình duyệt trên máy tính để bàn (bằng cách đặt tiêu đề HTTP "giả"), vì vậy bạn không nên dựa vào điều này từ góc độ bảo mật. – elslooo

+2

Cảm ơn sự giúp đỡ nhanh chóng của bạn. Rất tiếc, tác nhân người dùng không bao gồm tên ứng dụng. Ít nhất không phải trong nỗ lực của tôi. – ohh2ahh

+0

Bạn đang sử dụng 'UIWebView'? Nó phải giống như: ' /1.0 CFNetwork/459 Darwin/10.2.0'. Nếu nó không phải là (mà tôi nghi ngờ), sau đó bạn luôn có thể cố gắng làm một cái gì đó như http://stackoverflow.com/questions/478387/change-user-agent-in-uiwebview-iphone-sdk hoặc http: // stackoverflow. com/questions/8487581/uiwebview-ios5-changing-user-agent. – elslooo

1

đang Giải pháp:

$isWebView = false; 
if((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false)) : 
    $isWebView = true; 
elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH'])) : 
    $isWebView = true; 
endif; 

if(!$isWebView) : 
    // Android or iOS Webview 
else : 
    // Normal Browser 
endif; 
0

Đối với Android WebView, tham khảo các liên kết từ nhà phát triển Chrome - https://developer.chrome.com/multidevice/user-agent#webview_user_agent

Đã có gợi ý có sẵn trong chuỗi user agent như "di động", "wv".

Bạn có thể sử dụng giống như

if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false) 

hoặc

if (strpos($_SERVER['HTTP_USER_AGENT'], 'wv') !== false) 

để phát hiện nếu người dùng là một WebView Android.

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