Unity×iOS

【Unity×iOS】ネイティブでURLを開く方法|Safari・Twitter対応の.mmプラグイン付き解説【コピペOK】

使用環境

・Unity Editor:2021.3.18f1

この記事で分かること

  • UnityのApplication.OpenURL()を使わない理由
  • iOSのネイティブ機能を利用するプラグインの導入方法
  • .mmファイルの作成方法(コピペOK)
  • Unityからネイティブ関数を呼び出すC#コード(そのまま使えます)

iOSのネイティブプラグインでURLを開くとは?

ピッグダディ

今回は「UnityからiOSのネイティブ機能を使ってURLを開く方法」について解説しますね。
Twitterのプロフィールを開いたり、SafariでWebページに飛ばしたくなること、ありますよね。

ピッグボーイ

あります!
でも Application.OpenURL() を使っても
うまくアプリが開けなかったんです。
Safariは動くけどTwitterは無理で…

ピッグガール

それ、私も悩んでました。
Objective-CとかXcodeとか触らないと無理だと思って、
ずっと敬遠してました。

ピッグダディ

大丈夫ですよ。
この記事では、TwitterやSafariを開けるiOSネイティブプラグインを、C#と.mmファイルだけで簡単に実装する方法を紹介します。すべてコピペでOKなので安心してくださいね。

なぜUnityのOpenURLでは不十分?

Unity標準のApplication.OpenURL()でもURLを開けますが、次のような制限があります:

  • TwitterやLINEなどのアプリ起動ができない
  • アプリの有無チェックやフォールバック処理ができない
  • 開けるのは基本Safariのみ

iOSユーザーに自然な体験を提供したいなら、ネイティブコードでの対応がベストです。

本投稿を実装しているアプリが以下の「Cube Linkage」です。

Cube Linkage
Cube Linkage
開発元:Wamutai
posted withアプリーチ

iOSのURL操作を実現するネイティブプラグインの作成

Objective-C++の.mmファイルの保存場所

この構成にすれば、UnityがiOSビルド時に自動でネイティブコードを取り込んでくれます。
※ 投稿者はmmファイルの作成時にメモ帳で作成し、そのあとに拡張子を変更しています。この画面と同じアイコンになっていないとうまくいっていない可能性があるので注意してください。

Objective-C++の.mmファイルを作成してURLを開く

OpenURLPlugin.mm(Safari・Twitter対応)

このコードはそのままコピペで使用可能。SafariとTwitterのURLオープンに両対応しています。

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

extern "C" {

// SafariでURLを開く
void OpenSafari(const char* url) {
    NSString *nsUrl = [NSString stringWithUTF8String:url];
    NSURL *nsURL = [NSURL URLWithString:nsUrl];
    if ([[UIApplication sharedApplication] canOpenURL:nsURL]) {
        [[UIApplication sharedApplication] openURL:nsURL options:@{} completionHandler:nil];
    }
}

// Twitterアプリでプロフィールを開く(なければSafariで開く)
void OpenTwitter(const char* username) {
    NSString *twitterURL = [NSString stringWithFormat:@"twitter://user?screen_name=%@", [NSString stringWithUTF8String:username]];
    NSString *safariURL = [NSString stringWithFormat:@"https://twitter.com/%@", [NSString stringWithUTF8String:username]];

    NSURL *appURL = [NSURL URLWithString:twitterURL];
    NSURL *webURL = [NSURL URLWithString:safariURL];

    if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
        [[UIApplication sharedApplication] openURL:appURL options:@{} completionHandler:nil];
    } else {
        [[UIApplication sharedApplication] openURL:webURL options:@{} completionHandler:nil];
    }
}
}

Unityからネイティブプラグインを呼び出す方法(C#側)

OpenURLPlugin.cs(コピペで使える)

このスクリプトの保存場所はScriptフォルダで問題ありません。

using UnityEngine;

public class URLClick : MonoBehaviour
{
    public void URL_Click(string URL)
    {
        OpenURLPlugin.OpenInSafari(URL);
    }

    public void Twitter(string TwitterUsername)
    {
        OpenURLPlugin.OpenTwitterProfile(TwitterUsername);
    }
}

このスクリプトを作成したら後は、ButtonのOnClick等で呼び出すことができます。

まとめ

  • Unity標準のOpenURL()はSafariしか開けない
  • iOSのネイティブコードを使えばTwitterなどのアプリ起動やフォールバック処理が可能
  • 本記事のコードは全部コピペでそのまま使える構成

iOSでのURL連携は、ユーザー体験向上に直結する重要な要素です。
ぜひこの記事を参考に、UnityとiOSの強力な連携を実現してみてください!