7

アプリでユーザーの Cookie を取得するために SFSafariViewController を使用しています。これが私のコードです:

SFSafariViewController *safari = [[SFSafariViewController alloc]initWithURL:[NSURL URLWithString:referrerUrl] entersReaderIfAvailable:NO];
    safari.delegate = self;
    safari.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    safari.view.alpha = 0.0;
    safari.view.hidden = true;
    [self dismissViewControllerAnimated:false completion:nil];
    NSLog(@"[referrerService - StoreViewController] presenting safari VC");
    [self presentViewController:safari animated:false completion:nil];

これは iOS 9 ではうまく機能しますが、iOS 10 では SF コントローラーが機能しないようです (現在のコンテキストもブロックします - これはたまたま別の UIWebView です)。

SFSafariViewController を非表示にする別の方法を提案できる人はいますか?

4

4 に答える 4

12

更新された回答:

Apple は、最新バージョンのレビュー ガイドラインで、この種の SafariViewController の使用を禁止しています。

ユーザーに情報を視覚的に提示するには、SafariViewContoller を使用する必要があります。コントローラーは、他のビューまたはレイヤーによって隠されたり、隠されたりしてはなりません。さらに、アプリは、ユーザーの認識と同意なしに SafariViewController を使用してユーザーを追跡することはできません。

古い答え:

iOS 10 では、presented にいくつかの追加要件がありますSFSafariViewController

1)ビューを非表示にしないでください。そのため、hiddenに設定する必要がありますNO

2) の最小値alpha0.05

addChildViewController:3) /を使用してコントローラーを手動で追加する必要がありdidMoveToParentViewController:ます (それ以外の場合、コールバックは呼び出されません)。

4) (適切な座標空間で) 空でない交点を持つ必要があります。つまり、次のことを意味しますUIApplication.keyWindow.frameSFSafariViewController.view.frame

  • Safari ビューのサイズは次の値よりも大きくする必要がありますCGSizeZero

  • Safari ビューを画面外に配置することはできません

  • ただし、自分のビューの下にサファリビューを隠すことができます

コード例:

self.safariVC = [[SFSafariViewController alloc] initWithURL:referrerUrl];
self.safariVC.delegate = self;
self.safariVC.view.alpha = 0.05;
[self addChildViewController:self.safariVC];
self.safariVC.view.frame = CGRectMake(0.0, 0.0, 0.5, 0.5);
[self.view insertSubview:self.safariVC.view atIndex:0];
[self.safariVC didMoveToParentViewController:self];

safariVCまた、使用終了後は適切に削除することを忘れないでください。

[self.safariVC willMoveToParentViewController:nil];
[self.safariVC.view removeFromSuperview];
[self.safariVC removeFromParentViewController];
于 2016-08-29T23:42:37.797 に答える
2

新しい情報: これを行わないでください。改訂された App Store ガイドラインでは、この慣行が禁止されています。

https://developer.apple.com/app-store/review/guidelines/

これは後世のために残しておきます。アプリ デリゲートの didFinishLaunchingWithOptions から次のコードを呼び出します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self checkCookie];
}

- (void)checkCookie
{
    NSURL *url = [NSURL URLWithString:@"http://domainToCheck.com"];
    SFSafariViewController *vc = [[SFSafariViewController alloc] initWithURL:url];
    vc.delegate = self;

    UIViewController *windowRootController = [[UIViewController alloc] init];

    self.secondWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.secondWindow.rootViewController = windowRootController;
    [self.secondWindow makeKeyAndVisible];
    [self.secondWindow setAlpha:0.1];

    [windowRootController presentViewController:vc animated:NO completion:nil];
    self.window.windowLevel = 10;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options
{
    [self.secondWindow.rootViewController dismissViewControllerAnimated:NO completion:nil];
    self.secondWindow = nil;
    self.window.windowLevel = 0;

    return YES;
}
于 2016-08-29T23:38:56.900 に答える