ios - porque - no puedo abrir facebook en mi iphone
Iniciar sesiĆ³n en Facebook Comentarios iOS(swift) no responde (3)
Estoy tratando de incorporar Facebook Comments Plugin en mi aplicación nativa.
El cuadro de comentarios de Facebook se presenta bien.
pero cuando presiono "Iniciar sesión en Facebook para publicar un comentario", no ocurre nada. Estoy tratando de ver el evento con esta función: func userContentController(userContentController: WKUserContentController,didReceiveScriptMessage message: WKScriptMessage)
pero no está funcionando.
Aquí está mi código:
import UIKit
import WebKit
class FacebookCommentsViewController: UIViewController, WKScriptMessageHandler{
var webView: WKWebView!
override func viewDidLoad()
{
super.viewDidLoad()
// WKWebView
let contentController = WKUserContentController();
contentController.addScriptMessageHandler(self,name: "callbackHandler")
let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
webView = WKWebView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height), configuration: configuration)
webView.scrollView.bounces = false
self.view.addSubview(webView)
let facebookCommentsURL = "<!DOCTYPE html><html> <head> <meta name=/"viewport/" content=/"width=device-width, initial-scale=1.0/"> </head> <body> <div id=/"fb-root/"></div><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=/"http://connect.facebook.net/en_US/all.js#xfbml=1&appId=527957123932456&status=0/"; fjs.parentNode.insertBefore(js, fjs);}(document, ''script'', ''facebook-jssdk''));</script> <div class=/"fb-comments/" data-href=/url-to-my-item data-width=/"470/" data-num-posts=/"5/"></div></body></html>"
webView.loadHTMLString(facebookCommentsURL, baseURL: NSURL(string:"my base url"))
}
func userContentController(userContentController: WKUserContentController,didReceiveScriptMessage message: WKScriptMessage)
{
print(message.name)
}
}
¿Qué estoy haciendo mal?
¿Tu JS está mal formado? El generador de código generó esto para mí:
<div id="fb-root"></div>
<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/sdk.js#xfbml=1&version=v2.5";
fjs.parentNode.insertBefore(js, fjs);
}(document, ''script'', ''facebook-jssdk''));
</script>
<!DOCTYPE html>
<html>
<head>
<meta name=/ "viewport/" content=/ "width=device-width, initial-scale=1.0/">
</head>
<body>
<div id=/ "fb-root/"></div>
<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 = /"http://connect.facebook.net/en_US/all.js#xfbml=1&appId=527957123932456&status=0/"; fjs.parentNode.insertBefore(js, fjs);}(document, ''script'', ''facebook-jssdk''));
</script>
<div class=/ "fb-comments/" data-href=/url-to-my-item data-width=/ "470/" data-num-posts=/ "5/"></div>
</body>
</html>
Por lo que puedo decir, parece que es?
editar: oh, tal vez no. Las otras partes de la cuerda se toman fuera de contexto.
¡Fount it!
¡He reemplazado WKWebView
con UIWebView
y todo funcionó!
Cuando el inicio de sesión fue exitoso, actualice webView:
func webViewDidFinishLoad(webView: UIWebView)
{
let currentURL : NSString = (webView.request?.URL!.absoluteString)!
if (currentURL.containsString("/login_success"))
{
self.reloadFacebookComments()
}
self.updateFramesAccordingToWebViewcontentSize()
}
No es necesario cambiar las vistas web. El principal problema es que el script de Facebook está intentando abrir esta página en la página nueva (_blank), por lo tanto, el script no funciona en la vista web. Para evitar este problema en WKWebView
necesita tener la implementación de WKUIDelegate
en su controlador y debe agregar _webView.UIDelegate = self
este código en su método viewDidLoad
.
A continuación, llame a este método delegado para evitar este problema:
en el Objective C
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
if (!navigationAction.targetFrame.isMainFrame) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
en Swift
optional func webView(_ webView: WKWebView, createWebViewWithConfiguration configuration: WKWebViewConfiguration,
forNavigationAction navigationAction: WKNavigationAction,
windowFeatures windowFeatures: WKWindowFeatures) -> WKWebView?{
if navigationAction.targetFrame.isMainFrame == nil {
webView.loadRequest(navigationAction.request)
}
return nil
}