2015-08-18 2 views
3

FBSDKSharingDelegate callback не работает. Я могу опубликовать в facebook отлично с SDK ios, но я хотел бы узнать, было ли сообщение успешным и предпринять дополнительные действия, чтобы уведомить пользователя. Однако обратный вызов не работает для меня. Методы делегатов не вызываются, и я не знаю, почему.FBSDKSharingDelegate callback не работает, даже когда почта работает нормально

Использование ios8, Parse как мой backend. В Parse пользователь связан с FB. Я использую симулятор IOS.

Что я пробовал: Я обеспечил предоставление разрешений на публикацию, сохранение и привязку к пользователю Parse. Я запустил чек, и «publish_actions» обнаружены ОК. Публикация отлично работает, так как я могу видеть сообщение в учетной записи facebook. Это просто обратный вызов, который не работает. Я проверил настройку fb, и все выглядит нормально. Для хорошей меры в самом низу я включил соответствующий код из своего делегата приложения. Я заблокировал секретные ключи с помощью XXXX.

Код:

первый: Смотрите, если пользователь вошел в систему, чтобы Разобрать, если нет, то отправить войти в систему и ссылку на facebook счет. Как только это будет сделано, я прошу «опубликовать» разрешения и связать это дополнительное разрешение с пользователем Parse. Я знаю, что это работает b/c, когда я перекомпилирую, он помнит «публиковать» разрешения и переходит прямо в сообщение.

@interface FacebookAPIPost() <FBSDKSharingDelegate> 
@end 

@implementation FacebookAPIPost 
-(void)shareSegmentFacebookAPI { //if statement below 

    //1) logged in?, if not send to sign up screen 
    //2) else if logged in, link account to facebook account, then send post 
    //3) else send to post b/c signed up and linked already. 
    PFUser *currentUser = [PFUser currentUser]; 
    if(!currentUser) { 
     [self pushToSignIn]; 
    } else if(![PFFacebookUtils isLinkedWithUser:currentUser]){ 
     [self linkUserToFacebook:currentUser]; 
     NSLog(@"user account not linked to facebook"); 
    } else { 
     [self shareSegmentWithFacebookComposer]; 
    } 
} 


-(void)linkUserToFacebook:currentUser{ 

    [PFFacebookUtils linkUserInBackground:currentUser withPublishPermissions:@[@"publish_actions"] block:^(BOOL succeeded, NSError *error) { 
     if(error){ 
      NSLog(@"There was an issue linking your facebook account. Please try again."); 
     } 
     else { 
      NSLog(@"facebook account is linked"); 
      //Send the facebook status update 
      [self shareSegmentWithFacebookComposer]; 
     } 
    }]; 
} 


-(void)shareSegmentWithFacebookComposer{ 
if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"publish_actions"]) { 
    [self publishFBPost]; //publish 
} else { 
    NSLog(@"no publish permissions"); // no publish permissions so get them, then post 


    [PFFacebookUtils linkUserInBackground:[PFUser currentUser] 
        withPublishPermissions:@[ @"publish_actions"] 
            block:^(BOOL succeeded, NSError *error) { 
             if (succeeded) { 
              NSLog(@"User now has read and publish permissions!"); 
              [self publishFBPost]; 
             } 
    }]; 

Вот где пост получает сделано:

-(void) publishFBPost{ 
     FBSDKShareLinkContent *content = [FBSDKShareLinkContent new]; 
     content.contentURL = [NSURL URLWithString:[self.selectedSegment valueForKey:@"linkToContent"]]; 
     content.contentTitle = [self.selectedProgram valueForKey:@"programTitle"]; 
     content.contentDescription = [self.selectedSegment valueForKey:@"purposeSummary"]; 

    PFFile *theImage = [self.selectedSegment valueForKey:@"segmentImage"]; 
    NSString *urlString = theImage.url; 
    NSURL *url = [NSURL URLWithString:urlString]; 
    content.imageURL = url; 

    FBSDKShareDialog *shareDialog = [FBSDKShareDialog new]; 

    [shareDialog setMode:FBSDKShareDialogModeAutomatic]; 
// [FBSDKShareDialog showFromViewController:self.messageTableViewController withContent:content delegate:self]; 
    [shareDialog setShareContent:content]; 
    [shareDialog setDelegate:self]; 
    [shareDialog setFromViewController:self.messageTableViewController]; 
    [shareDialog show]; 
} 

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

#pragma mark - delegate methods 

- (void)sharer:(id<FBSDKSharing>)sharer didCompleteWithResults:(NSDictionary *)results { 
// if ([sharer isEqual:self.shareDialog]) { 
     NSLog(@"I'm going to go crazy if this doesn't work.%@",results); 

     // Your delegate code 
// } 
} 

    - (void)sharer:(id<FBSDKSharing>)sharer didFailWithError:(NSError *)error 
    { 
     NSLog(@"sharing error:%@", error); 
     NSString *message = error.userInfo[FBSDKErrorLocalizedDescriptionKey] ?: 
     @"There was a problem sharing, please try again later."; 
     NSString *title = error.userInfo[FBSDKErrorLocalizedTitleKey] ?: @"Oops!"; 

     [[[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; 
    } 

    - (void)sharerDidCancel:(id<FBSDKSharing>)sharer 
    { 
     NSLog(@"share cancelled"); 
    } 

консоли: Единственное сообщение, я вернусь после проводки через несколько секунд появляется следующее сообщение:

plugin com.apple.share.Facebook.post invalidated 

Пожалуйста, помогите!

Сноска: AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    // Initialize Parse. 
    [Parse enableLocalDatastore]; 
    [Parse setApplicationId:@"XXXX" 
        clientKey:@"XXX"]; 
    [PFFacebookUtils initializeFacebookWithApplicationLaunchOptions:launchOptions]; 


    //Initialize Facebook 
    [FBSDKAppEvents activateApp]; 
    return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]; 
} 


//Method added for facebook integration 
- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation { 
    return [[FBSDKApplicationDelegate sharedInstance] application:application 
                  openURL:url 
               sourceApplication:sourceApplication 
                 annotation:annotation]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    [FBSDKAppEvents activateApp]; 
} 

ответ

2

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

As per Facebook API documentation

sharer:didCompleteWithResults: Sent to the delegate when the share completes without error or cancellation. 
The results from the sharer. This may be nil or empty. 

его, вероятно, потому, что этот метод делегата только дозвонились, когда пост успешно совместно. В случае отказа вызывается другой метод делегирования sharer:didFailWithError:. Я думаю, что API Facebook не нужно будет добавлять результат параметр в этом случае.

Так что в моем опыте, если sharer:didCompleteWithResults всякий раз, когда это называется, это будет означать успех.

+3

Я протестировал много случаев, и вызов 'sharer: didCompleteWithResults' не означает, что сообщение было успешно опубликовано.Вы можете открыть диалоговое окно совместного доступа и нажать кнопку «Готово» или «Закрыть», чтобы отменить публикацию, и все еще видите метод «sharer: didCompleteWithResults». – TomSawyer