FBSession.m
- (BOOL)resume {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
FBUID uid = [[defaults objectForKey:#"FBUserId"] longLongValue];
if (uid) {
NSDate* expirationDate = [defaults objectForKey:#"FBSessionExpires"];
if (!expirationDate || [expirationDate timeIntervalSinceNow] > 0) {
_uid = uid;
_sessionKey = [[defaults stringForKey:#"FBSessionKey"] copy];
_sessionSecret = [[defaults stringForKey:#"FBSessionSecret"] copy];
_expirationDate = [expirationDate retain];
for (id<FBSessionDelegate> delegate in _delegates) {
[delegate session:self didLogin:_uid]; // this is the line where i m getting stuck while looping break
}
return YES;
}
}
return NO;
}
#pragma mark Facebook
- (void)session:(FBSession *)session didLogin:(FBUID)uid{
NSLog(#"Facebook Logged in");
FBStreamDialog *dialog = [[[FBStreamDialog alloc] initWithSession:fbsession] autorelease];
dialog.delegate=self;
Note *note;
NSString *str = [note noteTitle];
dialog.attachment = [NSString stringWithFormat: #"{\"name\" : \"Death Diary Bucket List Item\",\"href\" : \"http://ifidieapp.com\",\"caption\" : \"{*actor*} added a Bucket List Item\",\"description\" : \"%# \",\"media\": [{\"type\": \"image\",\"src\": \"http://deathdiaryapp.com/wp-content/uploads/2010/01/facebook-big-icon.jpg\",\"href\": \"http://ifidieapp.com\"}]}",str];
}
dialog.userMessagePrompt = #"Enter anything about the item here:";
[dialog show];
}
What could be wrong?
not sure why you should have a array of delegate...
if stuck, try the old API:
facebook = [[Facebook alloc] initWithAppId:#"YOUR_APP_ID"];
[facebook dialog:#"stream.publish" andParams:fbArguments andDelegate:self];
easier, faster (for prototyping or light needs.
if you want a specific answer to your issue, please provide more details (where do you initialize your fb object, where do you call FBSession from).
Related
I am totally new in IOS Development, And I am making a app using MailCore2 api.
Company has told me to use MCOIMApIdleOperation to get the emails from Gmail Server.
I have google all the way to find out solution about this but it is not worth it.
Here is detail about the Problem,
First I want to load the emails from the INBOX folder through MCOIMAPIdleOperation.Below is my code for fetching emails.
- (void)viewDidLoad{
[super viewDidLoad];
//Do any additional setup after loading the view from its nib.
//Made connection with Gmail Imap Server
NSUserDefaults *defaules = [NSUserDefaults standardUserDefaults];
NSString *emailid = [defaules objectForKey:#"emailid" ];
NSString *password = [defaules objectForKey:#"password" ];
session = [[MCOIMAPSession alloc] init];
session.hostname = #"imap.gmail.com";
session.port = 993;
session.username = emailid;
session.password = password;
session.connectionType = MCOConnectionTypeTLS;
idle=[session idleOperationWithFolder:#"INBOX" lastKnownUID:0];
[idle start:^(NSError *err){
MCOIMAPMessagesRequestKind requestKind = (MCOIMAPMessagesRequestKind)
(MCOIMAPMessagesRequestKindHeaders | MCOIMAPMessagesRequestKindStructure |MCOIMAPMessagesRequestKindInternalDate | MCOIMAPMessagesRequestKindHeaderSubject |MCOIMAPMessagesRequestKindFlags);
MCOIMAPFolderInfoOperation *inboxFolderInfo = [session folderInfoOperation:Folder];
NSLog(#"statrt1");
[inboxFolderInfo start:^(NSError *error, MCOIMAPFolderInfo *info)
{
NSLog(#"start2");
BOOL totalNumberOfMessagesDidChange =
self.totalNumberOfInboxMessages != [info messageCount];
self.totalNumberOfInboxMessages = [info messageCount];
NSUInteger numberOfMessagesToLoad =MIN(self.totalNumberOfInboxMessages, nMessages);
if (numberOfMessagesToLoad == 0)
{
self.isLoading = NO;
return;
}
// If total number of messages did not change since last fetch,
// assume nothing was deleted since our last fetch and just
// fetch what we don't have
MCORange fetchRange;
if (!totalNumberOfMessagesDidChange && msgbody.count)
{
numberOfMessagesToLoad -= msgbody.count;
fetchRange = MCORangeMake(self.totalNumberOfInboxMessages -msgbody.count -(numberOfMessagesToLoad - 1),(numberOfMessagesToLoad - 1));
}
// Else just fetch the last N messages
else
{
fetchRange =MCORangeMake(self.totalNumberOfInboxMessages -(numberOfMessagesToLoad - 1),(numberOfMessagesToLoad - 1));
}
MCOIMAPFetchMessagesOperation *imapMessagesFetchOp =[session fetchMessagesByNumberOperationWithFolder:Folder requestKind:requestKind numbers:
[MCOIndexSet indexSetWithRange:fetchRange]];
[imapMessagesFetchOp start:^(NSError *error, NSArray *messages, MCOIndexSet *vanishedMessages)
{
NSSortDescriptor *sort =[NSSortDescriptor sortDescriptorWithKey:#"header.date" ascending:NO];
NSMutableArray *combinedMessages = [NSMutableArray arrayWithArray:messages];
[combinedMessages removeAllObjects];
[combinedMessages addObjectsFromArray:messages];
msgbody=[combinedMessages sortedArrayUsingDescriptors:#[sort]];
[uitable reloadData];
}];
}];
}];
}
By Above code mails are fetched successfully.Problem is when new mail is arrive above code is not running again.what to do so that i can get the new mails when they arrive..
Please help me to solve this issue.
In my chat application I want to get all online registered users. So everybody and not only people in my roster which is achieved with this code:
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence {
// a buddy went offline/online
NSString *presenceType = [presence type]; // online/offline
NSString *myUsername = [[sender myJID] user];
NSString *presenceFromUser = [[presence from] user];
if (![presenceFromUser isEqualToString:myUsername]) {
if ([presenceType isEqualToString:#"available"]) {
[_chatDelegate newBuddyOnline:[NSString stringWithFormat:#"%##%#", presenceFromUser, #"chat.denederlandsewateren.nl"]];
} else if ([presenceType isEqualToString:#"unavailable"]) {
[_chatDelegate buddyWentOffline:[NSString stringWithFormat:#"%##%#", presenceFromUser, #"chat.denederlandsewateren.nl"]];
}
}
}
With this code the users only sees other users who are 'friends' but I need all users registered on this particular domain. Is this possible with ejabberd?
- (void)getAllRegisteredUsers {
NSError *error = [[NSError alloc] init];
NSXMLElement *query = [[NSXMLElement alloc] initWithXMLString:#"<query xmlns='http://jabber.org/protocol/disco#items' node='all users'/>"
error:&error];
XMPPIQ *iq = [XMPPIQ iqWithType:#"get"
to:[XMPPJID jidWithString:#"DOMAIN"]
elementID:[xmppStream generateUUID] child:query];
[xmppStream sendElement:iq];
}
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{
NSXMLElement *queryElement = [iq elementForName: #"query" xmlns: #"http://jabber.org/protocol/disco#items"];
if (queryElement) {
NSArray *itemElements = [queryElement elementsForName: #"item"];
NSMutableArray *mArray = [[NSMutableArray alloc] init];
for (int i=0; i<[itemElements count]; i++) {
NSString *jid=[[[itemElements objectAtIndex:i] attributeForName:#"jid"] stringValue];
[mArray addObject:jid];
}
}
I had the same issue, I got queryElement as nil as well. I've changed the response code to see the XML like this:
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{
//DDLogVerbose(#"%#: %# - %#", THIS_FILE, THIS_METHOD, [iq elementID]);
//NSXMLElement *queryElement = [iq elementForName:#"query" xmlns: #"http://jabber.org/protocol/disco#items"];
NSXMLElement *queryElement = [iq elementForName:#"query" xmlns: #"jabber:iq:roster"];
NSLog(#"IQ: %#",iq);
if (queryElement) {
NSArray *itemElements = [queryElement elementsForName: #"item"];
NSMutableArray *mArray = [[NSMutableArray alloc] init];
for (int i=0; i<[itemElements count]; i++) {
NSString *jid=[[[itemElements objectAtIndex:i] attributeForName:#"jid"] stringValue];
NSLog(#"%#",jid);
[mArray addObject:jid];
}
}
return NO;
}
As you may see what I've changed is the xmlns: from this xmlns: #"http://jabber.org/protocol/disco#items" to this xmlns: #"jabber:iq:roster" and that gave me the list of users.
I'm using ejabberd, not sure if this works for all the others XMPP servers.
Also I've found that this gave me the list of the "buddy" users, looks like if you want "all" users you need to make the query as an admin user. Please check this link for more information about it: https://www.ejabberd.im/node/3420
After googling, You can not get all user easily, You must need to create Shared Roster Groups by follow step in the Example 1: everybody can see everybody else after done this you will get all the online users in the below delegate methods.
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
So the problem I am having is that I'm using RestKit to to authenticate a self signed certificate and deal with user login simultaneously but after the webView opens then that first page is not being added to the backForward list (as far as i can tell). i.e. after i click on a link on that page I cannot go back to the previous page. If I click on another link (3 pages in) i can go back to the second page but still not the first.. Is there a way to manually add the URL to the backForward list when I open the UI Webview? Or any suggestions for other work-arounds?
- (id)initWithURL:(NSURL*)pageURL {
_retainedURL = pageURL;
[_retainedURL retain];
RKClient *client;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
client = [RKClient clientWithBaseURL: pageURL];
client.username=[userDefaults objectForKey:#"UserName"];
client.password=[userDefaults objectForKey:#"Password"];
client.authenticationType=RKRequestAuthenticationTypeHTTPBasic;
client.disableCertificateValidation= TRUE;
//The below "delegate:self seems to be what is preventing the URL from passing into the forwardBack list (works if it is delegate self but then RestKit breaks
RKRequest *request=[RKRequest requestWithURL:pageURL delegate:self];
[client configureRequest:request];
request.authenticationType = RKRequestAuthenticationTypeHTTPBasic;
request.disableCertificateValidation = TRUE;
self.authenticatedRequest = request;
NSLog(#"%#",[request URLRequest]);
[request sendAsynchronously];
if(self = [super init]) {
self.URL = pageURL;
self.availableActions = SVWebViewControllerAvailableActionsOpenInSafari | SVWebViewControllerAvailableActionsMailLink | SVWebViewControllerAvailableActionsCopyLink;
}
return self;
}
I ended up fixing this error by creating an NSMutableArray array to keep track of the browser history and adding code to handle various things such as the forward and back buttons display. I'm using 2 ints (urlListIndex and urlIndexMax) as well as a BOOL (backFix) for navigation control
- (id)initWithURL:(NSURL*)pageURL {
_retainedURL = pageURL;
[_retainedURL retain];
RKClient *client;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
client = [RKClient clientWithBaseURL: pageURL];
client.username=[userDefaults objectForKey:#"UserName"];
client.password=[userDefaults objectForKey:#"Password"];
client.authenticationType=RKRequestAuthenticationTypeHTTPBasic;
client.disableCertificateValidation= TRUE;
RKRequest *request=[RKRequest requestWithURL:pageURL];
[client configureRequest:request];
request.delegate = self;
request.authenticationType = RKRequestAuthenticationTypeHTTPBasic;
request.disableCertificateValidation = TRUE;
self.authenticatedRequest = request;
[request sendAsynchronously];
//Instantiate urlList (for web history) and urlListIndex
urlList = [[NSMutableArray alloc] init];
urlListIndex = 0;
if(self = [super init]) {
self.URL = pageURL;
self.availableActions = SVWebViewControllerAvailableActionsOpenInSafari | SVWebViewControllerAvailableActionsMailLink | SVWebViewControllerAvailableActionsCopyLink;
}
return self;
}
- (void)updateToolbarItems {
//check if you are further than the first page. If so, enable the back button
if (urlListIndex > 0)
{
self.backBarButtonItem.enabled = YES;
}
else
{
self.backBarButtonItem.enabled = NO;
}
//Check if there are more total urls in the list than the one you are on. If so, enable the forward button
if (urlListIndex < maxListIndex)
{
self.forwardBarButtonItem.enabled = YES;
}
else
{
self.forwardBarButtonItem.enabled = NO;
}
//Took out the rest for space
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:#"document.title"];
NSURL *urlstring = self.mainWebView.request.URL;
//Check to see if the current url is in the list. If not, add it to the list.
if ([urlList containsObject:urlstring])
{}
else
{
//The first url you click doesnt show up normally so an exception is used here with _retainedURL
if (_retainedURL != nil)
{
[urlList addObject:_retainedURL];
_retainedURL = nil;
}
else
{ if (backFix == NO)
{
urlListIndex++;
[urlList addObject:urlstring];
}
}
}
//Keeps track of the max number of URLs in the list
if (urlListIndex > maxListIndex)
{
maxListIndex = urlListIndex;
}
[self updateToolbarItems];
backFix = NO;
}
- (void)goBackClicked:(UIBarButtonItem *)sender {
backFix = YES;
urlListIndex--;
_request = [NSURLRequest requestWithURL:[urlList objectAtIndex:urlListIndex]];
[mainWebView loadRequest:_request];
}
//Handles the forward button by incrementing the urlListIndex and then loading the url for that index.
- (void)goForwardClicked:(UIBarButtonItem *)sender {
urlListIndex++;
_request = [NSURLRequest requestWithURL:[urlList objectAtIndex:urlListIndex]];
[mainWebView loadRequest:_request];
}
I'm kind of new to this, so it might be a beginners mistake. The problem is that when i send a message to a method it doesn't connect.
Here's the calling method:
-(BOOL) login:(LoginInfo *) info{
NSString *url = [NSString stringWithFormat:#"%#/%#?name=%#&password=%#", FAMORABLE_API_URL,FAMORABLE_API_ACTION_LOGIN, info.username, info.password];
NSDictionary* json = [self getJson:url];
NSString *token = [json objectForKey:#"Token"];
NSLog(#"results: %#", token);
LoginInfo *loginResult = [LoginInfo alloc];
loginResult.token = token;
//TODO
NSLog(#"test 1 %#", loginResult.token);
[clientService saveLoginInfo:loginResult];
return YES;
}
On the line above the last you can see I'm sending to saveLoginInfo in clientService which is declared in ClientService.h which is imported in this file.
-(void) saveLoginInfo:(LoginInfo *)info{
NSLog(#"test 2 %#", info);
NSLog(#"test 3%#", info.token);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:info.token forKey:KEY_TOKEN];
NSString *string = [defaults stringForKey:KEY_TOKEN];
NSLog(#"test 4%#", string);
// save it
[defaults synchronize];
if (!(info.token)){
self.currentUser = nil;
self.isLoggedOn=false;
}else{
self.currentUser = info;
self.isLoggedOn=true;
}
}
This is the method being called. I've put out a bunch of logs, mostly as a safe if i did one wrong, but none of them are being executed...
Do you have any ideas of what might be wrong?
Thanks in advance
Tom
Is clientService in the line [clientService saveLoginInfo:loginResult]; an instance variable in your class?
If so, make sure that you have instantiated the object somewhere before you call it. (Either in your class's init method, or possibly viewDidLoad if it's a UIViewController.)
E.g.
- (void)viewDidLoad {
[super viewDidLoad];
clientService = [[MyClientService alloc] init];
}
- (id)init {
self = [super init];
if (self) {
clientService = [[MyClientService alloc] init];
}
return self;
}
(Make sure you also release the instance in the dealloc method.
I must say I feel like an idiot right now. :) I've been up and down Facebook, Google and StackOverflow and still cannot get the answer to what I am doing wrong! :) I've looked at both Facebook examples: Hackbook and WishList. Wishlist is obviously the one that should tell me what to do, but ALL the examples I've seen have the OBJECT part as a URL. I do not necessarily desire this, as I just want the post to say (this user) is playing [MyGame].
Ok here's my goal. I have an iPhone game. I want to do what Spotify does when you listen to a song, which posts to timeline and ticker. I'd also like to use this to post the player's score on the user's timeline and ticker.
I setup Open Graph with an action called Play and an object called Game along with it's aggregator. I think I also will need an action called Score?
Anyways, I can successfully post to a user's wall using feed dialog, but that's not what I want for the Play action.
Here's a concise version of what I got so far, any help is much appreciated:
Couple Notes:
I have a singleton FacebookInfo which takes care of handling Facebook delegates and stuff. I also have a FacebookUser class which hold the current user's info for the current session, populated when calling me. I also have a DLog method which simply does an NSlog only on debug mode.
When a user clicks the Play button in my game, I would like to call my method [[Facebook sharedInfo] publishAction:#"play"] below. I'm passing an NSString as action so later I can call the same method and use an action like Score and just modify the post accordingly.
#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];
}
Wow, I know this is a long post, but I hope someone can help point me in the right direction.
UPDATE 1: (2012/18/02)
Ok. So I settled for making a page which contains the og meta-data which I did not want to do and supplied the url for my object. As per the FB Documentation, found here:
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.
It would be cool if we can define these things in the app itself as params for cases where I do not need a website for.
As of 4/21/12 Facebook requires you to have created a page to get the data desired.