3

要約すると、 edge.createはUIWebView内の埋め込みHTMLでの起動を停止しました(そしてしばらくの間コードで何も変更しませんでした)-どのようにそれを取り戻すことができますか?


Facebookの「いいね」ボタンが付いたUIWebViewを備えたiOSアプリケーションがあります。 ここに画像の説明を入力してください

このダイアログが表示される前にユーザーがFacebookにログインするため、ログインロジックは発生しません。

「いいね」/「嫌い」をクリックできますが、正常に機能しますが、以前はダイアログを閉じていましたが、数日前にこれが機能しなくなりました。ダイアログを閉じるには、edge.create/edge.removeイベントをサブスクライブします。

これが私のHTMLページです。

<html>
    <head>
        <style type='text/css'>
            * { -webkit-touch-callout: none; -webkit-user-select: none; }
            body { margin:0px; }
            .fb_edge_comment_widget { display: none !important; }
        </style>
    </head>
    <body>                   
        <div id='fb-root'></div>
        <script src='http://connect.facebook.net/en_US/all.js#xfbml=1'></script>
        <script>
            function forwardEvent(name) {
                var iframe = document.createElement('iframe');
                iframe.setAttribute('src', 'event:' + name);
                document.documentElement.appendChild(iframe);
                iframe.parentNode.removeChild(iframe);  
            };
            function beginForwardingEvent(name) {
                FB.Event.subscribe(name, function(r) { forwardEvent(name); });
            };
            function beginForwardingEvents(names) {
                for (var i = 0; i < names.length; i++) {
                    beginForwardingEvent(names[i]);
                }
            };
            beginForwardingEvents(['edge.create', 'edge.remove', 'xfbml.render']);
        </script>    
        <fb:like    href='%@' 
                    send='false' 
                    layout='%@' 
                    width='%.0f' 
                    show_faces='%@' 
                    action='%@' 
                    colorscheme='%@' 
                    font='%@'
                    ></fb:like>
    </body>
</html>

これがObjective-Cコードでイベントをキャプチャする方法です:

- (void)didObserveFacebookEvent:(NSString *)fbEvent {
    if ([fbEvent isEqualToString:@"edge.create"] && [_delegate respondsToSelector:@selector(facebookLikeViewDidLike:)])
        [_delegate facebookLikeViewDidLike:self];
    else if ([fbEvent isEqualToString:@"edge.remove"] && [_delegate respondsToSelector:@selector(facebookLikeViewDidUnlike:)])
        [_delegate facebookLikeViewDidUnlike:self];
    else if ([fbEvent isEqualToString:@"xfbml.render"] && [_delegate respondsToSelector:@selector(facebookLikeViewDidRender:)])
        [_delegate facebookLikeViewDidRender:self];
}


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    // Allow loading Like button XFBML from file
    if ([request.URL.scheme isEqualToString:@"file"])
        return YES;

    // Allow loading about:blank, etc.
    if ([request.URL.scheme isEqualToString:@"about"])
        return YES;

    // Block loading of 'event:*', our scheme for forwarding Facebook JS SDK events to native code
    else if ([request.URL.scheme isEqualToString:@"event"]) {
        [self didObserveFacebookEvent:request.URL.resourceSpecifier];
        return NO;
    }
  ....
}

もう一度-edge.createは起動を停止しました(そして私はしばらくの間コードで何も変更しませんでした)-どうすればそれを取り戻すことができますか?

ありがとうございました。

更新:FBのバグが報告されています が、それでもFBRELLサイトでは機能するのに、iOSUIWebView内では機能しない理由を理解したいと思います。iOSダイアログに必要な調整があるかもしれませんか?これに対する回避策はありますか?答えを得ることを期待してバウンティを開始しました。

4

1 に答える 1

1

edge.createイベントはローカルHTMLファイル内では発生しないようです。これが偶然なのか設計なのかはわかりませんが、いくつかのことを実行して、これを機能させました。

  1. 自分のサーバーで「FacebookLikeView.html」ファイルをホストし、必要な実際の値をフォーマット指定子に置き換えました。たとえば、action='%@'明示的になりaction='like'ました。

  2. FacebookLikeView.mのメソッドからすべてを削除loadし、次の行に置き換えました。

    [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.yourhost.com/FacebookLikeView.html"]]];
    
  3. メソッドの行を変更しましたwebView:shouldStartLoadWithRequest:navigationType

    if ([request.URL.scheme isEqualToString:@"file"])
        return YES;
    

    if ([request.URL.host hasSuffix:@"yourhost.com"]) 
        return YES;
    

それはあなたが望んでいた答えではありませんが、これがあなたにいくつかの手がかりを与え、少なくともその間にそれを機能させるのに役立つことを願っています。

于 2012-04-28T10:36:10.327 に答える