Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c FBConnect iOS SDK发布\操作问题_Objective C_Ios_Facebook Graph Api_Facebook Opengraph_Fbconnect - Fatal编程技术网

Objective c FBConnect iOS SDK发布\操作问题

Objective c FBConnect iOS SDK发布\操作问题,objective-c,ios,facebook-graph-api,facebook-opengraph,fbconnect,Objective C,Ios,Facebook Graph Api,Facebook Opengraph,Fbconnect,我必须说我现在觉得自己像个白痴我在Facebook、Google和StackOverflow上下翻来覆去,仍然无法找到我做错了什么的答案!:)我看过两个Facebook的例子:Hackbook和WishListWishlist显然应该告诉我该做什么,但是我看到的所有示例都将对象作为URL。我不一定希望这样,因为我只想让帖子说(这个用户)正在玩[MyGame] 好的,这是我的目标。我有一个iPhone游戏。我想做的是Spotify在听一首歌时所做的事情,这首歌会发布到timeline和ticker

我必须说我现在觉得自己像个白痴我在Facebook、Google和StackOverflow上下翻来覆去,仍然无法找到我做错了什么的答案!:)我看过两个Facebook的例子:
Hackbook
WishList
Wishlist
显然应该告诉我该做什么,但是我看到的所有示例都将对象作为URL。我不一定希望这样,因为我只想让帖子说(这个用户)正在玩[MyGame]

好的,这是我的目标。我有一个iPhone游戏。我想做的是Spotify在听一首歌时所做的事情,这首歌会发布到timeline和ticker上。我还想用它把玩家的分数发布在用户的时间线和股票上

我用一个名为
Play
的动作和一个名为
Game
的对象以及它的聚合器来设置OpenGraph。我想我还需要一个名为
Score

无论如何,我可以使用
feed
对话框成功地发布到用户的墙上,但这不是我想要的
Play
操作

以下是我到目前为止得到的简明版本,非常感谢您的帮助:

注意事项: 我有一个singleton
FacebookInfo
,负责处理Facebook委托和其他事情。我还有一个
facebook用户
类,它保存当前会话的当前用户信息,在调用
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
哇,我知道这是一篇很长的帖子,但我希望有人能帮我指出正确的方向

更新1:(2012/18/02) 嗯。所以我决定制作一个包含og元数据的页面,我不想这样做,并为我的对象提供了url。根据FB文件,发现:

开放图力学 当用户在您的应用程序中执行某个操作时,例如烹调填充的Cookie,应用程序将调用图形API来创建一个新的烹调操作,该操作将用户与填充的Cookie对象连接起来。这是通过向用户的/me/myapp:cook连接发送一个带有recipe对象URL的HTTP POST来实现的。然后,Facebook将抓取对象URL,读取元数据,并通过操作将对象连接到用户的图形。 下图说明了该过程: 用户在应用程序中执行操作,例如“烹饪”或“食谱” 应用程序调用图形API/me/action:object=object\uURL Facebook将抓取对象URL,读取其元标记,并通过操作将对象连接到用户的图形。
如果我们可以在应用程序本身中将这些东西定义为我不需要网站的情况下的参数,那就太酷了。

从2012年4月21日起,Facebook要求你创建一个页面来获取所需的数据。

我想做同样的事情,比如,在不创建带有元标记的关联网页的情况下发布操作。因此,本质上,它只在创建页面之后才起作用。对吗?对。截至2012年3月9日,我只能通过创建一个页面来实现这一点。
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];
}
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.