2015年5月28日木曜日

続、Facebook SDK for iOS 4.0 に悩まされる

先日、表題の記事を書いた所、コメントを頂きましたのでそちらの確認をさせて頂くのと、Graph API を使用する方法を試してみましたので報告を。。。

まず、コメントで頂いた方法を試させていただきました。
(kota n さん。ありがとうございます。)
さっそく必殺のコピペをして動作を見てみるとログに以下のメッセージが。。。
FBSDKLog: Warning: [FBSDKAccessToken currentAccessToken] is missing publish_actions permissions
どうやら publish_actions という権限が必要なようです。
この権現の扱いというのがややこしく、理解するのに暫く時間がかかりました。

しかも、この publish_actions の権限は、Facebook に審査を通していないと、使用時に警告文が表示されるようです。
(あくまで、警告文なので製品アプリだとまずいですが、お試しなので強行突破すれば確認を取ることは出来ます。 テストユーザ(警告が出ない?)ってものあるようですが調査不足。)

この権限の付与は、Graph API を使用する際にも設定の必要がありますので、ひとまず Graph API を使用した方法を載せます。

権限を付与するためには、まずログインの動作が必要となります。
ログインは以下コードでログイン動作を行います。
    - (void)login
    {
        if ([FBSDKAccessToken currentAccessToken]) {
            // accessToken が取れるならログイン処理は完了している
            reutrn;
        }

        FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
        [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
            if (error) {
                // Process error
                NSLog(@"Error");
            } else if (result.isCancelled) {
                // Handle cancellations
                NSLog(@"Cancel");
            } else {
                // If you ask for multiple permissions at once, you
                // should check if specific permissions missing
                if ([result.grantedPermissions containsObject:@"email"]) {
                    // Do work
                    NSLog(@"Login OK");
                }
            }
        }];

    }
このコードを走らせると、Safari が起動してログイン画面が起動し、その後アプリのアクセス許可を聞いています。
OK または、キャンセルを押すと、アプリに戻ります。

OK を押した場合はログインと、アプリの使用許可が出来た形となります。
次に、publish_actions の権限を付与するコードを使用します。
ログインが出来た状態だと、権限の付与ができるようになっています。
    - (void)addPermission
    {
        if ([FBSDKAccessToken currentAccessToken]) {
            // publish_actions の権限確認・付与
            if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"publish_actions"]) {
                // TODO: publish content.
            } else {
                FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
                [loginManager logInWithPublishPermissions:@[@"publish_actions"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
                    //TODO: process error or result.
                }];
            }
        }
    }
またここでも、権限の付与確認のために Safari が起動します。
ここで、審査を通していないと、赤文字で警告文が表示される様になっています。
日和らずテストなので OK しましょう。

ここまで来ると、あとはメッセージを投げるだけ!以下の内容の処理を使用します。
    - (void)sendMessage:(NSString *)message
    {
        if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"publish_actions"]) {
            [[[FBSDKGraphRequest alloc]
              initWithGraphPath:@"me/feed"
              parameters: @{ @"message" : @"hello world"}
              HTTPMethod:@"POST"]
             startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                 if (!error) {
                     NSLog(@"Post id:%@", result[@"id"]);
                 }
             }];
        }
    }
これで、完了と。。。
非常に端折って書いているので、正確性は怪しいですが投稿はできるはず。。。

コメントで頂いた内容についても、public_actions の権限を設定したあとからだと、うまくメッセージが送ることを確認しました。
ただ、同じメッセージが2回投稿される現象がでている(!?)ので調査が必要な状態。

気になる点は、権限を外したりログアウトはどうやるのかですが調べた所、権限の削除については、コードから可能。
ログアウトの処理は、Safari で Facebook を開くとログイン状態になっているので、そこからログアウトすれば良いみたい(これもコードで出来るのか?)。
登録したアプリ自体も Facebook の自分のページの設定の項目から削除することができます。

なんか投稿までの流れはコードでできたけど、解除や削除は手動になるっていうのが、今ひとつな感じです。
ともあれ、Graph API を使用しての投稿ができたので、ここから掘り下げていけば良いかなと思う次第です。

駆け足で書いたので、間違っているかもしれません。
しかし、なぜメッセージ等の投稿が Graph なんだろうか?

0 件のコメント:

コメントを投稿