Откройте контроллер просмотра сафари из табличного представления на iOS 9 и откройте в сафари на iOS 8 или 7

Привет, я хотел бы открыть свой веб-сайт из ячейки табличного представления в контроллере просмотра сафари, если пользователь использует iOS 9 или выше. Если пользователь использует iOS 7 или 8, веб-сайт должен открыться в стандартном приложении Safari.

Это код, который я сейчас использую, который открывает сафари.

    case 3: { // Follow us section
        switch (indexPath.row) {
            case 0: { //Website
                NSURL *url = [NSURL URLWithString:@"http://www.scanmarksapp.com"];
                if (![[UIApplication sharedApplication] openURL:url]) {
                    NSLog(@"%@%@",@"Failed to open url:",[url description]);
                }
            }
                break;

            default:
                break;
        }

    }
        break;

Я считаю, что этот код должен открыть контроллер просмотра сафари на моем веб-сайте. Но я не уверен, как объединить оба набора кода.

- (void)openLink:(NSString *)url {

NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.scanmarksapp.com", url]];
if (URL) {
    SFSafariViewController *sfvc = [[SFSafariViewController alloc] initWithURL:URL];
    sfvc.delegate = self;
    [self presentViewController:sfvc animated:YES completion:nil];
}

#pragma Safari View Controller Delegate

- (void)safariViewControllerDidFinish:(nonnull SFSafariViewController *)controller {
[controller dismissViewControllerAnimated:YES completion:nil];
}

Насколько я понимаю, это код, используемый для определения версии iOS.

if ([[[UIDevice currentDevice] systemVersion] floatValue] < 9.0) {

Я последовал твоему совету

- (void)openLink:(NSString *)url {

NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.scanmarksapp.com", url]];
if (URL) {
    SFSafariViewController *sfvc = [[SFSafariViewController alloc] initWithURL:URL];
    sfvc.delegate = self;
    [self presentViewController:sfvc animated:YES completion:nil];
} else {
    // will have a nice alert displaying soon.
}

if ([SFSafariViewController class] != nil) {
    // Use SFSafariViewController
} else {
    NSURL *url = [NSURL URLWithString:@"http://www.scanmarksapp.com"];
    if (![[UIApplication sharedApplication] openURL:url]) {
        NSLog(@"%@%@",@"Failed to open url:",[url description]);
    }
}

Затем добавил этот код в ячейку табличного представления didSelectRowAtIndexPath

        case 3: { // Follow us section
        switch (indexPath.row) {
            case 0: { //Website
                NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.scanmarksapp.com", url]];
                if (URL) {
                    SFSafariViewController *sfvc = [[SFSafariViewController alloc] initWithURL:URL];
                    sfvc.delegate = self;
                    [self presentViewController:sfvc animated:YES completion:nil];
                } else {
                    // will have a nice alert displaying soon.
                }

                if ([SFSafariViewController class] != nil) {
                    // Use SFSafariViewController
                } else {
                    NSURL *url = [NSURL URLWithString:@"http://www.scanmarksapp.com"];
                    if (![[UIApplication sharedApplication] openURL:url]) {
                        NSLog(@"%@%@",@"Failed to open url:",[url description]);
                    }

                }
            }
                break;

            default:
                break;
        }

    }
        break;

Я получаю сообщение об ошибке «Использование необъявленного URL-адреса идентификатора» в этой строке кода.

NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.scanmarksapp.com", url]];

Удаление URL-адреса в конце NSStringWithFormat заставляет работать контроллер представления Safari. Однако на iOS ниже 9.0, например. 8.4 приложение вылетает.


person user5394344    schedule 25.11.2015    source источник


Ответы (1)


Стандартный и рекомендуемый подход заключается в проверке возможностей, а не версии ОС. В этом случае вы можете проверить наличие класса SFSafariViewController.

if ([SFSafariViewController class] != nil) {
    // Use SFSafariViewController
} else {
    // Open in Mobile Safari
}

изменить

Ваша реализация openLink: неверна.

- (void)openLink:(NSString *)url {
    NSURL *URL = [NSURL URLWithString:url];

    if (URL) {
        if ([SFSafariViewController class] != nil) {
            SFSafariViewController *sfvc = [[SFSafariViewController alloc] initWithURL:URL];
            sfvc.delegate = self;
            [self presentViewController:sfvc animated:YES completion:nil];
        } else {
            if (![[UIApplication sharedApplication] openURL:url]) {
                NSLog(@"%@%@",@"Failed to open url:",[url description]);
            }
        }
    } else {
        // will have a nice alert displaying soon.
    }
}
person Avi    schedule 26.11.2015
comment
Я обновил вопрос, показывающий, что я сделал, и ошибку, которую он показывает. - person user5394344; 26.11.2015
comment
Вы не используете свой метод для безопасного использования SFSafariViewController. Мало того, ваш метод openLink: неверен. Вы пытаетесь использовать SFSafariViewController, не проверяя, доступен ли класс. - person Avi; 26.11.2015
comment
@Avi Если вы делаете приложение для iOS 9 и выше, вам НЕ нужно проверять доступность API, верно? - person Supertecnoboff; 28.02.2016