LoginSignup
10
5

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-01-08

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 から取れるようにもします。

@interface OnOpenURLListener : NSObject<AppDelegateListener>
@property (nonatomic, copy) NSString *openURLString; // 追加
@end

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

- (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" でアプリ切り替え

を行った結果です。

10
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5