Как получить ленту общедоступной страницы Facebook в приложении для iOS, не запрашивая у пользователя разрешения Facebook?

Я пытаюсь получить ленту общедоступной страницы Facebook, используя Graph API, и не могу понять, как это сделать, не запрашивая у пользователя разрешения.

Следующий код работает, но запрашивает у пользователя разрешения:

- (void)doFacebookAuthCompletion:(void (^)(ACAccount* account))completion
{
    ACAccountStore* accountStore = [[ACAccountStore alloc] init];
    ACAccountType* accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSDictionary* fbOptions = @{
                                ACFacebookAppIdKey: @"<app-id-key>",
                                ACFacebookPermissionsKey: @[ @"email" ]
                                };

    [accountStore requestAccessToAccountsWithType:accountType
                                          options:fbOptions
                                       completion:^(BOOL granted, NSError *error) {
                                           if (granted) {
                                               completion([[accountStore accountsWithAccountType:accountType] lastObject]);
                                           } else {
                                               NSLog(@"%@", [error localizedDescription]);
                                           }
                                       }];
}

- (void)updateFeed
{
    [self doFacebookAuthCompletion:^(ACAccount* account) {
        // What we want to get
        NSURL* url = [NSURL URLWithString:@"https://graph.facebook.com/microsoft/feed"];
        NSDictionary* parameters = @{ };

        // The request
        SLRequest* request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                               requestMethod:SLRequestMethodGET
                                                         URL:url
                                                  parameters:parameters];
        [request setAccount:account];

        // Send it
        [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
            if (error) {
                NSLog(@"%@", [error localizedDescription]);
            } else {
                NSString *dataString = [[NSString alloc] initWithData:responseData encoding:NSStringEncodingConversionAllowLossy];
                NSLog(@"Response Data: %@", dataString);
            }
        }];
    }];
}

Я даже пытался использовать токен приложения, указанный на https://developers.facebook.com/docs/reference/api/page/ который безопасен только на стороне сервера, но до сих пор никуда не попал. Этот код:

- (void)doFacebookAuthCompletion:(void (^)(ACAccount* account))completion
{
    ACAccountStore* accountStore = [[ACAccountStore alloc] init];
    ACAccountType* accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    ACAccount* account = [[ACAccount alloc] initWithAccountType:accountType];
    account.credential = [[ACAccountCredential alloc] initWithOAuthToken:@"<app-token>" tokenSecret:@"<app-secret>"];
    completion(account);
}

Дает следующий вывод:

Response Data: {"error":{"message":"An access token is required to request this resource.","type":"OAuthException","code":104}}

В то время как Graph API Explorer работает просто отлично, когда дано то же самое <app-token> (он не просит секрет, как - initWithOAuthToken:tokenSecret: делает).

Даже если бы этот подход работал, его было бы небезопасно выпустить.

Я застрял сейчас. Помогите, пожалуйста?

1 ответ

Я не могу дать полный ответ, потому что я никогда не использовал iOS, но на стороне Facebook API Graph не позволит вам получить что-либо без какого- либо токена. Безопасный или нет, единственный способ сделать это - использовать идентификатор приложения и секретный ключ для создания токена, который затем можно будет использовать. Вы можете получить один, используя, например:

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&
grant_type=client_credentials 
Другие вопросы по тегам