Facebook и iOS: делиться идентификатором приложения в нескольких приложениях

У меня возникли проблемы с реализацией этой функции после следующего учебника Facebook: https://developers.facebook.com/docs/howtos/share-appid-across-multiple-apps-ios-sdk/

В принципе, у меня есть 2 цели по одному и тому же проекту - один для бесплатной версии и один для премиум-класса. Я создал и создал для этого одно приложение для Facebook и добавил 2 суффикса схемы URL:

two URL scheme suffices

Кроме того, я добавил суффиксы в соответствующие файлы plist. Например, приложение премиум-класса определяется с помощью:

screenshot of info.plist file

Где "xxxxx..." - это только мой идентификатор приложения Facebook.

После этого я все еще не могу войти в приложение на iOS 5.0 и 6.0 (используя собственный диалог FB или диалог SDK в Safari). Это то, что я получаю при входе в систему через Safari:

alert with message "cannot open page, safari cannot open the page because the address is invalid"

Код, выполняющий логин:

NSArray *permissions = kInitialPermissions;

BOOL result = NO;
FBSession *session = [[FBSession alloc] initWithAppID:@"xxxxxxxxxxx"
                                          permissions:@[]
                                      urlSchemeSuffix:@"premium"
                                   tokenCacheStrategy:nil];

if (allowLoginUI ||
    (session.state == FBSessionStateCreatedTokenLoaded)) {
    [FBSession setActiveSession:session];
}

result = [FBSession openActiveSessionWithReadPermissions:permissions
                                                allowLoginUI:allowLoginUI
                                           completionHandler:completion];
return result;

Любые идеи будут оценены. Спасибо!

Ответ 1

Ваша проблема заключается в том, что пользовательская схема URL-адресов не распознается iOS. Вот несколько возможных причин:

  • Я вижу, что вы правильно установили ключ CFBundleURLSchemes в своем plist в массив поддерживаемых схем. Вам также нужно установить CFBundleURLName на что-то вроде com.myApp.MyURLScheme. Вы это сделали?

  • После вызова и завершения методов запуска iOS вызовет ваш метод делегирования приложения - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation. Вы также должны реализовать этот метод, и он должен вернуть YES. У вас есть?

  • Убедитесь, что ваш URL-адрес правильный. fbxxxxxxpremium://foo=bar не будет работать, но fbxxxxxxpremium://?foo=bar будет (обязателен ?).

Обратите внимание, что методы делегата будут немного отличаться, если вы настроите iOS 4.1 или более раннюю версию.

Дополнительную информацию и пример кода см. в разделе Общение с другими приложениями Расширенные трюки приложений в iOS SDK.

Ответ 2

Помимо добавления схемы URL-адреса fbxxxxxxxxxxpremium в массив URL-адресов в файле plist (который вы, кажется, делаете), добавьте новый ключ/значение:

key = FacebookUrlSchemeSuffix
value = premium

Итак, в самом файле plist:

<key>FacebookUrlSchemeSuffix</key>
<string>premium</string>

Это исправило это для меня. Документы Facebook ссылаются на это, но не дают понять IMO.

Ответ 3

Я думаю, что проблема заключается в том, когда вы звоните:

result = [FBSession openActiveSessionWithReadPermissions:permissions
                                            allowLoginUI:allowLoginUI
                                       completionHandler:completion];

сеанс, который открывается, не имеет суффикса схемы URL.

Итак, вы должны позвонить

[session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent 
        completionHandler:completion];