Facebook и iOS: общий доступ к идентификатору приложения для нескольких приложений

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

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

достаточно двух URL-адресов

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

скриншот файла info.plist

Где «xxxxx...» — это просто идентификатор моего приложения в Facebook.

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

оповещение с сообщением не может открыть страницу, Safari не может открыть страницу, потому что адрес недействителен

Код для входа в систему:

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;

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


person Stavash    schedule 18.02.2013    source источник


Ответы (3)


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

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

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

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

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

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

person Aaron Brager    schedule 23.02.2013
comment
Спасибо за ответ, Аарон. Я попробовал несколько CFBundleURLNames, как вы предложили в 1, но я все еще не переключаюсь обратно в приложение после успешного входа в Safari. 2 уже был реализован в моем AppDelegate. Какие-либо предложения? - person Stavash; 23.02.2013
comment
Как выглядит URL-адрес, который вы вводите в Safari? Это работает, если вы не передаете никаких параметров? (то есть просто введите fbxxxxxxpremium://) - person Aaron Brager; 23.02.2013
comment
Ввод fbxxxxxxpremium:// в сафари ДЕЙСТВИТЕЛЬНО переключается обратно в приложение. Что тут происходит?? :О - person Stavash; 24.02.2013
comment
Вы, наверное, забыли ? после fbxxxxxxpremium://. Вы не можете передавать параметры перед вопросительным знаком. fbxxxxxxpremium://foo=bar не сработает, а fbxxxxxxpremium://?foo=bar сработает. (Я считаю, что это более жесткое поведение является новым в iOS 6). - person Aaron Brager; 24.02.2013
comment
Итак, после того, как мы это выяснили, что я должен определить в своем plist, чтобы приложение могло обрабатывать указанную схему URL? - person Stavash; 24.02.2013
comment
Я не понимаю вашего вопроса. Если iOS открывает ваше приложение, значит, ваш plist настроен правильно. - person Aaron Brager; 25.02.2013
comment
Небольшое недоразумение: когда я набираю fbxxxxxxpremium:// ВРУЧНУЮ в Safari, открывается мое приложение. - person Stavash; 25.02.2013
comment
И когда вы вводите fbxxxxxxpremium://?foo=bar в Safari, также открывается ваше приложение. Проблема в том, что URL-адрес, который вы передаете своему приложению, не имеет ?. В обратном URL-адресе, который вы указываете для приложения Facebook, вам необходимо добавить к параметрам вопросительный знак. - person Aaron Brager; 26.02.2013
comment
Вы тестируете это на iOS 5 или iOS 6? В iOS 6 Facebook должен получать настройки из iOS, никогда не выходя из вашего приложения. (согласно developers.facebook.com/ документы/инструкции/). Кроме того, что произойдет, если вы передадите nil параметрам вместо @[]? - person Aaron Brager; 26.02.2013
comment
Кроме того, убедитесь, что вы используете Facebook SDK 3.2: developers.facebook.com/blog/post/2013/02/25/ - person Aaron Brager; 26.02.2013

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

key = FacebookUrlSchemeSuffix
value = premium

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

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

Это исправило это для меня. Документы Facebook ссылаются на это, но не разъясняют ИМО.

person Dunc    schedule 16.06.2015

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

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

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

Так что вы должны позвонить

[session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent 
        completionHandler:completion];
person Moxy    schedule 23.02.2013
comment
Спасибо @Moxy, я попробовал это, но все равно получаю тот же результат. У меня также есть проблема с этим подходом - это не эквивалентно моему вызову (нет, где указать начальные разрешения) - person Stavash; 24.02.2013
comment
Вы можете указать разрешения при инициализации сеанса. В вашем коде вы передаете пустой массив. Вы можете передать разрешения, которые хотите. - person Moxy; 24.02.2013