iOS对接Facebook:登录,分享,邀请,游戏排行榜功能

<div id="article_content" class="article_content">
        <div class="markdown_views"><p><img src="https://img-blog.csdn.net/20160812173823410" alt="这里写图片描述" title=""></p>


<hr>


<p>在如今的互联网环境下面,如果App仅仅依靠单一的渠道去获取用户量,这是一种很不明智的行为,为了能够更好地推广和使用自己的产品,很多App厂商都会去寻求类似新浪,腾讯,推特以及我们今天所要讲的Facebook这些互联网大佬合作。依托这些有着巨大用户量的平台,帮助提升应用的安装量,及推广有着重要的意义。</p>


<p>在我眼里,使用Facebook绝壁的要比使用微博啊QQ啊高大洋气上档次,可惜遗憾的是在中国要通过翻墙才能使用,不过这并不能阻止中国网民们的热情啊!我一般是使用”云梯VPN”进行翻墙的,觉得还好,包年的话是240元RMB,可以几个人一起合伙买挺划算的 。</p>


<p>好了废话就不多说了,由于公司的项目要拓展到海外市场,所以Facebook渠道成为了对接的首选,今天我就在这边写一个教程关于<a href="http://lib.csdn.net/base/ios" class="replace_word" title="iOS知识库" target="_blank" style="color:#df3434; font-weight:bold;">iOS</a>对接Facebook的相关功能,让大家避免对接时会遇到的一些坑。</p>


<hr>






<h2 id="在facebook中添加您的应用"><a name="t0"></a>在Facebook中添加您的应用</h2>


<p>1.登录连接:<a href="https://developers.facebook.com/apps">https://developers.facebook.com/apps</a></p>


<p>2.点击创建新的App按钮后,出现如下图: <br>
<img src="https://img-blog.csdn.net/20160808161204121" alt="这里写图片描述" title=""></p>


<p>3.填入相应的信息后,点击“创建应用编号”,这样你就会得到你对应的fb-appID.</p>


<p>不得不说,FB对于每一个应用的数据采集做的很人性化,管理者通过后台就可以访问到相应的数据,我截几张图片看下:</p>


<p><img src="https://img-blog.csdn.net/20160808161711977" alt="这里写图片描述" title=""> <br>
<img src="https://img-blog.csdn.net/20160808161739035" alt="这里写图片描述" title=""> <br>
<img src="https://img-blog.csdn.net/20160808161800785" alt="这里写图片描述" title=""></p>






<h2 id="环境配置"><a name="t1"></a>环境配置</h2>


<p>首先,我们要去Facebook的开发者官网上去下载SDK:<a href="https://developers.facebook.com/docs/ios/">SDK下载链接</a> 因为Facebook在中国被墙,所以需要通过翻墙软件才能进行下载。下载好之后它的SDK包含以下几个framework: FBSDKCoreKit.framework、FBSDKLoginKit.framework 和 FBSDKShareKit.framework。</p>


<p>新建一个Xcode工程,取名FBTestDemo(名字随便取),然后将我们下载好的SDK加入到我们的<a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>项目工程中去,在显示的对话框中,选择 Create groups for any added folders(为添加的文件夹创建组),取消选择 Copy items into destination group’s folder(将项目复制到目标组的文件夹)。这将在 SDK 的安装位置对其进行引用,而不是将 SDK 复制到应用程序中。</p>


<p>Info.Plist配置,参考如下配置:</p>






<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-pi">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
<span class="hljs-doctype">&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-title">plist</span> <span class="hljs-attribute">version</span>=<span class="hljs-value">"1.0"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-title">dict</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleDevelopmentRegion<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>en<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleExecutable<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>$(EXECUTABLE_NAME)<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleIdentifier<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>$(PRODUCT_BUNDLE_IDENTIFIER)<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleInfoDictionaryVersion<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>6.0<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleName<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>$(PRODUCT_NAME)<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundlePackageType<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>APPL<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleShortVersionString<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>1.0<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleSignature<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>????<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleURLTypes<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">array</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">dict</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleURLSchemes<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">array</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>fb559497127591188<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">array</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">dict</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">array</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>CFBundleVersion<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>1<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>FacebookAppID<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>559497127591988<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>FacebookDisplayName<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>测试<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>LSApplicationQueriesSchemes<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">array</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>fbapi<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>fb-messenger-api<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>fbauth2<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>fbshareextension<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">array</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>LSRequiresIPhoneOS<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">true</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>NSAppTransportSecurity<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">dict</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>NSAllowsArbitraryLoads<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">true</span>/&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>NSExceptionDomains<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">dict</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>akamaihd.net<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">dict</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>NSIncludesSubdomains<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">true</span>/&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>NSThirdPartyExceptionRequiresForwardSecrecy<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">false</span>/&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">dict</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>facebook.com<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">dict</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>NSIncludesSubdomains<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">true</span>/&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>NSThirdPartyExceptionRequiresForwardSecrecy<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">false</span>/&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">dict</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>fbcdn.net<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-title">dict</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>NSIncludesSubdomains<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">true</span>/&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>NSThirdPartyExceptionRequiresForwardSecrecy<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-title">false</span>/&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-title">dict</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-title">dict</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">dict</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>UIMainStoryboardFile<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>Main<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>UIRequiredDeviceCapabilities<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">array</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>armv7<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">array</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>UISupportedInterfaceOrientations<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">array</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>UIInterfaceOrientationPortrait<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>UIInterfaceOrientationLandscapeLeft<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>UIInterfaceOrientationLandscapeRight<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">array</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">key</span>&gt;</span>UISupportedInterfaceOrientations~ipad<span class="hljs-tag">&lt;/<span class="hljs-title">key</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">array</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>UIInterfaceOrientationPortrait<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>UIInterfaceOrientationPortraitUpsideDown<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>UIInterfaceOrientationLandscapeLeft<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-title">string</span>&gt;</span>UIInterfaceOrientationLandscapeRight<span class="hljs-tag">&lt;/<span class="hljs-title">string</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">array</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">dict</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">plist</span>&gt;</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li></ul></pre>


<p>委托设置,请将以下代码添加到 AppDelegate.m 文件:</p>






<pre class="prettyprint" name="code"><code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title">&lt;FBSDKCoreKit/FBSDKCoreKit.h&gt;</span></span>


- (<span class="hljs-built_in">BOOL</span>)application:(<span class="hljs-built_in">UIApplication</span> *)application 
    didFinishLaunchingWithOptions:(<span class="hljs-built_in">NSDictionary</span> *)launchOptions {


  [[FBSDKApplicationDelegate sharedInstance] application:application
    didFinishLaunchingWithOptions:launchOptions];
  <span class="hljs-comment">// 在此添加任意自定义逻辑。</span>
  <span class="hljs-keyword">return</span> <span class="hljs-literal">YES</span>;
}


- (<span class="hljs-built_in">BOOL</span>)application:(<span class="hljs-built_in">UIApplication</span> *)application openURL:(<span class="hljs-built_in">NSURL</span> *)url 
    sourceApplication:(<span class="hljs-built_in">NSString</span> *)sourceApplication annotation:(<span class="hljs-keyword">id</span>)annotation {


  <span class="hljs-built_in">BOOL</span> handled = [[FBSDKApplicationDelegate sharedInstance] application:application
    openURL:url
    sourceApplication:sourceApplication
    annotation:annotation
  ];
  <span class="hljs-comment">// 在此添加任意自定义逻辑。</span>
  <span class="hljs-keyword">return</span> handled;
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li></ul></pre>


<hr>






<h2 id="ios-版-facebook-登录"><a name="t2"></a>iOS 版 Facebook 登录</h2>


<p>iOS 版 Facebook SDK 让用户可以通过 Facebook 登录注册您的应用。通过 Facebook 登录您的应用时,用户可以向应用授予权限,以便您可以检索信息或以用户的身份在 Facebook 执行操作。</p>


<p>添加自定义登录按钮:</p>






<pre class="prettyprint" name="code"><code class="hljs objectivec has-numbering"><span class="hljs-comment">// Add a custom login button to your app</span>
        <span class="hljs-built_in">UIButton</span> *myLoginButton=[<span class="hljs-built_in">UIButton</span> buttonWithType:UIButtonTypeCustom];
        myLoginButton<span class="hljs-variable">.backgroundColor</span>=[<span class="hljs-built_in">UIColor</span> darkGrayColor];
        myLoginButton<span class="hljs-variable">.frame</span>=CGRectMake(<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">180</span>,<span class="hljs-number">40</span>);
        myLoginButton<span class="hljs-variable">.center</span> = <span class="hljs-keyword">self</span><span class="hljs-variable">.view</span><span class="hljs-variable">.center</span>;
        [myLoginButton setTitle: @<span class="hljs-string">"My Login Button"</span> forState: UIControlStateNormal];


        <span class="hljs-comment">// Handle clicks on the button</span>
        [myLoginButton addTarget:<span class="hljs-keyword">self</span> action:<span class="hljs-keyword">@selector</span>(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];


        <span class="hljs-comment">// Add the button to the view</span>
        [<span class="hljs-keyword">self</span><span class="hljs-variable">.view</span> addSubview:myLoginButton];</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul></pre>


<p>事件响应函数代码:</p>






<pre class="prettyprint" name="code"><code class="hljs objectivec has-numbering"><span class="hljs-comment">// Once the button is clicked, show the login dialog</span>
-(<span class="hljs-keyword">void</span>)loginButtonClicked
{
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login
     logInWithReadPermissions: @[@<span class="hljs-string">"public_profile"</span>, @<span class="hljs-string">"email"</span>, @<span class="hljs-string">"user_friends"</span>]
     fromViewController:<span class="hljs-keyword">self</span>
     handler:^(FBSDKLoginManagerLoginResult *result, <span class="hljs-built_in">NSError</span> *error) {
         <span class="hljs-keyword">if</span> (error) {
             <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"Process error"</span>);
         } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (result<span class="hljs-variable">.isCancelled</span>) {
             <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"Cancelled"</span>);
         } <span class="hljs-keyword">else</span> {
             <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"Logged in"</span>);
         }
     }];
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul></pre>


<p><strong>如果应用需要请求除 public_profile、email 和 user_friends 以外的权限,则必须先通过 Facebook 的审核才能发布,例如:publish_actions权限,不可以和上面三个权限放在登录功能一起进行请求,不然App会Crash,所以要获取publish_actions首先要通过登录审核才能请求该权限,请求publish_actions权限代码如下:</strong></p>






<pre class="prettyprint" name="code"><code class="hljs objectivec has-numbering"><span class="hljs-keyword">static</span> FBSDKLoginManager *loginManager;


    <span class="hljs-built_in">NSArray</span> *permissions = [[<span class="hljs-built_in">NSArray</span> alloc] initWithObjects:
                            @<span class="hljs-string">"publish_actions"</span>, <span class="hljs-literal">nil</span>];


    <span class="hljs-keyword">if</span> (!loginManager) {
        loginManager = [[FBSDKLoginManager alloc] init];
    }


    [loginManager logInWithPublishPermissions:permissions fromViewController:_controller handler:^(FBSDKLoginManagerLoginResult *result, <span class="hljs-built_in">NSError</span> *error) {
      <span class="hljs-keyword">if</span> ([[FBSDKAccessToken currentAccessToken] hasGranted:@<span class="hljs-string">"publish_actions"</span>]){
          <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"publish_actions 已经获取"</span>);
      } <span class="hljs-keyword">else</span> {
          <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"获取 publish_actions 权限"</span>);
      }
  }];</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul></pre>


<hr>






<h2 id="ios-平台facebook分享"><a name="t3"></a>iOS 平台Facebook分享</h2>


<p><img src="https://img-blog.csdn.net/20160812173750363" alt="这里写图片描述" title=""></p>


<p>接下来和大家介绍一下如何通过 iOS 应用将内容分享到 Facebook。</p>






<h2 id="链接"><a name="t4"></a>链接:</h2>


<p>用户通过您的应用将链接分享到 Facebook 时,会包括在帖子中显示的属性: <br>
1.contentURL:要分享的链接 <br>
2.contentTitle:表示链接中的内容的标题 <br>
3.imageURL:在帖子中显示的缩略图的网址 <br>
4.contentDescription:内容的描述,通常为 2-4 个句子</p>






<pre class="prettyprint" name="code"><code class="hljs objectivec has-numbering"><span class="hljs-comment">//分享链接</span>
- (<span class="hljs-keyword">void</span>)shareLinkContent{
    FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
    content<span class="hljs-variable">.contentDescription</span> = @<span class="hljs-string">"狗粮吃的好饱"</span>;
    content<span class="hljs-variable">.contentTitle</span> = @<span class="hljs-string">"我就看看不说话"</span>;
    content<span class="hljs-variable">.imageURL</span> = [<span class="hljs-built_in">NSURL</span> URLWithString:@<span class="hljs-string">"http://avatar.csdn.net/C/5/9/2_shenjie12345678.jpg"</span>];
    content<span class="hljs-variable">.contentURL</span> = [<span class="hljs-built_in">NSURL</span> URLWithString:@<span class="hljs-string">"www.baidu.com"</span>];


    [FBSDKShareDialog showFromViewController:<span class="hljs-keyword">self</span> withContent:content delegate:<span class="hljs-literal">nil</span>];
}
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul></pre>






<h2 id="照片"><a name="t5"></a>照片:</h2>


<p>用户可以使用分享对话框或自定义界面,通过您的应用将照片分享到 Facebook: <br>
1.照片大小必须小于 12MB <br>
2.用户需要安装版本 7.0 或以上的原生 iOS 版 Facebook 应用</p>






<pre class="prettyprint" name="code"><code class="hljs lua has-numbering">//分享照片 <span class="hljs-number">1234</span>为照片的名称
- (void)sharePhoto{
    FBSDKSharePhotoContent *content = <span class="hljs-string">[[FBSDKSharePhotoContent alloc] init];
    content.photos = [NSArray arrayWithObject:[FBSDKSharePhoto photoWithImage:[UIImage imageNamed:@"1234"] userGenerated:NO]]</span>;


    [FBSDKShareDialog showFromViewController:self withContent:content delegate:<span class="hljs-keyword">nil</span>];
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul></pre>






<h2 id="视频"><a name="t6"></a>视频:</h2>


<p>应用用户可通过分享对话框或您专属的自定义界面将视频分享到 Facebook: <br>
1.视频大小必须小于 12MB。 <br>
2.分享内容的用户应安装版本 26.0 或以上的 iOS 版 Facebook 客户端。</p>






<pre class="prettyprint" name="code"><code class="hljs lua has-numbering">//分享视频
- (void)shareVedio{
    FBSDKShareVideoContent *content = <span class="hljs-string">[[FBSDKShareVideoContent alloc] init];
    content.video = [FBSDKShareVideo videoWithVideoURL:[NSURL URLWithString:@""] previewPhoto:[FBSDKSharePhoto photoWithImage:[UIImage imageNamed:@"1234"] userGenerated:NO]]</span>;


    [FBSDKShareDialog showFromViewController:self withContent:content delegate:<span class="hljs-keyword">nil</span>];
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul></pre>


<hr>






<h2 id="应用邀请"><a name="t7"></a>应用邀请</h2>


<p>应用邀请:是让用户邀请 Facebook 好友使用移动应用的一种内容丰富的个性化方式。</p>


<p>应用邀请共有 2 个参数会传送到邀请对话框:应用链接网址和预览图片网址。 <br>
应用链接网址:接收人点击应用邀请页面的 install/play(安装/试玩)按钮时,所打开的应用链接(必须有)。 <br>
预览图片网址:邀请中所用图片的网址(可不传)。</p>


<p>预览图片网址用于在邀请中呈现图片。虽然预览图片网址并非必需的参数,但还是建议传送,因为如果系统找不到替代图片,您的邀请将可能无法呈现。 <br>
建议的图片尺寸为 1,200 x 628 像素,高宽比 1.9:1。</p>


<p>代码如下:</p>






<pre class="prettyprint" name="code"><code class="hljs lua has-numbering">-(void)inviteFriends:(NSString *)appUrl imageURL:(NSString *)imageUrl baseViewController:(UIViewController *)baseViewController
{
    FBSDKAppInviteContent *content =<span class="hljs-string">[[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]]</span>;


}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul></pre>


<hr>






<h2 id="游戏排行榜"><a name="t8"></a>游戏排行榜</h2>


<p><img src="https://img-blog.csdn.net/20160812172644246" alt="这里写图片描述" title=""></p>


<p>构建社交类游戏时,比较玩家及其好友的游戏进度是非常普遍的做法。这是促进社交竞争的绝佳方式,且 Facebook 提供了分数 API 和成就 API 等工具来推动这类竞争。</p>


<p>分数 API 和成就 API 让开发者能够轻松构建社交排行榜,以跨平台的社交形式保存玩家的分数以及向玩家颁发成就。通过分数 API,您可以存储和重置玩家的高分,以及拉取玩家好友的分数列表,展示在排行榜内。</p>






<h2 id="排行榜提交分数"><a name="t9"></a>排行榜提交分数</h2>






<pre class="prettyprint" name="code"><code class="hljs objectivec has-numbering"><span class="hljs-comment">/*
 *@brief facebook 游戏排行榜 上传游戏分数
 *@param scores 分数
 *@param _block 提交回调
 */</span>
+ (<span class="hljs-keyword">void</span>)sendFBScoresWithCallback:(<span class="hljs-keyword">int</span>)scores callback:(sendScoresCallBack)_block{
    <span class="hljs-built_in">NSString</span> *score = [<span class="hljs-built_in">NSString</span> stringWithFormat:@<span class="hljs-string">"%d"</span>, scores];
    <span class="hljs-built_in">NSDictionary</span> *params = @{@<span class="hljs-string">"score"</span>: score};


    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
                                  initWithGraphPath:@<span class="hljs-string">"/me/scores"</span>
                                  parameters:params
                                  HTTPMethod:@<span class="hljs-string">"POST"</span>];


    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, <span class="hljs-keyword">id</span> result, <span class="hljs-built_in">NSError</span> *error) {
        <span class="hljs-comment">// Handle the result</span>
        <span class="hljs-keyword">if</span>(!error &amp;&amp; result){
            _block(result);
            <span class="hljs-keyword">return</span>;
        }<span class="hljs-keyword">else</span>{
             <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"error:%@"</span>, error);
        }
        _block(<span class="hljs-literal">nil</span>);
    }];
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul></pre>






<h2 id="获取排行榜好友数据"><a name="t10"></a>获取排行榜好友数据</h2>






<pre class="prettyprint" name="code"><code class="hljs lua has-numbering">/*
 *@brief facebook 获取排行榜榜单排名
 *@param _block   排行榜信息回调
 */
+ (void)fetchScoresWithCallback:(fetchLeadBoardCallBack)_block{
    FBSDKGraphRequest *request = <span class="hljs-string">[[FBSDKGraphRequest alloc]
                                  initWithGraphPath:[NSString stringWithFormat:@"%@/scores", [FBSDKSettings appID]]</span>
                                  parameters:@{@<span class="hljs-string">"fields"</span>:@<span class="hljs-string">"score,user"</span>}
                                  HTTPMethod:@<span class="hljs-string">"GET"</span>];


    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *<span class="hljs-built_in">error</span>) {
        // Handle the result
        <span class="hljs-keyword">if</span>(!<span class="hljs-built_in">error</span> &amp;&amp; result){
            NSArray* fetchedScoreData = <span class="hljs-string">[[NSArray alloc] initWithArray:[result objectForKey:@"data"]]</span>;
            <span class="hljs-keyword">if</span> ([fetchedScoreData count] &gt; <span class="hljs-number">0</span>){
                _block(fetchedScoreData);
                <span class="hljs-keyword">return</span>;
            }
        }<span class="hljs-keyword">else</span>{
           NSLog(@<span class="hljs-string">"error:%@"</span>, <span class="hljs-built_in">error</span>);
        }
        _block(<span class="hljs-keyword">nil</span>);
    }];
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul></pre>


<hr>


<p>好了大致的内容就以上这些,Facebook在对接上其实么有那么困难,它的文档里面代码也整理的比较清晰,唯一的难点就是它需要翻墙去测试,网络有可能会不太稳定,But, 没关系,凡是多测试几次,一步一步按照上面的说明来配置。</p>


<p>相关文档: <br>
<a href="https://developers.facebook.com/docs">https://developers.facebook.com/docs</a> <br>
<a href="https://developers.facebook.com/docs/games/services/scores-achievements">https://developers.facebook.com/docs/games/services/scores-achievements</a> <br>
<a href="https://developers.facebook.com/docs/facebook-login/ios">https://developers.facebook.com/docs/facebook-login/ios</a> <br>
<a href="https://developers.facebook.com/docs/invite">https://developers.facebook.com/docs/invite</a></p>


<p>我会继续更新内容的,谢谢。</p>


<hr>


<p>欢迎大家关注我的<a href="http://lib.csdn.net/base/wechat" class="replace_word" title="微信开发知识库" target="_blank" style="color:#df3434; font-weight:bold;">微信</a>公众号,有什么问题可以随时联系,扫描下方二维码添加:  <br>
<img src="https://img-blog.csdn.net/20160812175840575" alt="这里写图片描述" title=""></p></div>
        <script type="text/javascript">
            $(function () {
                $('pre.prettyprint code').each(function () {
                    var lines = $(this).text().split('\n').length;
                    var $numbering = $('<ul></ul>').addClass('pre-numbering').hide();
                    $(this).addClass('has-numbering').parent().append($numbering);
                    for (i = 1; i <= lines; i++) {
                        $numbering.append($('<li></li>').text(i));
                    };
                    $numbering.fadeIn(1700);
                });
            });
        </script>
   
</div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值