約1年前にFacebook SDKを理解し始めたとき、facebook-iphone-sdkと呼ばれるバージョンがまだありました。 彼女は今働いています。 しかし、私はアプリケーションの奇妙なクラッシュに気づき始め、何か新しいものが出てくるかどうかを確認することにしました。 このプロジェクトは休止状態であることが判明したため、開発者はfacebook-ios-sdkを使用することをお勧めします。 そして判明したように、彼らは嘘をつきませんでした。
ここからSDKをダウンロードできます-https://github.com/facebook/facebook-ios-sdk
Xcode 4.0ユーザーは、開発環境からSDKを直接ダウンロードできます。 これを行うには、オーガナイザーを開き、[リポジトリ]セクションに移動し、左下隅のプラス記号の後に[チェックアウト]または[リポジトリのクローン]を選択します。

Sampleディレクトリにはデモアプリケーションがあります。デモアプリケーションを少し修正し、途中で処理します。 しかし、彼はそれを始めようとしたときにすぐに問題を抱えていました。 一部のプロジェクトパラメータは、新しいXcode4でのコンパイルを妨げ、誤ったアーキテクチャに関するエラーが生成されます。 プロジェクトの設定に移動して、アーキテクチャセクションのすべてを強制終了し、プロジェクトから2つのパラメーターのみを復元する必要があります。
アーキテクチャ-標準(arms6、arms7)
BaseSDK-最新のiOS(iOS 4.3)

うまくいかない場合は、下の作業ドラフトを添付します。
その後、プロジェクトの構築が開始され、シミュレータで実行され、すぐにクラッシュしてコンソールに通知されます-「2011-03-29 11:49:02.301 DemoApp [3098:207] missing app id!」。 これは、アプリケーションのIDを指定しなかったためです。
http://www.facebook.com/developers/にアクセスし、既存のアプリケーションを選択するか、[+新しいアプリケーションを作成]ボタンをクリックします。 簡単な登録が完了すると、システムは特に「アプリケーションID」を通知します。 彼と私たちだけが、SDKの新しいバージョンで彼を必要とします。 ファイルDemoAppViewController.mには、次のテキストが表示されます。
// Your Facebook APP Id must be set before running this example
// See www.facebook.com/developers/createapp.php
// Also, your application must bind to the fb[app_id]:// URL
// scheme (substitue [app_id] for your real Facebook app id).
static NSString* kAppId = nil;
nilをアプリケーションIDに置き換えます。 これが文字列であることを忘れないでください。 たとえば、IDが11111111111であるとします
static NSString* kAppId = @"11111111111";
構成ファイルResources / DemoApp-Info.plistに移動し、写真の値fb [your-app-id]をfb11111111111に置き換えます-括弧は混乱しないように、値なしで値を設定する必要があります!

それだけです! これで、完全に機能するアプリケーションが完成しました。 実行して何ができるかを学ぶことができます。 開始後すぐに、入会の招待状が表示されます。 電子メールとパスワードを入力すると、このアプリケーションにデータへのアクセスを許可するかどうかを尋ねる画面が表示されます。 [許可]をクリックして、最小限の設計プログラムを開始します。 これですべてがどのように機能するかを理解するために、ここで停止します。



まず、XIBファイルを見てください。

それは非常にシンプルです-5つのボタン。 アプリケーションが起動すると、FBLoginButtonのみが表示されます。これは、プロジェクトに追加された同じ名前のクラスによって制御されます。 viewDidLoadメソッドを見てください
/**
* Set initial view
*/
(void)viewDidLoad {
// facebook
_facebook = [[Facebook alloc] initWithAppId:kAppId];
[self.label setText:@"Please log in"];
//
_getUserInfoButton.hidden = YES;
_getPublicInfoButton.hidden = YES;
_publishButton.hidden = YES;
_uploadPhotoButton.hidden = YES;
_fbButton.isLoggedIn = NO;
[_fbButton updateImage];
}
Facebookクラスのオブジェクトを今すぐ簡単に初期化できることに注意してください。アプリケーションIDが必要です。それだけです。
_facebook = [[Facebook alloc] initWithAppId:kAppId];
ボタンが押されると、メソッドが呼び出されます:
/**
* Called on a login/logout button click.
*/
- (IBAction)fbButtonClick:(id)sender {
if (_fbButton.isLoggedIn) {
[self logout];
} else {
[self login];
}
}
また、まだ入力していない場合は、メソッドを呼び出します。
/**
* Show the authorization dialog.
*/
- (void)login {
[_facebook authorize:_permissions delegate:self];
}
_permissionsは、facebookのさまざまなアクションのアクセス許可です。 この例では、コントローラーを初期化するときに権利を要求します
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
...
_permissions = [[NSArray arrayWithObjects:
@"read_stream", @"offline_access",nil] retain];
}
...
}
こちらのドキュメントによると-http : //developers.facebook.com/docs/authentication/permissions/、read_streamはフィードを読み取る権利であり、offline_accessはアプリケーションがより長く接続を維持する機能です。 この権利がなければ、アクセストークンはすぐに燃え尽きてしまいます。 少し後でこのトピックに戻ります。 ところで、上記の[許可]ボタンをクリックしたときにリクエストしたのは、これらの権利の確認です。
ここでの2番目の重要な点は、自分自身、クラス、(自己)をデリゲートとして指定し、facebookオブジェクトからメッセージが到着すると受信することです。
もう1つの非常に重要な点は、承認後にアプリケーションに戻る方法に関連しています。 上記のパラメーターをResources / DemoApp-Info.plistファイルに入力したことを思い出してください。 ファイルDemoAppAppDelegate.mを見ると、アプリケーションに戻るための小さなメソッドがあります。
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [[controller facebook] handleOpenURL:url];
}
要約すると。 アプリケーションをゼロから作成する場合、SDKを正常に動作させるために必要なことは間違いありません
1.コードでアプリIDを示します
2.アプリケーションのパラメーターファイルでアプリIDを指定する
3.アプリケーションの* AppDelegate.mで、メソッドを実装します
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [[controller facebook] handleOpenURL:url];
}
最後の2つのポイントがないと、承認ウィンドウの後にアプリケーションに戻りません。
アプリケーションに返された内容に応じて、デリゲートとして設定した3つのメソッドのいずれかが呼び出されます。
/**
* , .
*/
- (void)fbDidLogin {
[self.label setText:@"logged in"];
_getUserInfoButton.hidden = NO;
_getPublicInfoButton.hidden = NO;
_publishButton.hidden = NO;
_uploadPhotoButton.hidden = NO;
_fbButton.isLoggedIn = YES;
[_fbButton updateImage];
}
/**
* , .
*/
-(void)fbDidNotLogin:(BOOL)cancelled {
NSLog(@"did not login");
}
/**
* , logout .
*/
- (void)fbDidLogout {
[self.label setText:@"Please log in"];
_getUserInfoButton.hidden = YES;
_getPublicInfoButton.hidden = YES;
_publishButton.hidden = YES;
_uploadPhotoButton.hidden = YES;
_fbButton.isLoggedIn = NO;
[_fbButton updateImage];
}
ログインに成功したため、他のすべてのボタンが画面に表示されました。 彼らが何をしているかを学ぶことができます。 後で詳しく説明します。 たとえば、Call Graph APIボタンはあなたの名前と姓を表示し、Call REST APIボタンはid = 4の人の名前と姓、つまりMike Zuckerbergを表示します。 id = 1の下に隠れている人を見つける試みは失敗し、アプリケーションがクラッシュしました。 したがって、希望する人はこの問題を自分で勉強できます。 そして、最後の段落を書いている間、ログインボタンを少なくとも数回押す必要がありました。 アプリケーションにログインすると、facebookに再度ログインする必要がないようにできること。 さあ、やってみましょう。 これに必要なのは、NSUserDefaultsに2つの変数の値を保存することだけです。 viewDidLoadは次のようになります。
- (void)viewDidLoad {
_facebook = [[Facebook alloc] initWithAppId:kAppId];
_facebook.accessToken = [[NSUserDefaults standardUserDefaults] stringForKey:@"AccessToken"];
_facebook.expirationDate = (NSDate *) [[NSUserDefaults standardUserDefaults] objectForKey:@"ExpirationDate"];
if ([_facebook isSessionValid] == NO) {
[self.label setText:@"Please log in"];
_getUserInfoButton.hidden = YES;
_getPublicInfoButton.hidden = YES;
_publishButton.hidden = YES;
_uploadPhotoButton.hidden = YES;
_fbButton.isLoggedIn = NO;
[_fbButton updateImage];
} else {
[self.label setText:@"logged in"];
_getUserInfoButton.hidden = NO;
_getPublicInfoButton.hidden = NO;
_publishButton.hidden = NO;
_uploadPhotoButton.hidden = NO;
_fbButton.isLoggedIn = YES;
[_fbButton updateImage];
}
}
NSUserDefaultsに保存されているaccessTokenおよびexpirationDateパラメーターを使用して、(isSessionValid)セッションが有効かどうかを確認します。 その場合、すでにログインしており、さらにアクションを実行できます。
fbDidLoginメソッドとfbDidLogoutメソッドにそれぞれ追加します
fbDidLogin-パラメーターの書き込み
[[NSUserDefaults standardUserDefaults] setObject:self.facebook.accessToken forKey:@"AccessToken"];
[[NSUserDefaults standardUserDefaults] setObject:self.facebook.expirationDate forKey:@"ExpirationDate"];
fbDidLogout-それらをゼロにする
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"AccessToken"];
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"ExpirationDate"];
アプリケーションを起動し、ログインし、名前を確認します。すべて問題ありません。 [ログアウト]をクリックせずに、アプリケーションを終了して再起動します-Facebookにまだいることがわかります-名前を確認します-すべてが機能します。 このために、適切な@ "offline_access"を正しく要求したことを思い出させてください。 このバージョンのプロジェクトは以下からダウンロードできます。
また、今日の記事を締めくくるために、クエリメカニズムと応答処理の仕組みを見てみましょう。
Facebookは、まだサポートされている古いREST APIを使用するのではなく、GRAPH APIを使用することをお勧めします。 このページ( http://developers.facebook.com/docs/reference/api/ )で、GRAPH APIの使用例と出力を確認できます。 デモプログラムでは、facebookは次のリクエストを使用します。
- (IBAction)getUserInfo:(id)sender {
[_facebook requestWithGraphPath:@"me" andDelegate:self];
}
たとえば、そのようなリクエストで出力がどうなるかを示します
graph.facebook.com/btaylor
{
「Id」:「220439」、
「名前」:「ブレット・テイラー」、
「名」:「ブレット」、
「姓」:「テイラー」、
「リンク」:「 www.facebook.com/btaylor 」、
「ユーザー名」:「btaylor」、
「性別」:「男性」、
「ロケール」:「en_US」
}
これは、応答としてNSDictionaryを取得し、キー「name」でフルネームを取得できることを意味します。 要求を送信し、応答の受信者を指定した後、応答を受信するメソッドを作成する必要があります。 生の応答を受け取る責任があります
- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response {
NSLog(@"received response");
}
解析された回答は受け入れます:
- (void)request:(FBRequest *)request didLoad:(id)result {
if ([result isKindOfClass:[NSArray class]]) {
result = [result objectAtIndex:0];
}
if ([result objectForKey:@"owner"]) {
[self.label setText:@"Photo upload Success"];
} else {
[self.label setText:[result objectForKey:@"name"]];
}
};
答え(結果)は、数値、文字列、配列、または辞書です。 NSArrayとしてすぐに答えが得られた場合、一度にいくつかの答えが得られたので、それらを個々の答えに分解する必要があります。 この場合、私たち(私)が誰であるかを尋ねると、答えはNSDictionaryに送られ、所有者キーがないため、この行は次のように呼び出されます。
[self.label setText:[result objectForKey:@"name"]];
物事を複雑にしましょう。 たとえば、ユーザーが好きなものについてのアプリケーション情報を取得したいです。 ドキュメントに従って要求を次のように変更します。
- (IBAction)getUserInfo:(id)sender {
[_facebook requestWithGraphPath:@"me/likes" andDelegate:self];
}
Facebookサイトでこのリクエストの出力を見ると、答えは-データキーが1つだけのNSDictionaryであることがわかります。 これは、キー「name」、「category」、「id」、「created_time」を持つNSDictionaryオブジェクトの配列に対応します。 また、要求された権利に「user_likes」を追加することを忘れないことが重要です。そうしないと、空のNSDictionaryオブジェクトが応答で返されます。
この答えを受け入れるために、メソッドを書き直します
- (void)request:(FBRequest *)request didLoad:(id)result {
if ([result isKindOfClass:[NSArray class]]) {
result = [result objectAtIndex:0];
}
if ([result objectForKey:@"owner"]) {
[self.label setText:@"Photo upload Success"];
} else if ([result objectForKey:@"data"]){
NSArray *likes = [result objectForKey:@"data"];
NSString *text=@"You don't like Steve";
for (NSDictionary* mylike in likes) {
NSString *mylikeName = [mylike objectForKey:@"name"];
if ([mylikeName isEqualToString:@"Steve Jobs"]) {
text=@"You like Steve";
break;
}
}
[self.label setText:text];
}
};
NSDictionaryの形式で回答を受け取り、キー「data」の値がある場合、この配列を調べて、各オブジェクトを調べ、ユーザーが気に入っているFacebookページにSteve Jobsという名前のページがあるかどうかを確認します。 私はこれを手に入れたので、アプリケーションは「You like Steve」をくれました。
アプリケーションから壁にメッセージを作成するための興味深いオプションを紹介したいと思いますが、ここではここで停止します。 しかし、どうやらそれは次回です。
プロジェクトはオリジナルですが、プロパティに修正が加えられているため、Xcode4で起動します
セッションを保存する機能が追加されたプロジェクト
変更されたリクエストプロジェクト
あなただけがappIDを入れる必要があります:)
psと私はHabréでコードをフォーマットするのも好きです:)