Unity

【Unity×iOS】ネイティブプラグインでSafari・Twitterを開く方法

この記事について

UnityでiOSアプリを開発していると、外部リンク(Safari・Twitter・LINEなど)を開きたい場面があります。
その際に使うのが Application.OpenURL() ですが、実はこれだけでは不十分なケースがあります。

この記事では、iOSのネイティブ機能を使って「Safari」「Twitter」などを自然に開けるようにするネイティブプラグイン実装手順を紹介します。

この記事で分かること

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

なぜUnityのOpenURLでは不十分?

Unity標準の Application.OpenURL() でもURLを開くことは可能です。
しかし、次のような制限があります。

制限内容詳細
アプリ連携不可TwitterやLINEなどのアプリ起動ができない
フォールバック処理なしアプリが未インストールでもエラーハンドリングができない
対応ブラウザが限定的基本的にSafariしか開けない

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

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

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

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

ネイティブプラグインを使用するためにはObject-Cで書く必要があります。
以下の場所に「.mm」ファイルを作成して、保存すると自動的に読み込まれるので作成していきましょう。

・「Assets」→「Plugins」→「iOS」

Objective-Cの「.mm」ファイルを作成(Safari・Twitter対応)

以下のコードを「.mm」ファイルとして保存します。
ファイル名は自由ですが、例として OpenURLPlugin.mm とします。

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

extern "C" {

// Safariを開く
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#側)

以下のスクリプトは「.mm」ファイルのプラグインに対してUnity側での制御を行っていきます。保存場所は任意の場所です。

using System.Runtime.InteropServices;
using UnityEngine;

public class OpenURLPlugin : MonoBehaviour
{
#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern void OpenSafari(string url);

    [DllImport("__Internal")]
    private static extern void OpenTwitter(string username);
#endif

    public static void OpenInSafari(string url)
    {
#if UNITY_IOS && !UNITY_EDITOR
        OpenSafari(url);
#else
        Application.OpenURL(url); // 他のプラットフォームは普通に開く
#endif
    }

    public static void OpenTwitterProfile(string username)
    {
#if UNITY_IOS && !UNITY_EDITOR
        OpenTwitter(username);
#else
        Application.OpenURL($"https://twitter.com/{username}");
#endif
    }
}

スクリプトをボタンにアタッチして実装

まずは、1つの空のGameObjectと2つのButtonを用意します。GameObjectにOpenURLPluginをアタッチして、2つのButtonのOnClickに設定します。
※今回はTwitterボタンでネイティブアプリをSafariで本ブログの紹介ページを開いてみます。

実行してみると、Safariとネイティブアプリでそれぞれ開けることがわかりましたね。
投稿者はホームページをSafari、Twitterをネイティブアプリで開くようにしています。

まとめ

方法対応特徴
Application.OpenURL()Safariのみ簡単だが制限あり
.mm + C# 連携Safari + 各アプリ対応ネイティブ連携で自然な動作
canOpenURL()アプリ有無をチェックUXの高いフォールバック対応