iOS
Unity
URLスキーム

Unity/iOS で起動 URL を取得する (Unity 2018.3)

Unity/iOS で起動URL を取得する (Unity 2018.3)

DeepLink (Custom URLScheme) を使いたい的な。

サンプルプロジェクトはこちら。
https://github.com/Bugfire/Unity_OnOpenURL
文章読むよりコード読んだ方が早いと思う方はここで終わり。

Native 部分

AppDelegate の

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options

こちらは使いません。Plugin の仕組みがあります。

AppDelegateListener ProtocolonOpenURL を実装して、UnityRegisterAppDelegateListener() で登録しましょう。

@interface OnOpenURLListener : NSObject<AppDelegateListener>
@end

@implementation OnOpenURLListener

- (id)init {
    self = [super init];
    UnityRegisterAppDelegateListener(self);
    return self;
}

- (void)onOpenURL:(NSNotification *)notification {
    NSURL *url = notification.userInfo[@"url"];
    NSString *openURLString = [url absoluteString];
    UnitySendMessage("Receiver", "OnOpenURL",
                     [openURLString cStringUsingEncoding:NSUTF8StringEncoding]);
}

こんな感じです。ついでに getter から取れるようにもします。

- (const char*)getOpenURLString {
    if (!self.openURLString) {
        return nil;
    }
    const char *str = [self.openURLString cStringUsingEncoding:NSUTF8StringEncoding];
    return strdup(str);
}

@end

extern "C" const char *OnOpenURLListener_GetOpenURLString()
{
    return [[OnOpenURLListener sharedInstance] getOpenURLString];
}

こうして作ったソースファイル(.mm) を Assets に放り込んでおいて、Platform を iOS にしておくだけで、組み込みが完了するので本当に楽ですね。

C# 部分

呼び出すなら、

public static class NativeBinding
{
#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    public static extern string OnOpenURLListener_GetOpenURLString();
#endif
}

受け取るなら、上の例でいうと "Receiver" と名前をつけた GameObject に適当に Component を貼り付ける。

public sealed class Receiver : MonoBehaviour
{
   public void OnOpenURL(string url)
   {
   }
}

呼び出すのも受け取るのも楽でいいですね。

Player Settings

起動 URL 設定、Player Settings > Supported URL Schemes で対応したい URL Scheme の設定を忘れずに。

動作例

github のプロジェクトで、動かした結果です。openurl といういい加減な URLScheme にしています。

OnOpenURL のイベント時に C# 側に URL を送信し、アプリ切り替え時に Native 側に URL を問い合わせています。

openurlex.jpg

  • 1行目: safari で "openurl://open-new" で起動
  • 2~3行目: アプリ切り替えで "Resume"
  • 4~6行目: safari で "openurl://open-exists" でアプリ切り替え

を行った結果です。