2011-07-09 31 views
10

我會爲任何建議如何處理我有張貼到Facebook的圖像的問題,感謝麻煩張貼照片。Facebook的IOS SDK - 使用UIImage的

下面的代碼工作,正如我所期望的:

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
       @"http://myserver/img.png", @"picture", 
       @"My Testing", @"name", 
       @"Enter some text...", @"message", 
       nil]; 

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

不過,我真的想用,我從我的相機拍攝的圖像。我已經在應用程序的早期設置了代碼,並將圖像放在屏幕上。於是,我試着這樣做:

CGRect contextRect = CGRectMake(0, 0, 320, 436); 
UIGraphicsBeginImageContextWithOptions(contextRect.size, YES, 1); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

我測試過此代碼,並newImage是一個有效的UIImage,我可以放置和操作,就像我期望。然而,當我嘗試將其集成到Facebook的對話如下:

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
       newImage, @"picture", 
       @"My Testing", @"name", 
       @"Enter some text...", @"message", 
       nil]; 

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

我在控制檯中這兩個荒謬的消息: - [UIImage的長度]:無法識別的選擇發送到實例0x1c9420 CoreAnimation:忽略異常: - [UIImage length]:無法識別的選擇器發送到實例0x1c9420

因此,作爲測試,我想我會嘗試將圖像導入到我的項目並直接訪問它。這是我在第一個例子中在線引用的確切圖像,所以我知道它應該起作用。但即使當我嘗試這樣:

UIImage *newImage = [UIImage imageNamed:@"BaB.png"]; 

我得到了與上面相同的錯誤消息。

我看到「圖片」應該使用URL的圖像Facebook的文檔。但我在網上看到一些例子,表明人們使用的是UIImage而不僅僅是一個URL。

很顯然,我做錯了什麼,但我不知道它可能是什麼。

我會爲任何指針,以如何進行非常感謝。

回答

15

一個概括的答案,列出進程...關鍵是要包括在圖中調用自的access_token facebook的-IOS-SDK並沒有這樣做自動:

1)更新到最新的Facebook -ios-SDK。
2)使用應用程序ID實例化。



     self.facebook = [[Facebook alloc] initWithAppId:kApplicationFBID]; 

3)授權的應用程序,包括publish_stream



    NSArray * neededPermissions = [[[NSArray alloc] initWithObjects:@"user_about_me", @"publish_stream", @"user_photos", nil] autorelease]; 
    [facebook authorize:neededPermissions delegate:appDelegate]; 

4)確保應用程序委託fBDidLogin捕獲並存儲所述訪問令牌&到期在用戶的默認設置(登錄過程的稍後優化)。



    -(void)fbDidLogin { 
     DebugLog(@"New Access Token: %@", [facebook accessToken]); 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
     [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
     [defaults synchronize]; 
    } 

5)確認有效的訪問令牌(非零和未過期)...否則重新授權每個應用程序。
6)將圖像捕獲到UIImage &,稱這是access_token的關鍵添加。這將自動爲您的應用程序創建一個相冊,並將圖像放在那裏並根據我的測試將其發佈到牆上。

-(void)postImageToAlbum:(UIImage *)image { 
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    image, @"source", 
    @"caption desc", @"message",    
    nil]; 
    [facebook requestWithGraphPath:[NSString stringWithFormat:@"/me/photos?access_token=%@", self.facebook.accessToken] 
    andParams:params andHttpMethod:@"POST" andDelegate:self]; 
} 

7)檢查ID結果FBRequestDelegate方法



    -(void)request:(FBRequest *)request didLoad:(id)result { 
     NSLog(@"Request didLoad: %@ ", [request url ]); 
     if ([result isKindOfClass:[NSArray class]]) { 
      result = [result objectAtIndex:0]; 
     } 
     if ([result isKindOfClass:[NSDictionary class]]){ 

     } 
     if ([result isKindOfClass:[NSData class]]) { 
     } 
     NSLog(@"request returns %@",result); 
    } 

8)不使用測試用戶帳戶進行測試......目前它將權威性的測試帳戶,並提供一個訪問令牌但是當你嘗試使用圖形api時,它會返回意想不到的錯誤。如果您在dev.facebook.com上使用網頁版本與原生應用設置,您可能沒問題,因爲假設您可以創建測試用戶並將其與應用相關聯,但我沒有嘗試過。

祝你好運!

+0

這真是太棒了 - 感謝您的幫助 –

+1

在Facebook.m中,在第166行或第166行左右,SDK將access_token添加到傳入的參數中,使得開發人員將訪問令牌傳入時成爲冗餘,無論是param還是URL的一部分。 – mahboudz