О SLComposeViewController в бета-версии iOS 11

В своем проекте я всегда использую SLComposeViewController для обмена содержимым со сторонними приложениями, но теперь, когда я обновляю свой iPhone до бета-версии iOS 11, это больше не работает.

SLComposeViewControllerCompletionHandler всегда вызывает обратный вызов SLComposeViewControllerResultCancelled.

Почему это?


person hujie    schedule 03.07.2017    source источник


Ответы (3)


У меня были проблемы с SLComposer в iOS 11. Но я просто удалил строку, которая проверяет, и, по-видимому, собственный SDK делает для меня проверку внутри себя.

Удалите эту строку для любого SLServiceType:

if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {

Так что развивайте логику. В моем случае:

SLComposeViewController *mySLComposerSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];

        [mySLComposerSheet setInitialText:@"#myInitialTextIsHere"];
        [mySLComposerSheet addURL:[NSURL URLWithString:strURL]];

        [mySLComposerSheet setCompletionHandler:^(SLComposeViewControllerResult result) {

            switch (result) {
                case SLComposeViewControllerResultCancelled:
                    NSLog(@"Post Canceled");
                    break;
                case SLComposeViewControllerResultDone:
                    NSLog(@"Post Sucessful");
                    break;

                default:
                    break;
            }
        }];

        [self presentViewController:mySLComposerSheet animated:YES completion:nil];

Надеюсь, я помог!

person Matheus Domingos    schedule 04.10.2017
comment
Это работает - если пользователь не вошел в систему, композитор все равно появится, но затем над ним появится предупреждение о необходимости входа в систему. - person davedavedave; 30.10.2017
comment
Работает ли это решение для людей в симуляторе (iPhone) при установке цели развертывания на iOS11? Он не падает или что-то в этом роде, но я не получаю список действий, который я получаю для iOS 10 и ниже, а в консоли написано ViewDidAppear, but remote VC failed, dismissing и Sheet not being presented, calling premature completion? - person Louis Leung; 10.11.2017
comment
Я все еще работаю с твиттером, как показано здесь. Работает на iPad Air и iOS 11.2.2. - person dodgy_coder; 31.01.2018
comment
@matheus это не работает в LinkendIn, есть ли другой способ - person Satheeshkumar Naidu; 20.07.2018
comment
@SatheeshkumarNaidu А у тебя как? - person Matheus Domingos; 24.01.2019

В iOS 11 удален доступ к сторонним учетным записям (таким как Facebook и Twitter) через приложение «Настройки». Я сейчас борюсь с тем же.

Теперь вы должны интегрировать эту функциональность с SDK стороннего поставщика. В Твиттере есть страница миграции, где описаны шаги, которые необходимо предпринять:

https://dev.twitter.com/twitterkit/ios/migrate-social-framework

Мне еще предстоит найти конкретные инструкции о том, как перенести другие социальные сети, но можно с уверенностью сказать, что для этого потребуется их сторонний SDK.

Нет больше простого готового обмена в социальных сетях :-(

person user8315745    schedule 17.07.2017
comment
У меня SLComposeViewController работает нормально, как и раньше. Проверьте ответ, отправленный Матеусом. - person Leon; 04.10.2017
comment
К сожалению, со времени этого ответа Twitter прекратил поддержку Twitter Kit, а это означает, что теперь еще сложнее получить простой передовой опыт для интеграции с Twitter: blog.twitter.com/developer/en_us/topics/tools/2018/. - person TheNeil; 15.05.2019

Для iOS 11 эта строка:

 ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) 

всегда возвращает NO

Я заменил его проверкой, установлено ли у пользователя приложение Facebook:

static NSString *const canOpenFacebookURL = @"fbauth2";

+ добавить его в LSApplicationQueriesSchemes в plist

-(BOOL)isFacebookAppInstalled {
    NSURLComponents *components = [[NSURLComponents alloc] init];
    components.scheme = canOpenFacebookURL;
    components.path = @"/";
    return [[UIApplication sharedApplication]
            canOpenURL:components.URL];
}

А потом просто позвони SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];

как обычно, то же самое, что описал Матеус Домингос. Но с этой проверкой, по крайней мере, вы знаете, что у пользователя установлено приложение facebook.

person bekzattt    schedule 17.11.2017
comment
Это работает, но «безопасно» ли это? Почему константы SLServiceType устарели, а SLComposeViewController — нет? Почему это все еще работает? :) - person Thomas Clowes; 03.06.2019