Google Plus api для iOS получить список друзей

Я хочу получить список друзей (людей) из Google+ в приложении для iOS.

Я использую руководство по API Google+, приведенное по ссылке https://developers.google.com/+/mobile/ios/getting-started

Я создал новый проект в консоли разработчика Google+, ссылка:

https://console.developers.google.com/project

Получение следующей ошибки в - (void) getPeopleInfo.

[lvl = 3] __31- [ViewController getPeopleInfo] _block_invoke () Ошибка: домен ошибки = com.google.GTLJSONRPCErrorDomain Code = 401 "Операция не может быть завершена. (Недействительные учетные данные)" UserInfo = 0x14d89340 {error = Invalid Credentials, GTLStructuredError = GTLErrorObject 0x14d855e0: {сообщение: «Недействительные учетные данные», код: 401 данные: [1]}, NSLocalizedFailureReason = (Недействительные учетные данные)} 2014-03-13 12: 40: 21.026 GPlusDemo [636 / 0x3d35718c] l] l __31- [ViewController getPeopleInfo] _block_invoke () Ошибка: домен ошибки = com.google.GTLJSONRPCErrorDomain Code = 401 "Операция не может быть завершена. (Недействительные учетные данные)" UserInfo = 0x14d85f90 {error = Invalid Credentials, GTLStrujectLEx14 {сообщение: "Недействительные учетные данные", код: 401 данные: [1]}, NSLocalizedFailureReason = (Недействительные учетные данные)}

Я написал следующий код в ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


    GPPSignIn *signIn = [GPPSignIn sharedInstance];
    signIn.shouldFetchGooglePlusUser = YES;
    //signIn.shouldFetchGoogleUserEmail = YES;  // Uncomment to get the user's email

    // You previously set kClientId in the "Initialize the Google+ client" step
    signIn.clientID = kClientId;

    // Uncomment one of these two statements for the scope you chose in the previous step
    signIn.scopes = @[ kGTLAuthScopePlusLogin];  // "https://www.googleapis.com/auth/plus.login" scope
    signIn.scopes = @[ @"profile" ];            // "profile" scope

    // Optional: declare signIn.actions, see "app activities"
    signIn.delegate = self;

    [signIn trySilentAuthentication];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


-(void)refreshInterfaceBasedOnSignIn
{
    if ([[GPPSignIn sharedInstance] authentication]) {
        // The user is signed in.
        NSLog(@"Login");
        self.signInButton.hidden = YES;
        // Perform other actions here, such as showing a sign-out button

        [self getPeopleInfo];
    } else {
        self.signInButton.hidden = NO;
        // Perform other actions here
    }
}

- (void)finishedWithAuth: (GTMOAuth2Authentication *)auth
                   error: (NSError *) error
{
    NSLog(@"Received error %@ and auth object %@",error, auth);
    if (error) {
        // Do some error handling here.
    } else {
        [self refreshInterfaceBasedOnSignIn];
    }
}

- (void)signOut {
    [[GPPSignIn sharedInstance] signOut];
}


- (void)disconnect {
    [[GPPSignIn sharedInstance] disconnect];
}

- (void)didDisconnectWithError:(NSError *)error {
    if (error) {
        NSLog(@"Received error %@", error);
    } else {
        // The user is signed out and disconnected.
        // Clean up user data as specified by the Google+ terms.
    }
}

-(void)getPeopleInfo
{
    GTLServicePlus* plusService = [[GTLServicePlus alloc] init];
    plusService.retryEnabled = YES;

    [plusService setAuthorizer:[GPPSignIn sharedInstance].authentication];


    GTLQueryPlus *query =
    [GTLQueryPlus queryForPeopleListWithUserId:@"me"
                                    collection:kGTLPlusCollectionVisible];
    [plusService executeQuery:query
            completionHandler:^(GTLServiceTicket *ticket,
                                GTLPlusPeopleFeed *peopleFeed,
                                NSError *error) {
                if (error) {
                    GTMLoggerError(@"Error: %@", error);
                } else {
                    // Get an array of people from GTLPlusPeopleFeed
                    NSArray* peopleList = [peopleFeed.items mutableCopy];

                    NSLog(@"peopleList:%@", peopleList);
                }
            }];
}

person Coder_A_D    schedule 13.03.2014    source источник
comment
Не публикуйте фотографии секретов своего приложения публично, вам следует как можно скорее сбросить их в консоли разработчика Google.   -  person abraham    schedule 13.03.2014


Ответы (5)


Вызовите следующий метод, после успешного входа в систему, для меня я получаю список друзей, используя метод ниже

-(void)finishedWithAuth: (GTMOAuth2Authentication *)auth
                   error: (NSError *) error {


GTLServicePlus* plusService = [[GTLServicePlus alloc] init];

    plusService.retryEnabled = YES;

    [plusService setAuthorizer:[GPPSignIn sharedInstance].authentication];
    GTLQueryPlus *query =
    [GTLQueryPlus queryForPeopleListWithUserId:@"me"
                                    collection:kGTLPlusCollectionVisible];
    [plusService executeQuery:query
            completionHandler:^(GTLServiceTicket *ticket,
                                GTLPlusPeopleFeed *peopleFeed,
                                NSError *error) {
                if (error) {
                    GTMLoggerError(@"Error: %@", error);
                } else {
                    // Get an array of people from GTLPlusPeopleFeed
                    NSArray* peopleList = peopleFeed.items;
                    NSLog(@"peopleList %@ ",peopleList);

                }
            }];

}
person Anilkumar iOS - ReactNative    schedule 26.05.2014
comment
Я попробовал ваш предложенный код, но получаю эту ошибку - [lvl = 3] __41- [ViewController finishedWithAuth: error:] _ block_invoke () Ошибка: Error Domain = com.google.GTLJSONRPCErrorDomain Code = 401 Операция не может быть завершена. (Недействительные учетные данные) UserInfo = 0x7b05aba0 {error = Invalid Credentials, GTLStructuredError = GTLErrorObject 0x7afdfba0: {message: Invalid Credentials code: 401 data: [1]}, NSLocalizedFailureReason = (Invalid Credentials)}. Ты мог бы сказать мне, где я делаю ошибку? - person ChenSmile; 12.01.2015
comment
@Dilip, я думаю, проверьте ваш секретный ключ и учетные данные, предоставленные разработчиками Google, и проверьте настройки на странице разработчиков Google. Я надеюсь, это поможет вам. Всего наилучшего!! - person Anilkumar iOS - ReactNative; 12.01.2015
comment
Привет, я думаю, вы разговариваете с @Imran :). - person Dilip; 12.01.2015
comment
Дилип извини, вместо @Imran я упомянул твое имя - person Anilkumar iOS - ReactNative; 12.01.2015
comment
@Imran, пожалуйста, проверьте, какой идентификатор пакета вы вставили для своего приложения в учетную запись Google, и доступ к ключу api в вашем приложении - person Anilkumar iOS - ReactNative; 12.01.2015
comment
@Anilkumar, я проверил, братан тот же самый идеальный пакет, который я использовал в консоли и приложении - person ChenSmile; 12.01.2015
comment
@Imran, не видя вашего кода, очень сложно сказать ответ, в любом случае вы выполнили эти шаги, developers.google.com/+/quickstart/ios - person Anilkumar iOS - ReactNative; 12.01.2015
comment
@Anilkumar ya, я выполнил те же шаги, смог успешно войти в систему и получить наши данные, но электронное письмо с именем друзей не приходит. я пробовал только твой код - person ChenSmile; 12.01.2015
comment
это сработало для меня, и, кстати, я давно работал с google sdk. Возможно какие-то изменения произошли в разработчиках Google, проверьте @Imran - person Anilkumar iOS - ReactNative; 12.01.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person ChenSmile; 12.01.2015

По моему опыту, у Google+ SDK в настоящее время нет метода получения списка друзей.

Для получения контактов предлагается использовать Google Contacts API. Может случиться так, что контакты, полученные из этого API, не будут активны в Google+. Итак, это смешанный список.

Итак, ждите обновлений от Google.

person KSB    schedule 14.03.2014

У нас есть способ получить информацию о друзьях, видимых в Google Plus. Пожалуйста, взгляните на описание, и если оно будет вам недостаточно ясным, я дам более подробное описание.

GTMOAuth2Authentication *auth;

/*That you will get when you login by your google plus account. So I am considering that you already have it.*/

NSMutableArray  *arrFriends  = [NSMutableArray new];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
{
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://www.googleapis.com/plus/v1/people/%@/people/visible?orderBy=alphabetical&access_token=%@",@"your_user_id",auth.accessToken]];

    /*When you login via Google plus and fetch your profile information, you will get your user id.*/

    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:url];
    [request startSynchronous];

    if(LOGS_ON) NSLog(@"GooglePlusConnect-->getchGooglePlusFriends-->responseString = %@",request.responseString);
});

Пожалуйста, дайте мне знать, если вам это недостаточно ясно, я предоставлю еще несколько описаний.

person Mohd Haider    schedule 21.08.2014

Привет, я тоже столкнулся с такой же ошибкой, но она была решена. Проблема в настройке объема.

установите для области вид #define kGTLAuthScopePlusLogin @ "https://www.googleapis.com/auth/plus.login "

- (void)viewDidLoad
{
[super viewDidLoad];

GPPSignIn *signInG = [GPPSignIn sharedInstance];
signInG.shouldFetchGooglePlusUser  = YES;
signInG.shouldFetchGoogleUserEmail = YES;
signInG.clientID = kClientId;
signInG.scopes   = @ [kGTLAuthScopePlusLogin];
signInG.delegate = self;
[signInG trySilentAuthentication];
}

Он будет получать данные о друзьях, такие как имя, URL-адрес изображения, но не адрес электронной почты. Для получения адреса электронной почты попробуйте использовать Contact API. В iOS есть NSXMLParser, контактный код api указан в JS, java, net, вы можете использовать это и получить подробную информацию.

person ChenSmile    schedule 19.01.2015

Привет, я тоже столкнулся с той же проблемой. Эта проблема возникает из-за области действия. В вашем коде вы переопределили область видимости.

signIn.scopes = @[ kGTLAuthScopePlusLogin];  

С участием

signIn.scopes = @[ @"profile" ];            // "profile" scope

Итак, вы должны изменить свою область действия простым

signIn.scopes = @[ kGTLAuthScopePlusLogin]; 

Or

signIn.scopes = @[ kGTLAuthScopePlusLogin,@"profile"]; 
person vp2698    schedule 03.05.2017