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];