FBConnect iOS SDK publish_action Проблема - PullRequest
0 голосов
/ 17 февраля 2012

Должен сказать, что сейчас я чувствую себя идиотом.:) Я был взад и вперед в Facebook, Google и StackOverflow и до сих пор не могу получить ответ на то, что я делаю неправильно!:) Я посмотрел оба примера из Facebook: Hackbook и WishList.Wishlist, очевидно, должен сказать мне, что делать, но ALL примеры, которые я видел, имеют часть OBJECT в качестве URL.Я не обязательно желаю этого, поскольку я просто хочу, чтобы в сообщении говорилось, что (этот пользователь) играет [MyGame] .

Хорошо, вот моя цель.У меня есть игра для iPhone.Я хочу делать то, что делает Spotify, когда вы слушаете песню, которая публикует хронологию и тикер.Я также хотел бы использовать это, чтобы опубликовать счет игрока на временной шкале и в тикере.

Я настраиваю Open Graph с действием, называемым Play, и объектом с именем Game вместе с его агрегатором.Я думаю, что мне также понадобится действие под названием Score?

В любом случае, я могу успешно опубликовать сообщение на стене пользователя с помощью диалога feed, но это не то, что я хочу для действия Play.

Вот краткая версия того, что я получил до сих пор, любая помощь очень ценится:

Пара Примечаний: у меня есть синглтон FacebookInfo, который заботится о работе с делегатами Facebook и прочим.У меня также есть класс FacebookUser, который содержит информацию о текущем пользователе для текущего сеанса, заполняется при вызове me.У меня также есть метод DLog, который просто делает NSlog только в режиме отладки.

Когда пользователь нажимает кнопку Play в моей игре, я хотел бы вызвать мой метод [[Facebook sharedInfo] publishAction:@"play"] ниже.Я передаю NSString как действие, поэтому позже я могу вызвать тот же метод и использовать действие, подобное Score, и просто соответствующим образом изменить сообщение.

@interface FacebookInfo : NSObject  {
    Facebook *_facebook;
    FacebookUser *_facebookUser;
}

@property (nonatomic, retain) Facebook *facebook;
@property (nonatomic, retain) FacebookUser *facebookUser;

+(id)sharedInfo;
-(BOOL)isFacebookAuthenticated;
-(void)fbDidLogout;
-(void)getMe;
-(void)publishFeed;
-(void)publishWithAction:(NSString *)action;

@end
static FacebookInfo *facebookInfo = nil;


@implementation FacebookInfo


@synthesize facebook = _facebook;
@synthesize facebookUser = _facebookUser;


#pragma mark - Custom Methods


-(void)getMe {
    DLog(@"**********");
/* when forcing FBConnect to show inline dialog instead of using SSO, this works.
apparently this fails when using SSO, error:
Err message: (null)
Err code: 10000
*/
    [[self facebook] requestWithGraphPath:@"me" andDelegate:self]; 
}


-(void)publishWithAction:(NSString *)action {
    DLog(@"**********");

    if ([action isEqualToString:@"play"]) {
        // Build the params list
        NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithCapacity:1];
        // all sample have this pointing to a URL. Do i really need to do that?
        [params setValue:kFBAppNameSpace forKey:@"game"];
        // I know I may need more parameters, but which are required?
        // Do I need to add the one's that Facebook Javascript examples have, 
        // like title, description? I think it's here where I'm mostly confused.

        // Make the Graph API call to add to the wishlist
        [[self facebook] requestWithGraphPath:@"me/[myappnamespace]:play" 
                                andParams:params
                            andHttpMethod:@"POST"
                              andDelegate:self];

        [params release];
    }
}


-(void)publishFeed {
    DLog(@"**********");
    /*
This works perfectly fine
*/
    SBJSON *jsonWriter = [[SBJSON new] autorelease];

    NSDictionary *actionLinks = [NSArray arrayWithObjects:
                                 [NSDictionary dictionaryWithObjectsAndKeys:
                                  @"Get The App",@"name",
                                  kFBAppURL,@"link",
                                  nil],
                                 nil];

    NSString *actionLinksStr = [jsonWriter stringWithObject:actionLinks];

    NSString *app_id = kFBAppID;
    NSString *user_message_prompt = [NSString stringWithFormat:@"Post to Your Wall!"];
    NSString *name = [NSString stringWithFormat:@"[MyGameName]"];
    NSString *caption = [NSString stringWithFormat:@"%@ has gotten a score of %@!",[[self facebookUser] firstName],[[[GameInfo sharedGameInfo] scoreTotal] stringValue]];
    NSString *description = [NSString stringWithFormat:@"Can you beat this score?!"];
    NSString *link = kFBAppURL;
    NSString *picture = kFBAppImage;

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   app_id, @"app_id",
                                   user_message_prompt,  @"user_message_prompt",
                                   name, @"name",
                                   caption, @"caption",
                                   description, @"description",
                                   link, @"link",
                                   picture, @"picture",
                                   actionLinksStr, @"actions",
                                   nil];

    [[self facebook] dialog:@"feed"
                  andParams:params
                andDelegate:self];
}


-(BOOL)checkForPreviousAccessToken {
    DLog(@"**********");

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) {
        DLog(@"FB: Token Exists!");
        [[self facebook] setAccessToken:[defaults objectForKey:@"FBAccessTokenKey"]];
        [[self facebook] setExpirationDate:[defaults objectForKey:@"FBExpirationDateKey"]];
    }
    if (![[self facebook] isSessionValid]) {
        DLog(@"FB: Authorizing...");
        NSArray *permissions = [[NSArray alloc] initWithObjects:
                                @"publish_stream",
                                @"publish_actions",
                                @"offline_access",
                                nil];
        [[self facebook] authorize:permissions];
        [permissions release];
    } else {
        DLog(@"FB: Authorized!!!");
        // show logged in
        [self getMe];
    }

    return [[self facebook] isSessionValid];
}


-(BOOL)isFacebookAuthenticated {
    DLog(@"**********");

    return [self checkForPreviousAccessToken];
}


-(void)extendAccessTokenIfNeeded {
    DLog(@"**********");

    [[self facebook] extendAccessTokenIfNeeded];
    [[FacebookInfo sharedInfo] getMe];
}


-(void)logout {
    DLog(@"**********");

    [[self facebook] logout:self];
}


#pragma mark - FBConnect Delegate Methods

-(void)fbDidLogin {
    DLog(@"**********");

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[[self facebook] accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[[self facebook] expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

    [self getMe];
}


- (void)fbDidNotLogin:(BOOL)cancelled {
    DLog(@"**********");


}


- (void)fbDidExtendToken:(NSString*)accessToken expiresAt:(NSDate*)expiresAt {
    DLog(@"**********");

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:accessToken forKey:@"FBAccessTokenKey"];
    [defaults setObject:expiresAt forKey:@"FBExpirationDateKey"];
    [defaults synchronize];
}


-(void)fbDidLogout {
    DLog(@"**********");

    // Remove saved authorization information if it exists
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"]) {
        [defaults removeObjectForKey:@"FBAccessTokenKey"];
        [defaults removeObjectForKey:@"FBExpirationDateKey"];
        [defaults synchronize];
    }
}


- (void)fbSessionInvalidated {
    DLog(@"**********");


}


#pragma mark - FBRequestDelegate Methods

/**
 * Called when the Facebook API request has returned a response. This callback
 * gives you access to the raw response. It's called before
 * (void)request:(FBRequest *)request didLoad:(id)result,
 * which is passed the parsed response object.
 */
- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response {
    DLog(@"**********");

    //DLog(@"received response");
}

/**
 * Called when a request returns and its response has been parsed into
 * an object. The resulting object may be a dictionary, an array, a string,
 * or a number, depending on the format of the API response. If you need access
 * to the raw response, use:
 *
 * (void)request:(FBRequest *)request
 *      didReceiveResponse:(NSURLResponse *)response
 */
- (void)request:(FBRequest *)request didLoad:(id)result {
    DLog(@"**********");
    //code removed for this example
}

/**
 * Called when an error prevents the Facebook API request from completing
 * successfully.
 */
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
    DLog(@"**********");

    DLog(@"Err message: %@", [[error userInfo] objectForKey:@"error_msg"]);
    DLog(@"Err code: %d", [error code]);
    if ([error code] == 190) {
        // logout
    } else {
        DLog(@"There was an error making your request.");
    }
}


#pragma mark - Singleton Methods


+ (id)sharedInfo {
    //DLog(@"**********");

    @synchronized(self) {
        if(facebookInfo == nil)
            facebookInfo = [[super allocWithZone:NULL] init];
    }
    return facebookInfo;
}


+ (id)allocWithZone:(NSZone *)zone {
    DLog(@"**********");

    return [[self sharedInfo] retain];
}


- (id)copyWithZone:(NSZone *)zone {
    DLog(@"**********");

    return self;
}


- (id)retain {
    DLog(@"**********");

    return self;
}


- (unsigned)retainCount {
    DLog(@"**********");

    return UINT_MAX; //denotes an object that cannot be released
}


- (oneway void)release {
    DLog(@"**********");

    // never release
}


- (id)autorelease {
    DLog(@"**********");

    return self;
}


- (id)init {
    DLog(@"**********");

    if ((self = [super init]) != NULL) {
        //Init
        [self setFacebook:[[[Facebook alloc] initWithAppId:kFBAppID urlSchemeSuffix:kFBUrlSchemeSuffix andDelegate:self] autorelease]];
        [self setFacebookUser:[[[FacebookUser alloc] init] autorelease]];
    }
    return self;
}


- (void)dealloc {
    DLog(@"**********");

    // Should never be called, but just here for clarity really.
    DLog(@"Release FacebookInfo...");
    [super dealloc];
}


@end
@implementation AppDelegate_iPhone

// Add for Facebook SSO support (4.2+)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    [[[FacebookInfo sharedInfo] facebook] handleOpenURL:url];
}


// Add for Facebook SSO support (pre 4.2)
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    [[[FacebookInfo sharedInfo] facebook] handleOpenURL:url];
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    DLog(@"**********");

    [[FacebookInfo sharedInfo] extendAccessTokenIfNeeded];
}

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

ОБНОВЛЕНИЕ 1: (2012/18/02)

Хорошо.Поэтому я решил создать страницу, содержащую метаданные og, которую я не хотел делать, и предоставил URL для моего объекта.Согласно документации FB, найденной здесь :

Open Graph Mechanics

When users take an action in your app, such as cook the Stuffed Cookie, the app calls a Graph API to create a new cook action that connects the user with the Stuffed Cookie object. This is accomplished by issuing a HTTP POST to the user’s /me/myapp:cook connection with the URL of the recipe object. Facebook will then crawl the object URL, read the metadata, and connect the object to user's Graph via the action.

The diagram below illustrates the process:

User takes an action in the app, such as "cook" a "recipe"
App calls a Graph API /me/action:object=Object_URL
Facebook will crawl the object URL, read its meta tags and connects the object to the user's Graph via the action.

Было бы здорово, если бы мы могли определить эти вещи в самом приложении как параметры для случаев, когда мне не нужен веб-сайт для.

1 Ответ

0 голосов
/ 21 апреля 2012

По состоянию на 21.04.12 Facebook требует, чтобы вы создали страницу для получения желаемых данных.

...