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 Protocol
の onOpenURL
を実装して、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 を問い合わせています。
- 1行目: safari で "openurl://open-new" で起動
- 2~3行目: アプリ切り替えで "Resume"
- 4~6行目: safari で "openurl://open-exists" でアプリ切り替え
を行った結果です。