presentRequestsDialogModallyWithSession не работает, но дает хороший результат

Когда я использую веб-диалог для запроса на добавление в друзья, все идет нормально, за исключением того, что запрос или что-либо еще не сделано. Код:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   facebookFriend.id, @"to",
                                   nil];
    [FBWebDialogs presentRequestsDialogModallyWithSession:FBSession.activeSession 
                                                  message:NSLocalizedString(@"FB_FRIEND_INVITE_MESSAGE", @"Facebook friend invite message")       
                                                    title:NSLocalizedString(@"FB_FRIEND_INVITE_TITLE", @"Facebook friend invite title") 
                                               parameters:params 
                                                  handler:^(FBWebDialogResult result, NSURL *resultURL, NSError *error) {
                                                        }];

Вот результат, который я получаю:

fbconnect://success?request=xxxxxxxxxxxx&to%5B0%5D=xxxxxxxx

Как я могу отладить, что происходит не так?

Заранее спасибо.

Рууд


person Ruud Visser    schedule 19.03.2013    source источник
comment
Вы нашли какое-нибудь решение? Я постоянно сталкиваюсь с одной и той же ошибкой, даже в последней версии SDK 3.5. Спасибо   -  person Miroslav Kovac    schedule 22.04.2013
comment
Нет до сих пор нет решения..   -  person Ruud Visser    schedule 23.04.2013
comment
@MiroslavKovac, вы проверили мое решение?   -  person NeverHopeless    schedule 04.06.2013
comment
Я испытываю ту же проблему. Странно, что раньше работало, а потом перестало. Я не изменил ни строчки кода, может ли это быть связано с конфигурацией приложения на стороне Facebook?   -  person Valerio Santinelli    schedule 29.09.2013
comment
@RuudVisser, вы проверили это решение?   -  person NeverHopeless    schedule 19.01.2014


Ответы (2)


Для SDK 3.2 или выше у нас есть возможность использовать класс FBWebDialogs, который поможет нам показать всплывающее окно вместе со списком друзей и выбрать одного или нескольких из списка для отправки приглашения. .

Давайте сделаем это шаг за шагом:

1) Загрузите и установите SDK 3.2 или выше.

2) Сначала настройте свое приложение на Facebook, следуя этому адрес.

3) Затем используйте прилагаемый код.

Пример кода: (генерирует запрос на приглашение в друзья)

-(void)inviteFriends
{
    if ([[FBSession activeSession] isOpen])
    {
        NSMutableDictionary* params =  [NSMutableDictionary dictionaryWithObjectsAndKeys:nil];
       [FBWebDialogs presentRequestsDialogModallyWithSession:nil
                                                      message:[self getInviteFriendMessage]
                                                        title:nil
                                                   parameters:params
                                                      handler:^(FBWebDialogResult result, NSURL *resultURL, NSError *error)
         {
             if (error)
             {
                 [self requestFailedWithError:error];
             }
             else
             {
                 if (result == FBWebDialogResultDialogNotCompleted)
                 {
                     [self requestFailedWithError:nil];
                 }
                 else if([[resultURL description] hasPrefix:@"fbconnect://success?request="]) 
                 {
                    // Facebook returns FBWebDialogResultDialogCompleted even user 
                    // presses "Cancel" button, so we differentiate it on the basis of
                    // url value, since it returns "Request" when we ACTUALLY
                    // completes Dialog
                     [self requestSucceeded];
                 }
                 else
                 {
                     // User Cancelled the dialog
                     [self requestFailedWithError:nil];
                 }
             }
         }
       ];

    }
    else
    {
        /*
         * open a new session with publish permission
         */
        [FBSession openActiveSessionWithPublishPermissions:[NSArray arrayWithObject:@"publish_stream"]
                                           defaultAudience:FBSessionDefaultAudienceFriends
                                              allowLoginUI:YES
                                         completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
         {
             if (!error && status == FBSessionStateOpen)
             {
                 NSMutableDictionary* params =   [NSMutableDictionary dictionaryWithObjectsAndKeys:nil];
                 [FBWebDialogs presentRequestsDialogModallyWithSession:nil
                                                               message:[self getInviteFriendMessage]
                                                                 title:nil
                                                            parameters:params
                                                               handler:^(FBWebDialogResult result, NSURL *resultURL, NSError *error)
                  {
                      if (error)
                      {
                           [self requestFailedWithError:error];
                      }
                      else
                      {
                          if (result == FBWebDialogResultDialogNotCompleted)
                          {
                              [self requestFailedWithError:nil];
                          }
                          else if([[resultURL description] hasPrefix:@"fbconnect://success?request="])
                          {
                              // Facebook returns FBWebDialogResultDialogCompleted even user 
                              // presses "Cancel" button, so we differentiate it on the basis of
                              // url value, since it returns "Request" when we ACTUALLY
                              // completes Dialog
                              [self requestSucceeded];
                          }
                          else
                          {
                              // User Cancelled the dialog
                              [self requestFailedWithError:nil];
                          }

                      }
                  }];
             }
             else
             {
                 [self requestFailedWithError:error];
             }
         }];
    }

}

а вот вспомогательные функции, которые вызывают функции делегатов OnFBSuccess и OnFBFailed.

- (void)requestSucceeded 
{
    NSLog(@"requestSucceeded");
    id owner = [fbDelegate class];
    SEL selector = NSSelectorFromString(@"OnFBSuccess");
    NSMethodSignature *sig = [owner instanceMethodSignatureForSelector:selector];
    _callback = [NSInvocation invocationWithMethodSignature:sig];
    [_callback setTarget:owner];
    [_callback setSelector:selector];
    [_callback retain];

    [_callback invokeWithTarget:fbDelegate];
}

- (void)requestFailedWithError:(NSError *)error
{
    NSLog(@"requestFailed");
    id owner = [fbDelegate class];
    SEL selector = NSSelectorFromString(@"OnFBFailed:");
    NSMethodSignature *sig = [owner instanceMethodSignatureForSelector:selector];
    _callback = [NSInvocation invocationWithMethodSignature:sig];
    [_callback setTarget:owner];
    [_callback setSelector:selector];
    [_callback setArgument:&error atIndex:2];
    [_callback retain];

    [_callback invokeWithTarget:fbDelegate];
}

Таким образом, класс, который вызывает метод InviteFriend, ДОЛЖЕН иметь следующие функции:

-(void)OnFBSuccess
{
    CCLOG(@"successful");

    //  do stuff here  
    [login release];
}

-(void)OnFBFailed:(NSError *)error
{
    if(error == nil)
        CCLOG(@"user cancelled");
    else
        CCLOG(@"failed");

    //  do stuff here  
    [login release];
}

Рекомендуемое чтение:

Отправить приглашение через Facebook

Разрешения API

Пример

ПРИМЕЧАНИЕ:

1) Не забудьте настроить идентификатор приложения Facebook в plist.

2) Не забудьте настроить AppDelegate на дескриптор URL.

Частичный фрагмент, взятый из приведенной выше ссылки в пункте 2:

/*
 * If we have a valid session at the time of openURL call, we handle
 * Facebook transitions by passing the url argument to handleOpenURL
 */
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    // attempt to extract a token from the url
    return [FBSession.activeSession handleOpenURL:url];
}

Надеюсь, поможет!

ИЗМЕНИТЬ

Здесь:

объявление для fbDelegate:

@property (nonatomic, assign) id <FBLoginDelegate> fbDelegate;

@protocol FBLoginDelegate <NSObject>

@required

-(void) OnFBSuccess;
-(void) OnFBFailed : (NSError *)error;

@end

и вот как вы можете использовать этот код:

FBLoginHandler *login = [[FBLoginHandler alloc] initWithDelegate:self];   // here 'self' is the fbDelegate you have asked about
[login inviteFriends];
person NeverHopeless    schedule 20.05.2013
comment
Это просто потрясающе, чтобы показать список друзей. Но это дает ошибку в getInviteFriendMessage. Говоря use of undeclared getInviteFriendMessage. Где объявить этот метод? - person Sushil Sharma; 03.09.2014
comment
@iDev, эта функция должна быть объявлена ​​в том же классе, где находится этот код списка друзей-приглашений. Этот метод должен возвращать строку, содержащую сообщение, которое будет отображаться при появлении экрана приглашения. - person NeverHopeless; 03.09.2014
comment
Спасибо за ответ. У меня есть еще вопросы. Вы можете мне помочь? Могу ли я добавить сообщение в виде строки, если я не хочу создавать метод getInviteFriendMessage? а что такое _callBack? Где вы объявили об этом _callBack ? - person Sushil Sharma; 03.09.2014
comment
Вы можете изменить вызов функции на message:@"your message here" и определить его в файле .h NSInvocation *_callback - person NeverHopeless; 03.09.2014
comment
К сожалению, выдается исключение WebKit discarded an uncaught exception in the webView:decidePolicyForNavigationAction:request:frame:decisionListener: delegate: <NSInvalidArgumentException> +[NSInvocation _invocationWithMethodSignature:frame:]: method signature argument cannot be nil. и оставить webDialog пустым. Я думаю, что я сделал что-то не так. - person Sushil Sharma; 03.09.2014
comment
Я думаю, что вы должны задать отдельный вопрос в отношении этого вопроса. Таким образом, вы можете получить помощь должным образом. Поскольку требуется несколько уточнений, таких как версия SDK, пробовали ли вы использовать delegate вместо NSInvocation и т. д. - person NeverHopeless; 03.09.2014
comment
@iDev, здесь я добавил рабочий пример кода, который может вам помочь: journeytoios.wordpress.com/2014/09/03/ - person NeverHopeless; 04.09.2014
comment
Спасибо за код. Но пока не работает. Не отправляет сообщения друзьям в Facebook. Я добавил новый вопрос. Пожалуйста, проверьте мой код там Вот ссылка< /а> - person Sushil Sharma; 04.09.2014
comment
Спасибо за код! у меня работает с FBSDK v3.19. Он отправляет запросы друзьям в Facebook. - person youssman; 08.10.2014
comment
Как насчет пользовательского диалога? Является ли это возможным? - person ozba; 11.10.2014
comment
@ozba, я думаю, вы можете получить друзей и показать в пользовательском диалоговом окне, но тогда вы не можете отправить запрос, FBWebDialogs удается как получить друзей, так и отправить запрос. - person NeverHopeless; 11.10.2014
comment
@ozba, я нашел это: stackoverflow.com/questions/11521580/. Не уверен, что это работает правильно, но я думаю, что facebook не будет поощрять это, см. политику facebook-› пункт 4.2, как указано в ссылке под ответом. - person NeverHopeless; 12.10.2014

Я думаю, что ваше приложение не подходит для Android и для Интернета. И вы пытаетесь получить уведомление в Интернете или на устройстве Android.

Пункты: Для получения уведомлений на Android или в Интернете вы должны включить свое приложение для Android и Интернета.

Чтобы включить Android и Интернет в вашем приложении: перейдите к своему приложению > Настройка > нажмите + Добавить платформу, введите необходимую информацию и сохраните.

Позволяет наслаждаться уведомлением. :-)

person Alok    schedule 21.03.2015