2012-09-21 32 views
5

Como Mountain Lion ahora oficialmente ha integrado Facebook quería jugar un poco con Accounts.framework y Social.framework de OS X.cuentas de Facebook de acceso en OS X Mountain Lion

puedo configurar una aplicación en la App y se utiliza Facebook desarrollador el código siguiente para solicitar el acceso a las cuentas de Facebook del usuario conectado:

ACAccountStore *acStore = [[ACAccountStore alloc] init]; 
ACAccountType *accType = [acStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; 

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:FB_APP_ID, ACFacebookAppIdKey, @"read_stream, publish_stream", ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil]; 


[acStore requestAccessToAccountsWithType:accType options:options completion:^(BOOL granted, NSError *error) { 
    if (granted) { 
     NSLog(@"Accounts: %@", acStore.accounts); 
     NSLog(@"Access granted"); 
    } else { 
     NSLog(@"Access denied"); 
    } 
}]; 

Ahora siempre sale el error Error Domain=XPCObjectsErrorDomain Code=2 "The operation couldn’t be completed. (XPCObjectsErrorDomain error 2.)"

Cuando lancé la App de Xcode los primeros 2-3 veces, OS X se muestra el diálogo de confirmación "XYZ quiere acceder a sus cuentas de Facebook", hice clic en Aceptar y recibí un error que decía algo así como "La aplicación aún no está instalada". Este error ahora "desapareció" y me aparece el error mencionado anteriormente.

Mi pregunta es: ¿Tengo que configurar algo especial en mi Xcode Project (Info.plist) o en Facebook Developer App para que funcione con OS X? ¿O me estoy perdiendo algo en el código? Ejemplos y tutoriales con respecto a este parecen ser muy raros: -/

ya vi la WWDC 2012 Vídeo sobre el Twitter/Facebook Integración pero utiliza casi exactamente el código que he usado.

Cualquier ayuda es apreciada :-)

Cheers, Björn

actualización
He resuelto el problema, acabo de no haber leído los documentos con suficiente cuidado ;-) Tengo que pasar el permisos como NSArray y no como una cadena. He modificado el diccionario opciones para tener este aspecto:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: FB_APP_ID, ACFacebookAppIdKey, [NSArray arrayWithObjects:@"read_stream", @"publish_stream", @"email", @"user_likes", nil], ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil];

Ahora OS X muestra una alerta que me pregunta si quiero permitir que la aplicación para enviar a Facebook en mi nombre, yo clic en Aceptar y una nueva de error que resulta en ningún acceso a las cuentas de Facebook:

Error Domain=com.apple.accounts Code=7 "The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time."

ya he modificado los permisos a ser sólo email o simplemente user_likes pero todo resultó en el mismo error. Si sólo solicitar el acceso a read_stream el acceso se concede pero los resultados en el error de OAuth 190 con el mensaje Error validating access token: User XXXXXX has not authorized application XXXXXX.

Actualización 2:
ahora he resuelto todos mis problemas, ver mi respuesta a continuación.

Respuesta

11

bien, finalmente lo resolvió :-)

La primera vez que solicitan acceso a un usuarios de cuentas de Facebook, es posible que sólo solicitar permisos del usuario mencionado en "User and Friend permissions" de Permiso de referencia de Facebook.

Una vez que el usuario concedió el acceso y con eso también instaló la aplicación en Facebook, puede solicitar los permisos adicionales requeridos por su aplicación. Es importante que usted puede no pedir leer y permisos de escritura al mismo tiempo, uno tras otro!Por lo tanto, solicitar el permiso read_stream y publish_stream en la misma solicitud no funcionará.

Este es el básicamente el código utilicé:

self.store = [[ACAccountStore alloc] init]; 

ACAccountType *accType = [self.store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; 

NSMutableDictionary *options = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            FB_APP_ID, ACFacebookAppIdKey, 
            [NSArray arrayWithObjects:@"email", @"user_about_me", @"user_likes", nil], ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil];  

[self.store requestAccessToAccountsWithType:accType options:options completion:^(BOOL granted, NSError *error) { 
    if (granted && error == nil) { 
     self.accounts = self.store.accounts;  
     [options setObject:[NSArray arrayWithObjects:@"read_stream, read_mailbox, read_requests", nil] forKey:ACFacebookPermissionsKey]; 
     [self.store requestAccessToAccountsWithType:accType options:options completion:^(BOOL granted, NSError *error) { 
      if (granted && error == nil) { 
       completionHandler(granted, error); 
      } else { 
       NSLog(@"Access denied 2"); 
       NSLog(@"%@", [error description]); 
      } 
     }]; 
    } else { 
     NSLog(@"Error: %@", [error description]); 
     NSLog(@"Access denied"); 
    } 
}]; 

Esperamos que esto ayude a alguien :-)

+0

Hola, ¿puede contestar mi pregunta? http://stackoverflow.com/questions/12644229/ios-6-facebook-posting-procedure-ends-up-with-permissions-alert-view – Stas

+0

Aunque traté de todo lo que publicaste aquí, me refiero a diferentes tipos de permisos ..el resultado es el mismo :( – Stas

+1

¡Qué bien hecho! ... También me ayudó mucho – Warewolf

2

me gustaría añadir que hay una advertencia adicional en la documentación de Facebook:

// if a user has *never* logged into your app, you MUST include one of 
// "email", "user_location", or "user_birthday". Other read 
// permissions can also be included here. 

De lo contrario, se genera el mismo error.

Cuestiones relacionadas