5

こんにちは、ユーザーが iOS 9 以降を使用している場合、サファリ ビュー コントローラーのテーブル ビュー セルから Web サイトを開きたいと思います。ユーザーが iOS 7 または 8 を使用している場合、Web サイトは標準の 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;

このコードは、私の Web サイトで Safari ビュー コントローラーを開く必要があると思います。しかし、両方のコード セットを組み合わせる方法がわかりません。

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

NSStringWithFormat の末尾にある url を削除すると、Safari ビュー コントローラーが機能します。ただし、iOS 9.0 未満、たとえば 8.4 では、アプリがクラッシュします。

4

1 に答える 1

19

標準的かつ推奨されるアプローチは、OS のバージョンではなく、機能を確認することです。このインスタンスでは、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.
    }
}
于 2015-11-26T03:04:40.347 に答える