Я видел нечто похожее, что происходит с логинами FB других сайтов (например, Groupon), если вы загружаете их в UIWebView
.Если это та же самая проблема (которая, я думаю, есть), она равна из-за того, что Facebook открывает окно входа в систему во всплывающем окне, как вы и предполагали.Что происходит в обычном браузере, так это то, что другое окно (всплывающее окно) открывается для входа в систему, а затем, когда пользователь входит в систему, это окно входа возвращается в исходное окно, чтобы сказать, что оно вошло в систему. Возможно, они используют EasyXDM или что-то подобное,Кажется, есть несколько уровней стратегии взаимодействия, включая Flash и postMessage
.
. На iOS (и Android) это должно означать, что в конечном итоге он будет взаимодействовать с postMessage
.Если вы отслеживаете URL, которые проходят через ваш UIWebView
, вы должны увидеть что-то вроде этого в конце:
https://s-static.ak.fbcdn.net/connect/xd_proxy.php#<lots of stuff>&relation=opener&transport=postmessage&<lots more stuff>
UIWebView
не поддерживает несколько окон, поэтому он не может postMessage
вернуться кисходная страница, поскольку она больше не загружается.Что вы можете сделать, это обнаружить, когда UIWebView
пытается загрузить страницу входа в FB, и загрузить ее в отдельный UIWebView
.Теперь у вас есть два окна для работы.
К сожалению, этого все еще недостаточно, так как когда JavaScript на странице FB пытается запустить window.opener.postMessage
или window.parent.postMessage
, он не работает, потому что window.parent
и window.opener
не установлены на соответствующиеокно.Я не знаю хорошего способа сделать это в iOS (в отличие от этого, Android предоставляет соответствующий API для этого).
Способ, который я обошел, заключается в том, чтобы взломать объект JavaScript, чтобы обернуть ихзвонки.Примерно так:
window.opener={};
window.opener.postMessage = function(data,url) {
// signal your code in objective-c using some strategy
};
window.parent = window.opener;
Существует несколько способов вызова Objective-C из JavaScript, включая из официальных документов .Вы можете добавить этот код на страницу статического входа в FB, о которой я упоминал до использования stringByEvaluatingJavaScriptFromString:
.Я не мог найти подходящее время для этого, поэтому я просто вставляю его после загрузки страницы и вызываю doFragmentSend()
, который является методом FB JavaScript на той статической странице, который обычно вызывается при загрузке тела.
Итактеперь все, что нам нужно сделать, это передать эти данные в исходный UIWebView
, вызвав postMessage
.Это будет выглядеть примерно так:
NSString *post = [NSString stringWithFormat:@"window.postMessage('%@', '*');", data];
[webView stringByEvaluatingJavaScriptFromString:post];
Если вы еще не заметили, это огромный грязный хак, и я, вероятно, не рекомендовал бы его, если у вас нет альтернативы, но он работает длямне.