はじめに
上記のフォーラムで公開されているスクリプトを使用することで
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 プロジェクトに追加します
追加した「SafariView.mm」を Project ウィンドウで選択した状態で
Inspector の「Rarely used frameworks」を開いて
「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 が閉じられたかどうかを検知する方法
シーンに「YourSignInGameObject」という名前のゲームオブジェクトを配置して
using UnityEngine; public class Example : MonoBehaviour { public void OnAuthCompleted() { Debug.Log( "SFSafariViewController が閉じられました" ); } }
上記のような「OnAuthCompleted」という名前の関数を持つコンポーネントを
アタッチしておくと、SFSafariViewController が閉じられた時に呼び出されます
閉じられたかどうかを検知するゲームオブジェクトや関数の名前を変えたい場合は
UnitySendMessage("YourSignInGameObject", "OnAuthCompleted", "");
「SafariView.mm」の上記のコードを編集します