且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

嵌入式Facebook的帖子在UIWebView中无法正常显示

更新时间:2023-09-17 10:11:16

解决问题的唯一方法是创建代理服务与Facebook嵌入。将HTML代码插入到UIWebView之前,请检查fb-post和fb-video:

The only way to resolve the problem is create a proxy service with facebook-embed. Before insert your HTML-code into UIWebView check it for fb-post and fb-video:

// Facebook Video Embed
if ([HTMLcontent rangeOfString:@"fb-video"].location != NSNotFound) {
    [self appendFBEmbed:htmlContent type:@"video"];
}

// Facebook Post Embed
if ([HTMLcontent rangeOfString:@"fb-post"].location != NSNotFound) {
    [self appendFBEmbed:htmlContent type:@"post"];
}

... // Your some code before </body></html>

[htmlContent appendString:@"</body></html>"];
[[self webView] loadHTMLString:[self HTMLcontent] baseURL:nil];

...

- (void)appendFBEmbed:(NSMutableString*)html type:(NSString* )type
{
    NSString *locale = getYourCurrentLocaleIdentifier();
    [html appendFormat:@"<script type=\"text/javascript\">"];
    [html appendFormat:@"var items = document.getElementsByClassName('fb-%@');", type];
    [html appendFormat:@"for (i=0; i<items.length;i++) {"];
    [html appendFormat:@"    var item = items[i];"];
    [html appendFormat:@"    var url = item.getAttribute(\"data-href\");"];
    [html appendFormat:@"    var src = 'http://YOUR-APP-HOST/facebook/emded.html?type=%@&url=' + encodeURIComponent(url) + '&locale=%@&width=%d';", type, locale, getYourCurrentDisplayWidth()];
    [html appendFormat:@"    item.innerHTML = '<iframe class=\"facebook fb-%@\" frameborder=\"0\" src=\"' + src + '\"></iframe>';", type];
    [html appendFormat:@"}"];
    [html appendFormat:@"</script>"];
}

我的远程页面源代码(PHP Phalcon Controller):

And my remote page source code (PHP Phalcon Controller):

// FacebookController.php
<?php

class FacebookController extends \Phalcon\Mvc\Controller
{
    public function indexAction()
    {
        $type = trim($this->request->get('type'));

        if (in_array($type, ['post', 'video']) === FALSE) {
            throw new \Exception('Unknown fb-post type');
        }

        $url = trim($this->request->get('url'));

        $host = parse_url($url, \PHP_URL_HOST);

        if ($host === FALSE) {
            throw new \Exception('Invalid URL'); // URL is not URL
        }

        if ($host !== NULL /* related URL */ && $host !== 'facebook.com' && $host !== 'www.facebook.com') {
            throw new \Exception('Forbidden URL'); // Not a Facebook-URL
        }

        $locale = trim($this->request->get('locale'));

        if ($locale) {
            if (strlen($locale) > 10) {
                throw new \Exception('Invalid Locale'); // 
            }

            $localesXML = new \SimpleXMLElement(ROOT_PATH . '/../data/facebook-locales.xml', NULL, TRUE); // Where ROOT_PATH . '/../data/facebook-locales.xml is a local copy of https://www.facebook.com/translations/FacebookLocales.xml

            $result = $localesXML->xpath('//representation[.="' . htmlentities($locale) . '"]');

            if (count($result) > 0) {
                $locale = (string) $result[0];
            } else {
                $locale = NULL;
            }
        } else {
            $locale = NULL;
        }

        if ($locale === NULL) {
            $locale = "en_US";
        }

        $width = intval(trim($this->request->get('width')));

        if ($width < 100 || $width > 3000) {
            throw new \Exception('Invalid width param');
        }

        $viewData = [
            'type' => $type,
            'url' => $url,
            'width' => $width,
            'locale' => $locale,
        ];

        foreach ($viewData as $k => $v) {
            $this->view->setVar($k, $v);
        }
    }
}







<!-- /views/facebook/index.phtml -->
<html>
    <body>
        <div class="fb-<?= $type ?>" data-href="<?= $url ?>" data-width="<?= $width ?>"></div>
        <script src="https://connect.facebook.net/<?= $locale ?>/sdk.js#xfbml=1&version=v2.3"></script>
    </body>
</html>