Я пытаюсь создать веб-приложение, которое позволит пользователю войти в Facebook. Все работает в Firefox/Chrome/Safari (на телефоне/планшете и на OSX).
Когда приложение запускается на планшете (собственный UIWebview и веб-приложение), оно отлично загружает первую страницу.
Когда пользователь нажимает кнопку «подключиться к Facebook», приложение загружает страницу входа в Facebook.
После того, как пользователь входит в систему (опять же, как в Native UIWebview, так и в веб-приложении), представление становится белым, висящим на URL-адресе: «https://www.facebook.com/dialog/permissions.request?_path=permissions.request&app_id». =[APP_ID]...' - вроде такого быть не должно...
Если я перезапускаю приложение/веб-приложение, пользователь автоматически входит в систему и перенаправляется на страницу успеха.
Что я думаю, вызывает проблему
Когда вы запускаете веб-страницу в браузерах Firefox/Chrome/Safari, диалоговое окно входа в Facebook появляется в виде всплывающего окна или другой вкладки (последнее в родном браузере Safari).
Я считаю, что это проблема с этой всплывающей страницей и тем, как Javascript взаимодействует сам с собой при успешном входе в систему. Что-то с window.close
, где нет корневой страницы для возврата (поскольку веб-приложение и UIWebview имеют только один экземпляр веб-просмотра)... может быть?
Неудачный обходной путь (UIWebview)
Поскольку приложение зависало на ранее упомянутом URL-адресе, я решил добавить оператор if в shouldStartLoadWithRequest(...)
, чтобы заставить UIWebview перейти к успешному URL-адресу.
Он загружает URL-адрес, но затем, прежде чем функция FB.getLoginStatus
функции Javascript SDK Facebook возвращает «Подключено» (она возвращает «Подключено» каждый раз, когда я видел) Функция FB.Event.subscribe('auth.logout' function() {...});
запускается.
Я не понимаю, почему он выводит пользователя из системы, а затем сообщает мне, что пользователь подключен (вошел в систему) - в таком порядке.
Есть какие-нибудь идеи, прежде чем я начну пытаться создать это 100% родное приложение (и мне придется мириться с учетной записью разработчика Apple и отправкой приложения)?
Сценарий входа
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=APP_ID";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<script>
var seccond_page = false;
window.fbAsyncInit = function() {
FB.init({
appId : '[APP_ID]',
status : true,
cookie : true,
xfbml : true,
oauth : true
});
FB.Event.subscribe('auth.login', function(response) {
window.location.href = '<?= $success ?>';
});
FB.Event.subscribe('auth.logout', function(response) {
window.location.reload();
});
FB.login(function(response) {
alert(response.status);
if (response.status) {
if (response.status == 'connected') {
window.location.href = '<?= $success ?>';
}
}
}, {scope: 'email, user_likes, user_status, user_birthday, user_location, publish_checkins'});
$(document).on('click', '#fb_login_button', function() {
FB.login();
});
};
</script>
Страница успеха
<script>
var fb_user_id = '';
var fb_access_token = '';
var user_location = '';
window.fbAsyncInit = function() {
FB.init({
appId : '[APP_ID]',
status : true,
cookie : true,
xfbml : true,
oauth : true
});
FB.getLoginStatus(function(response) {
alert('Response - ' + response.status);
// the auth.logout is fired before the return of this in the failed fix
if (response.status === 'connected') {
if (response.authResponse) {
fb_user_id = response.authResponse.userID
fb_access_token = response.authResponse.accessToken;
}
}
});
FB.Event.subscribe('auth.logout', function(response) {
alert('logout - auth.logout');
// This event is fired before the above function in the failed fix
window.location.href = '<?= site_url('fb_login'); ?>';
});
FB.Event.subscribe('edge.create', function(response){
if (response == '<?= $like_url ?>') {
//action
}
});
};
</script>
Все страницы имеют метатег: <meta name="apple-mobile-web-app-capable" content="yes">