Ionic - Cordova Facebook
此插件用于连接 Facebook API。在开始集成 Facebook 之前,您需要在此处创建一个 Facebook 应用。您将创建一个 web 应用,然后跳过快速启动屏幕。然后,您需要在设置页面上添加 website platform。在开发期间,您可以使用以下代码片段作为站点 URL。
http://localhost:8100/
之后,您需要在设置/高级页面上添加有效的 OAuth 重定向 URI。只需复制以下两个 URL。
https://www.facebook.com/connect/login_success.html http://localhost:8100/oauthcallback.html
安装 Facebook 插件
我们执行了上述所有步骤,以解决使用此插件时经常出现的一些问题。此插件很难设置,因为涉及很多步骤,而且文档并未涵盖所有内容。还有一些已知的与其他 Cordova 插件的兼容性问题,因此我们将在应用中使用Telerik 验证插件版本。我们将从命令提示符开始向应用安装 browser platform。
C:\Users\Username\Desktop\MyApp>ionic platform add browser
接下来,我们需要在index.html中body标签顶部添加root元素。
index.html
<div id = "fb-root"></div>
现在我们将向应用添加 Cordova Facebook 插件。您需要将APP_ID和APP_NAME更改为与您之前创建的 Facebook 应用匹配的值。
C:\Users\Username\Desktop\MyApp>cordova -d plugin add https://github.com/Telerik-Verified-Plugins/Facebook/ --variable APP_ID = "123456789" --variable APP_NAME = "FbAppName"
现在打开index.html,在您的body标签之后添加以下代码。您需要再次确保appId和version与您创建的 Facebook 应用匹配。这将确保 Facebook SDK 以异步方式加载,而不会阻塞应用的其余部分。
index.html
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '123456789',
xfbml : true,
version : 'v2.4'
});
};
(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";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
Angular Service
既然我们已经安装了所有内容,现在需要创建一个 service,它将作为我们与 Facebook 的连接。这些操作可以在 controller 中用更少的代码完成,但我们试图遵循最佳实践,因此将使用 Angular service。下面的代码展示了完整的 service。我们稍后会解释它。
services.js
.service('Auth', function($q, $ionicLoading) {
this.getLoginStatus = function() {
var defer = $q.defer();
FB.getLoginStatus(function(response) {
if (response.status === "connected") {
console.log(JSON.stringify(response));
} else {
console.log("Not logged in");
}
});
return defer.promise;
}
this.loginFacebook = function() {
var defer = $q.defer();
FB.login(function(response) {
if (response.status === "connected") {
console.log(JSON.stringify(response));
} else {
console.log("Not logged in!");
}
});
return defer.promise;
}
this.logoutFacebook = function() {
var defer = $q.defer();
FB.logout(function(response) {
console.log('You are logged out!');
});
return defer.promise;
}
this.getFacebookApi = function() {
var defer = $q.defer();
FB.api("me/?fields = id,email", [], function(response) {
if (response.error) {
console.log(JSON.stringify(response.error));
} else {
console.log(JSON.stringify(response));
}
});
return defer.promise;
}
});
在上述 service 中,我们创建了四个函数。前三个函数不言自明。第四个函数用于连接 Facebook graph API。它将返回 Facebook 用户的 id 和 email。
我们创建了 promise 对象 来处理异步 JavaScript 函数。现在我们需要编写 controller,它将调用这些函数。为了更好地理解,我们将分别调用每个函数,但您可能需要将其中一些组合起来以获得所需效果。
Controller Code
.controller('MyCtrl', function($scope, Auth, $ionicLoading) {
$scope.checkLoginStatus = function() {
getLoginUserStatus();
}
$scope.loginFacebook = function(userData) {
loginFacebookUser();
};
$scope.facebookAPI = function() {
getFacebookUserApi();
}
$scope.logoutFacebook = function() {
logoutFacebookUser();
};
function loginFacebookUser() {
return Auth.loginFacebook();
}
function logoutFacebookUser() {
return Auth.logoutFacebook();
}
function getFacebookUserApi() {
return Auth.getFacebookApi();
}
function getLoginUserStatus() {
return Auth.getLoginStatus();
}
})
您可能想知道为什么我们没有直接从函数表达式(前四个函数)中返回 Auth service。原因是您可能希望在 Auth 函数返回后添加更多行为。您可能需要将数据发送到数据库,在登录后更改路由等。这可以通过使用 JavaScript 的 then() 方法来轻松实现,以处理所有异步操作,而不是使用回调。
现在我们需要允许用户与应用交互。我们的 HTML 将包含四个按钮,用于调用我们创建的四个函数。
HTML Code
<button class = "button" ng-click = "loginFacebook()">LOG IN</button> <button class = "button" ng-click = "logoutFacebook()">LOG OUT</button> <button class = "button" ng-click = "checkLoginStatus()">CHECK</button> <button class = "button" ng-click = "facebookAPI()">API</button>
当用户点击 LOG IN 按钮时,将出现 Facebook 登录界面。登录成功后,用户将被重定向回应用。
