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
Как я могу отладить, что идет не так?
Заранее спасибо.
Рууд
2 ответа
Для SDK 3.2 или выше у нас есть возможность использовать класс FBWebDialogs, который поможет нам показать всплывающее окно вместе со списком друзей и выбрать один или несколько из списка для отправки приглашения.
Давайте сделаем это шаг за шагом:
1) Загрузите и настройте SDK 3.2 или выше.
2) Сначала настройте свое приложение на Facebook, следуя этому URL.
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
НОТА:
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];
Я думаю, что ваше приложение не включено для Android и для веб-сайтов. И вы пытаетесь получить уведомление в Интернете или на устройстве Android.
Очки. Чтобы получать уведомления на Android или в Интернете, необходимо включить приложение для Android и для Интернета.
Чтобы включить Android и Интернет в вашем приложении: Перейдите в свое приложение> Настройки> Нажмите + Добавить платформу, введите необходимую информацию и нажмите Сохранить.
Давайте наслаждаться уведомления.:-)