コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】iOS で SFSafariViewController を使用する方法

はじめに

上記のフォーラムで公開されているスクリプトを使用することで
iOS で SFSafariViewController を使用できるようになります

この記事では上記のスクリプトを参考に
iOS で SFSafariViewController を使用できるようにする方法を紹介していきます

検証環境

  • Unity 2020.1.6f1

手順

#import <SafariServices/SafariServices.h>
 
extern UIViewController * UnityGetGLViewController();
extern void UnitySendMessage( const char * className, const char * methodName, const char * param );
 
extern "C"
{
  @interface SafariViewController : UIViewController<SFSafariViewControllerDelegate>
  // ...
  @end
 
  @implementation SafariViewController
  - (void)safariViewControllerDidFinish:(SFSafariViewController *)controller {
    NSLog(@"safariViewControllerDidFinish");
    UnitySendMessage("YourSignInGameObject", "OnAuthCompleted", "");
  }
  @end
 
  SafariViewController * svc;
 
  void launchUrl(const char * url)
  {
    NSLog(@"Launching SFSafariViewController");
 
    // Get the instance of ViewController that Unity is displaying now
    UIViewController * uvc = UnityGetGLViewController();
 
    // Generate an NSURL object based on the C string passed from C#
    NSURL * URL = [NSURL URLWithString: [[NSString alloc] initWithUTF8String:url]];
 
    // Create an SFSafariViewController object from the generated URL
    SFSafariViewController * sfvc = [[SFSafariViewController alloc] initWithURL:URL];
 
    // Assign a delegate to handle when the user presses the 'Done' button
    svc = [[SafariViewController alloc] init];
    sfvc.delegate = svc;
 
    // Start the generated SFSafariViewController object
    [uvc presentViewController:sfvc animated:YES completion:nil];
 
    NSLog(@"Presented SFSafariViewController");
  }
 
  void dismiss()
  {
    UIViewController * uvc = UnityGetGLViewController();
    [uvc dismissViewControllerAnimated:YES completion:nil];
  }
}

上記のスクリプトを「SafariView.mm」という名前で Unity プロジェクトに追加します

f:id:baba_s:20201110163224p:plain

追加した「SafariView.mm」を Project ウィンドウで選択した状態で
Inspector の「Rarely used frameworks」を開いて

f:id:baba_s:20201110163232p:plain

「SafariServices」をオンにして「Apply」を押します

using System.Runtime.InteropServices;
using UnityEngine;

public static class SFSafariView
{
#if UNITY_IOS
    [DllImport( "__Internal" )]
    extern static void launchUrl( string url );

    [DllImport( "__Internal" )]
    extern static void dismiss();
#endif

    public static void OpenURL( string url )
    {
#if UNITY_IOS
        launchUrl( url );
#endif
    }

    public static void Dismiss()
    {
#if UNITY_IOS
        dismiss();
#endif
    }
}

上記のようなスクリプトを作成します

SFSafariView.OpenURL( "https://baba-s.hatenablog.com/" );

あとは、このようなコードを記述することで
SFSafariViewController を使用して Web ページを開くことができます

SFSafariViewController が閉じられたかどうかを検知する方法

f:id:baba_s:20201110163454p:plain

シーンに「YourSignInGameObject」という名前のゲームオブジェクトを配置して

using UnityEngine;

public class Example : MonoBehaviour
{
    public void OnAuthCompleted()
    {
        Debug.Log( "SFSafariViewController が閉じられました" );
    }
}

上記のような「OnAuthCompleted」という名前の関数を持つコンポーネントを
アタッチしておくと、SFSafariViewController が閉じられた時に呼び出されます

閉じられたかどうかを検知するゲームオブジェクトや関数の名前を変えたい場合は

UnitySendMessage("YourSignInGameObject", "OnAuthCompleted", "");

「SafariView.mm」の上記のコードを編集します