1. 程式人生 > >iOS對接Facebook:登入,分享,邀請,遊戲排行榜功能

iOS對接Facebook:登入,分享,邀請,遊戲排行榜功能

這裡寫圖片描述

在如今的網際網路環境下面,如果App僅僅依靠單一的渠道去獲取使用者量,這是一種很不明智的行為,為了能夠更好地推廣和使用自己的產品,很多App廠商都會去尋求類似新浪,騰訊,推特以及我們今天所要講的Facebook這些網際網路大佬合作。依託這些有著巨大使用者量的平臺,幫助提升應用的安裝量,及推廣有著重要的意義。

在我眼裡,使用Facebook絕壁的要比使用微博啊QQ啊高大洋氣上檔次,可惜遺憾的是在中國要通過翻牆才能使用,不過這並不能阻止中國網民們的熱情啊!我一般是使用”雲梯VPN”進行翻牆的,覺得還好,包年的話是240元RMB,可以幾個人一起合夥買挺划算的 。

好了廢話就不多說了,由於公司的專案要拓展到海外市場,所以Facebook渠道成為了對接的首選,今天我就在這邊寫一個教程關於iOS對接Facebook的相關功能,讓大家避免對接時會遇到的一些坑。

在Facebook中新增您的應用

2.點選建立新的App按鈕後,出現如下圖:
這裡寫圖片描述

3.填入相應的資訊後,點選“建立應用編號”,這樣你就會得到你對應的fb-appID.

不得不說,FB對於每一個應用的資料採集做的很人性化,管理者通過後臺就可以訪問到相應的資料,我截幾張圖片看下:

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

環境配置

首先,我們要去Facebook的開發者官網上去下載SDK:SDK下載連結 因為Facebook在中國被牆,所以需要通過翻牆軟體才能進行下載。下載好之後它的SDK包含以下幾個framework: FBSDKCoreKit.framework、FBSDKLoginKit.framework 和 FBSDKShareKit.framework。

新建一個Xcode工程,取名FBTestDemo(名字隨便取),然後將我們下載好的SDK加入到我們的測試專案工程中去,在顯示的對話方塊中,選擇 Create groups for any added folders(為新增的資料夾建立組),取消選擇 Copy items into destination group’s folder(將專案複製到目標組的資料夾)。這將在 SDK 的安裝位置對其進行引用,而不是將 SDK 複製到應用程式中。

Info.Plist配置,參考如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>en</string> <key>CFBundleExecutable</key> <string>$(EXECUTABLE_NAME)</string> <key>CFBundleIdentifier</key> <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string>$(PRODUCT_NAME)</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> <string>1.0</string> <key>CFBundleSignature</key> <string>????</string> <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>fb559497127591188</string> </array> </dict> </array> <key>CFBundleVersion</key> <string>1</string> <key>FacebookAppID</key> <string>559497127591988</string> <key>FacebookDisplayName</key> <string>測試</string> <key>LSApplicationQueriesSchemes</key> <array> <string>fbapi</string> <string>fb-messenger-api</string> <string>fbauth2</string> <string>fbshareextension</string> </array> <key>LSRequiresIPhoneOS</key> <true/> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSExceptionDomains</key> <dict> <key>akamaihd.net</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>facebook.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>fbcdn.net</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> </dict> </dict> <key>UIMainStoryboardFile</key> <string>Main</string> <key>UIRequiredDeviceCapabilities</key> <array> <string>armv7</string> </array> <key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeRight</string> </array> <key>UISupportedInterfaceOrientations~ipad</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortraitUpsideDown</string> <string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeRight</string> </array> </dict> </plist>

委託設定,請將以下程式碼新增到 AppDelegate.m 檔案:

#import <FBSDKCoreKit/FBSDKCoreKit.h>

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  [[FBSDKApplicationDelegate sharedInstance] application:application
    didFinishLaunchingWithOptions:launchOptions];
  // 在此新增任意自定義邏輯。
  return YES;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

  BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
    openURL:url
    sourceApplication:sourceApplication
    annotation:annotation
  ];
  // 在此新增任意自定義邏輯。
  return handled;
}

iOS 版 Facebook 登入

iOS 版 Facebook SDK 讓使用者可以通過 Facebook 登入註冊您的應用。通過 Facebook 登入您的應用時,使用者可以嚮應用授予許可權,以便您可以檢索資訊或以使用者的身份在 Facebook 執行操作。

新增自定義登入按鈕:

// Add a custom login button to your app
        UIButton *myLoginButton=[UIButton buttonWithType:UIButtonTypeCustom];
        myLoginButton.backgroundColor=[UIColor darkGrayColor];
        myLoginButton.frame=CGRectMake(0,0,180,40);
        myLoginButton.center = self.view.center;
        [myLoginButton setTitle: @"My Login Button" forState: UIControlStateNormal];

        // Handle clicks on the button
        [myLoginButton addTarget:self action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];

        // Add the button to the view
        [self.view addSubview:myLoginButton];

事件響應函式程式碼:

// Once the button is clicked, show the login dialog
-(void)loginButtonClicked
{
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login
     logInWithReadPermissions: @[@"public_profile", @"email", @"user_friends"]
     fromViewController:self
     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
         if (error) {
             NSLog(@"Process error");
         } else if (result.isCancelled) {
             NSLog(@"Cancelled");
         } else {
             NSLog(@"Logged in");
         }
     }];
}

如果應用需要請求除 public_profile、email 和 user_friends 以外的許可權,則必須先通過 Facebook 的稽核才能釋出,例如:publish_actions許可權,不可以和上面三個許可權放在登入功能一起進行請求,不然App會Crash,所以要獲取publish_actions首先要通過登入稽核才能請求該許可權,請求publish_actions許可權程式碼如下:

static FBSDKLoginManager *loginManager;

    NSArray *permissions = [[NSArray alloc] initWithObjects:
                            @"publish_actions", nil];

    if (!loginManager) {
        loginManager = [[FBSDKLoginManager alloc] init];
    }

    [loginManager logInWithPublishPermissions:permissions fromViewController:_controller handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
      if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"publish_actions"]){
          NSLog(@"publish_actions 已經獲取");
      } else {
          NSLog(@"獲取 publish_actions 許可權");
      }
  }];

iOS 平臺Facebook分享

這裡寫圖片描述

接下來和大家介紹一下如何通過 iOS 應用將內容分享到 Facebook。

連結:

使用者通過您的應用將連結分享到 Facebook 時,會包括在帖子中顯示的屬性:
1.contentURL:要分享的連結
2.contentTitle:表示連結中的內容的標題
3.imageURL:在帖子中顯示的縮圖的網址
4.contentDescription:內容的描述,通常為 2-4 個句子

//分享連結
- (void)shareLinkContent{
    FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
    content.contentDescription = @"狗糧吃的好飽";
    content.contentTitle = @"我就看看不說話";
    content.imageURL = [NSURL URLWithString:@"http://avatar.csdn.net/C/5/9/2_shenjie12345678.jpg"];
    content.contentURL = [NSURL URLWithString:@"www.baidu.com"];

    [FBSDKShareDialog showFromViewController:self withContent:content delegate:nil];
}

照片:

使用者可以使用分享對話方塊或自定義介面,通過您的應用將照片分享到 Facebook:
1.照片大小必須小於 12MB
2.使用者需要安裝版本 7.0 或以上的原生 iOS 版 Facebook 應用

//分享照片 1234為照片的名稱
- (void)sharePhoto{
    FBSDKSharePhotoContent *content = [[FBSDKSharePhotoContent alloc] init];
    content.photos = [NSArray arrayWithObject:[FBSDKSharePhoto photoWithImage:[UIImage imageNamed:@"1234"] userGenerated:NO]];

    [FBSDKShareDialog showFromViewController:self withContent:content delegate:nil];
}

視訊:

應用使用者可通過分享對話方塊或您專屬的自定義介面將視訊分享到 Facebook:
1.視訊大小必須小於 12MB。
2.分享內容的使用者應安裝版本 26.0 或以上的 iOS 版 Facebook 客戶端。

//分享視訊
- (void)shareVedio{
    FBSDKShareVideoContent *content = [[FBSDKShareVideoContent alloc] init];
    content.video = [FBSDKShareVideo videoWithVideoURL:[NSURL URLWithString:@""] previewPhoto:[FBSDKSharePhoto photoWithImage:[UIImage imageNamed:@"1234"] userGenerated:NO]];

    [FBSDKShareDialog showFromViewController:self withContent:content delegate:nil];
}

應用邀請

應用邀請:是讓使用者邀請 Facebook 好友使用移動應用的一種內容豐富的個性化方式。

應用邀請共有 2 個引數會傳送到邀請對話方塊:應用連結網址和預覽圖片網址。
應用連結網址:接收人點選應用邀請頁面的 install/play(安裝/試玩)按鈕時,所開啟的應用連結(必須有)。
預覽圖片網址:邀請中所用圖片的網址(可不傳)。

預覽圖片網址用於在邀請中呈現圖片。雖然預覽圖片網址並非必需的引數,但還是建議傳送,因為如果系統找不到替代圖片,您的邀請將可能無法呈現。
建議的圖片尺寸為 1,200 x 628 畫素,高寬比 1.9:1。

程式碼如下:

-(void)inviteFriends:(NSString *)appUrl imageURL:(NSString *)imageUrl baseViewController:(UIViewController *)baseViewController
{
    FBSDKAppInviteContent *content =[[FBSDKAppInviteContent alloc] init];
    content.appLinkURL = [NSURL URLWithString:appUrl];
    //optionally set previewImageURL
    content.appInvitePreviewImageURL = [NSURL URLWithString:imageUrl];

    // present the dialog. Assumes self implements protocol `FBSDKAppInviteDialogDelegate`
    [FBSDKAppInviteDialog showFromViewController:baseViewController withContent:content delegate:[FBUtil getInstance]];

}

遊戲排行榜

這裡寫圖片描述

構建社交類遊戲時,比較玩家及其好友的遊戲進度是非常普遍的做法。這是促進社交競爭的絕佳方式,且 Facebook 提供了分數 API 和成就 API 等工具來推動這類競爭。

分數 API 和成就 API 讓開發者能夠輕鬆構建社交排行榜,以跨平臺的社交形式儲存玩家的分數以及向玩家頒發成就。通過分數 API,您可以儲存和重置玩家的高分,以及拉取玩家好友的分數列表,展示在排行榜內。

排行榜提交分數

/*
 *@brief facebook 遊戲排行榜 上傳遊戲分數
 *@param scores 分數
 *@param _block 提交回調
 */
+ (void)sendFBScoresWithCallback:(int)scores callback:(sendScoresCallBack)_block{
    NSString *score = [NSString stringWithFormat:@"%d", scores];
    NSDictionary *params = @{@"score": score};

    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
                                  initWithGraphPath:@"/me/scores"
                                  parameters:params
                                  HTTPMethod:@"POST"];

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
        // Handle the result
        if(!error && result){
            _block(result);
            return;
        }else{
             NSLog(@"error:%@", error);
        }
        _block(nil);
    }];
}

獲取排行榜好友資料

/*
 *@brief facebook 獲取排行榜榜單排名
 *@param _block   排行榜資訊回撥
 */
+ (void)fetchScoresWithCallback:(fetchLeadBoardCallBack)_block{
    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
                                  initWithGraphPath:[NSString stringWithFormat:@"%@/scores", [FBSDKSettings appID]]
                                  parameters:@{@"fields":@"score,user"}
                                  HTTPMethod:@"GET"];

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
        // Handle the result
        if(!error && result){
            NSArray* fetchedScoreData = [[NSArray alloc] initWithArray:[result objectForKey:@"data"]];
            if ([fetchedScoreData count] > 0){
                _block(fetchedScoreData);
                return;
            }
        }else{
           NSLog(@"error:%@", error);
        }
        _block(nil);
    }];
}

好了大致的內容就以上這些,Facebook在對接上其實麼有那麼困難,它的文件裡面程式碼也整理的比較清晰,唯一的難點就是它需要翻牆去測試,網路有可能會不太穩定,But, 沒關係,凡是多測試幾次,一步一步按照上面的說明來配置。

我會繼續更新內容的,謝謝。

歡迎大家關注我的微信公眾號,有什麼問題可以隨時聯絡,掃描下方二維碼新增:
這裡寫圖片描述