2011-08-17 36 views
8

Tôi đang sử dụng FBConnect sdk để xuất bản bài đăng lên tiểu sử của người dùng qua ứng dụng của tôi. Tôi đang gặp một số vấn đề với điều này:Các vấn đề về FBConnect SDK của Facebook trên iOS

Khi mã có liên quan chạy lần đầu tiên trên thiết bị, người dùng được chuyển hướng lại, theo ý muốn, đến ứng dụng/trang web facebook, yêu cầu anh cho phép nó. nếu người dùng cho phép nó, nó sẽ trả về ứng dụng, trình điều khiển xem "Kết nối với facebook" yêu cầu người dùng đăng nhập. Điều này thật kỳ lạ, vì người dùng đã đăng nhập, nếu không thì làm thế nào để cho phép ứng dụng ? nhưng tôi đoán điều này có thể ổn, vì anh ta chưa đăng nhập thông qua ứng dụng. sau khi anh ta đăng nhập, nó không làm gì cả. chỉ lần thứ hai mã được chạy, sau khi anh ta ủy quyền ứng dụng, người dùng nhận được hộp thoại đăng bài.

Nếu người dùng không ủy quyền ứng dụng, khi ứng dụng quay lại ứng dụng của tôi sau hộp thoại ủy quyền, ứng dụng sẽ yêu cầu người dùng đăng nhập (giống như người được ủy quyền) và không làm gì sau khi anh ấy đăng nhập. lần thứ hai mã được chạy, hộp thoại ủy quyền mở ra, với các tùy chọn "Ủy quyền" & "Thoát ứng dụng" thay vì "Ủy quyền" & "Không cho phép"/"Cho phép" & "Không cho phép". Ngoài ra, nếu người dùng đã xóa ủy quyền của anh ấy thông qua cài đặt tài khoản của anh ấy trên facebook, thay vì chỉ yêu cầu anh ấy ủy quyền lại, một hộp thoại facebook hiện ra (thay vì hộp thoại đăng bài/ủy quyền), nói: "An đã xảy ra lỗi. Vui lòng thử lại sau. " Thử sau không giúp được gì. nó sẽ bật lên, ngay cả khi bạn khởi động lại ứng dụng. cách duy nhất để làm cho nó biến mất là cài đặt lại ứng dụng, điều này sẽ khiến ứng dụng bật lại hộp thoại authoriziation.

Vì vậy, đây là những gì tôi muốn đạt được:

  1. Sau khi người dùng cho phép các ứng dụng, ông sẽ không phải đăng nhập lại.
  2. Sau khi người dùng ủy quyền ứng dụng, hộp thoại đăng sẽ bật lên một cách rõ ràng, mà không cần phải chạy lại mã (được kích hoạt, btw, bằng một nút).
  3. Nếu người dùng hủy cấp phép ứng dụng, người đó sẽ được nhắc lại bằng hộp thoại ủy quyền, thay vì hộp thoại báo lỗi
  4. Nếu anh từ chối ủy quyền, tôi sẽ gọi chức năng hiển thị lỗi/v.v.

Dưới đây là các mã có liên quan:

MyViewController.m

- (void)shareOnFacebook 
{ 
    Facebook *facebook = [[Facebook alloc] initWithAppId:myAppID]; 
    [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] setFacebook:facebook]; 
    [facebook release]; 
    facebook = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] facebook]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 
    if (![facebook isSessionValid]) { 
     [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]]; 
    } 

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    //Giving the dictionary some parameters for posting defaults 
    [facebook dialog:@"feed" andParams:dictionary andDelegate:self]; //Note: we have 2 different delegates! appDelegate for connections & url switching, and self for dialogs 
} 

MyAppDelegate.h

@interface MyAppDelegate : NSObject <UIApplicationDelegate, FBSessionDelegate, FBDialogDelegate> 
{ 
    Facebook *facebook; // kept for facebook sharing, accessed only from MyViewController although delegate methods are handeled in here 
} 
@property (nonatomic, retain) Facebook *facebook; 

@end 

MyAppDelegate.m

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

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

Có thể tôi thiếu một số chức năng ủy nhiệm trên MyViewController không? Bởi vì tôi thấy vì một lý do nào đó mà tôi đã đánh dấu nó là triển khai thực hiện giao thức FBDialogDelegate, mặc dù anh ta không thực hiện bất kỳ chức năng nào từ đó.

Tôi thực sự rất vui nếu các bạn có thể giúp tôi, vì điều này cực kỳ bực bội đối với tôi. Tôi không thể tìm thấy gì về điều này trên internet, và tôi cảm thấy như im đắm đuối ở đây.

Tnx trước!

+0

Nó có lẽ không phải là câu trả lời cho câu hỏi của bạn, nhưng có vẻ như với tôi một vấn đề bạn có thể có là trường hợp Facebook được tái tạo trên mỗi phần. Từ tài liệu có vẻ như cá thể Facebook thường được thêm vào AppDelegate và không bao giờ được gán lại khi ứng dụng đang chạy. Có lẽ kiểm tra mã này tôi đã viết cho một dự án tôi đang làm việc trên, nó có thể được dễ dàng hơn để giải quyết vấn đề của bạn (nó không hoàn hảo được nêu ra, nhưng dường như làm việc tốt như xa như chia sẻ là có liên quan): http://stackoverflow.com/câu hỏi/7085162/facebook-connect-class-với-singleton-access-token-issue/7085809 # 7085809 –

Trả lời

8

Đầu tiên:

[facebook authorize:[NSArray arrayWithObjects:@"publish_stream",@"offline_access",nil] delegate:self]; 

Mấu chốt offline_access đây sẽ giữ thẻ auth bạn sống mãi mãi (hoặc, cụ thể hơn, cho đến khi người sử dụng bằng tay de-cho phép ứng dụng của bạn trong cài đặt ứng dụng của họ trong Facebook của họ cài đặt tài khoản). Ngoài ra, hãy đặt VC hoạt động của bạn làm đại biểu (xem thêm về sau).

Thứ hai:

-(void)popUserShareFeed { 
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    //Giving the dictionary some parameters for posting defaults 
    [facebook dialog:@"feed" andParams:dictionary andDelegate:self]; 
} 

Gọi phương pháp này (hoặc một mặt hàng như nó) trong phương pháp -fbDidLogin đại biểu của mình. Cũng gọi nó là trong phương pháp ban đầu của bạn nếu phiên vẫn còn hợp lệ, ví dụ:

if (![facebook isSessionValid]) { 
     [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]]; 
} else { 
    [self popUserShareFeed]; 
} 

... và bạn mới fbDidLogin:

- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
    [self popUserShareFeed]; 
} 

(Lưu ý: bạn sẽ phải xác định này trong MyViewController.m và sử dụng nó như là FBSessionDelegate của bạn, nó sẽ tương đương với chức năng của bạn AppDelegate không cần phải là FBSessionDelegate của bạn.

Thứ ba:

Thực hiện phương pháp -fbDidNotLogin:(BOOL)cancelledFBSessionDelegate, như vậy:

-(void)fbDidNotLogin:(BOOL)cancelled { 
    if (cancelled) { 
     ... some alert about the user cancelling... 
    } else { 
     ... some alert about how it failed for some reason... 
    } 
} 

Thứ tư, như xa như lỗi Bizarro của bạn đi: A) SDK Facebook nói chung không phải là tuyệt vời, và B) Tôi chỉ đặt mã thông báo xác thực và ngày hết hạn trên đối tượng facebook của bạn nếu

A) bạn chưa có một phiên bản nào (nghĩa là nil)

B) hết hạnNgày bạn đang đặt trong tương lai (tức là timeIntervalSinceNow [phương thức thể hiện NSDate] được gọi là trả về> 0).

3

Có vẻ như bạn đang gặp phải sự cố tương tự được mô tả trong số Facebook Platform Developer forum post này. Tôi đang gặp phải vấn đề tương tự, nhưng trên web. Chỉ có một câu trả lời được đưa ra từ Facebook trong chủ đề đó, và đó là thông tin sai.

Facebook có tài liệu dành cho nhà phát triển và nhà phát triển tồi tệ nhất bao giờ hết, tôi sẽ không nín thở chờ đợi giải pháp.

0

Tôi đã tích hợp FBConnect trong rất nhiều ứng dụng, nhưng không bao giờ gặp phải vấn đề nghiêm trọng như vậy. Vì vậy, sẽ có một số nội dung bị thiếu trong mã của bạn:

Được kiểm tra FBAccessTokenKey & FBExpirationDateKey, chỉ cần thử với đối tượng phiên của lớp FBSession của FBConnect.

Chỉ cần cố gắng sử dụng mã của tôi với vài conidtions:

session = [[FBSession sessionForApplication:@"key" secret:@"AppSecretKey" delegate:self] retain]; 
     [session resume]; 
     _posting = YES; 

     // If we're not logged in, log in first... 
     if (![session isConnected]) { 
      loginDialog = nil; 
      loginDialog = [[FBLoginDialog alloc] init]; 
      [loginDialog show]; 
     } 
      // If we have a session and a name, post to the wall! 
      else if (_facebookName != nil) { 
         [self postToWall]; // Over here posting dialog will appear , if user has already logged in or session is running. 
        } 

     } 
     else { 
      [FBBtn setTitle:@"Login" forState:UIControlStateNormal]; // if you want to change the title of button 
      [session logout]; 
     } 

Ngoài chăm sóc giải phóng đối tượng session trong phương pháp dealloc chỉ, chứ không phải là phát hành nó trong bất kỳ phương pháp nào khác.

- (void)dealloc { 
     [super dealloc]; 
     [session release]; 
     session = nil; 
    } 

Hy vọng điều đó sẽ giải quyết được vấn đề của bạn.

+0

bạn có thể cung cấp thêm mã/thông tin không? Tôi không thể tìm thấy lớp học này. Tất cả những gì tôi có là Facebook, FBDialog, FBLoginDialog và FBRequest. – Niv

+2

@Niv Anh ấy đang sử dụng facebook SDK cũ - FBConnect. Bạn đang sử dụng ứng dụng mới - Facebook iOS SDK. –

0

Không phải giải pháp trực tiếp cho sự cố mã của bạn, nhưng ...

Bạn có cân nhắc sử dụng thư viện nguồn mở cho việc này không? ShareKit là một ví dụ tuyệt vời: http://getsharekit.com. Việc tích hợp là chết đơn giản và nó làm mọi thứ bạn cần.

+1

Tôi nhận được lỗi này từ chính ShareKit (trang này là một trong những lần truy cập đầu tiên tôi nhận được trên Google, cố gắng gỡ lỗi ShareKit). ShareKit là khủng khiếp - tổng số tiền của các tài liệu cho Facebook nói "không có thiết lập cho Facebook", mà là không đúng sự thật. Tôi khuyên bạn nên tránh nó - Tôi sắp chuyển về FB iOS SDK vì ShareKit rất tệ. – Adam

0

Tôi đã có vấn đề chính xác giống nhau, và sử dụng phản ứng Bến Mosher trên, nhưng tôi cũng đã quyết định tạo ra một lớp singleton đơn giản cho đối tượng Facebook, do đó trong appdelegate của tôi, tôi có thể xử lý các chức năng sau đây đúng:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 

    return [[[FBManager defaultManager] facebook] handleOpenURL:url]; 

    //return [facebook handleOpenURL:url]; 
} 

Lớp đơn của tôi là cả hai FBSessionDelegateFBDialogDelegate, do đó, nó xử lý các phương pháp tương ứng.

Điều này cho phép tôi chỉ nhắc người dùng đăng nhập khi họ thực sự đang cố gắng đăng nội dung nào đó thay vì khi ứng dụng khởi chạy.

1

Tôi đã tương tự nhưng không phải cùng một vấn đề: thông báo "Đã xảy ra lỗi. Vui lòng thử lại sau". được hiển thị luôn.

Sự cố xảy ra với ID ứng dụng được định cấu hình không chính xác - nó được cung cấp bởi khách hàng (vì vậy tôi không chắc chính xác điều gì đã sai); tất cả mọi thứ hoạt động đúng kể từ khi tôi thay thế nó bằng ID ứng dụng thử nghiệm của riêng tôi (từ ứng dụng trước đó).

Các vấn đề liên quan