2012-06-25 40 views
15

Tôi đang tạo một ứng dụng web iOS (ví dụ: trang HTML chạy ở chế độ độc lập - không có Safari chrome - khi dấu trang của trang được thêm vào màn hình chính).FB.login dòng chảy bị hỏng cho iOS WebApp

Tôi có một nút bấm onclick gọi FB.login(). Khi ở chế độ độc lập, webapp chuyển hướng đến trang đăng nhập facebook (như mong đợi), tuy nhiên sau đó, tôi bị kẹt trên màn hình trắng (tôi không được yêu cầu xác thực vì tôi đã có, nhưng tôi tưởng tượng rằng màn hình xác thực sẽ xảy ra trước màn hình trắng) và không được đưa trở lại vào webapp.

Cùng một luồng trong ứng dụng Safari hoạt động như mong đợi. Nhấp vào cuộc gọi đăng nhập FB.login(), mở trang mới nơi bạn được yêu cầu đăng nhập vào Facebook, sau khi bạn đăng nhập và xác thực ứng dụng, trang đó đóng và bạn được đưa trở lại trang gốc.

Dường như ở chế độ độc lập, có sự cố với "trang thứ hai" khi đóng đăng nhập FB và chuyển hướng trở lại ứng dụng (không có). Và dòng chảy bị phá vỡ.

Có cách giải quyết nào cho vấn đề này không?

Cảm ơn,
-Esa

+0

Chỉ cần để chia sẻ kinh nghiệm của tôi, nếu có ai đến đây một lần nữa: tôi giải quyết bằng cách đơn giản thay thế nút bằng liên kết html đơn giản thành: 'https://www.facebook.com/dialog/oauth/?client_id= [MY_APP_ID] & redirect_uri = [URL_TO_REDIRECT_AFTER_PERMISSIONS] & scope = [COMMA_SEPARATED_SCOPES]' – Stormsson

Trả lời

9

Bạn có thể thử các cách giải quyết dưới đây. Nó làm việc cho tôi. Trong thiết bị di động, nó chuyển hướng đến url xác thực phía máy khách.

var isMobile = false; 
try { 
    isMobile = (window.location.href == top.location.href && window.location.href.indexOf("/mobile/") != -1); 
} catch (e) {} 
if (!isMobile) { 
    FB.login(); 
} else { 
    var permissionUrl = "https://m.facebook.com/dialog/oauth?client_id=" + appId + "&response_type=code&redirect_uri=" + redirectPage + "&scope=" + permissions; 
    window.location = permissionUrl; 
    return; 
} 
+0

Cảm ơn! Tôi thực sự đã làm một cái gì đó tương tự, lấy cảm hứng từ điều này: 'FB.login (chức năng (phản hồi) {/ * stuff * /}, {redirect_uri: chuyển hướng, phạm vi: quyền}); ' Nó ném tôi trở lại ứng dụng. Chỉ có vấn đề là nó không lưu trạng thái của ứng dụng của tôi, và có người dùng bắt đầu lại, nhưng nó hoạt động tốt nếu không. Ngoài ra, tôi đã thay thế logic isMobile bằng (kiểm tra useragent, đây là trang web chỉ dành cho thiết bị di động, vì vậy tôi không cần bất kỳ sự sụt giảm nào cho màn hình) – Esaevian

+0

Tôi cũng đang sử dụng tùy chọn redirect_uri không có giấy tờ ở chế độ độc lập, nhưng nó gần đây đã ngừng làm việc cho tôi, để lại cho tôi vấn đề màn hình trắng trống một lần nữa. Tôi hiện đang sử dụng phương pháp trên, chuyển window.location sang điểm cuối oauth của facebook. Chuyển hướng hoạt động, mặc dù ứng dụng web tải lại từ đầu. Tôi có thể sống với điều đó. – Mike

+0

điều này làm việc cho tôi, cảm ơn, tôi đã nhận được khá thất vọng trước khi tôi tìm thấy điều này! – asutherland

7

tôi đã sử dụng sau đây để phát hiện nếu anh ở chế độ màn hình chủ và làm điều đúng cho phù hợp:

if ("standalone" in navigator && navigator.standalone) { 
    var permissionUrl = "https://m.facebook.com/dialog/oauth?client_id=" + appId + "&response_type=code&redirect_uri=" + window.location + "&scope=" + app_permissions; 
    window.location = permissionUrl; 
} else { 
    FB.login(
    function(response) { 
     ... 
    }, 
    {scope: app_permissions} 
); 
} 
+0

Tuyệt vời! Cảm ơn bạn @Max rất nhiều cho đoạn mã này :) – neoswf

+0

Giải pháp này không hoạt động, nó được bây giờ ở đâu? Có các bước khác không? – SSA