🍎

【UE5】iOS18でLaunchURLが動作しない対応

に公開

原因

iOS18にアップグレードしたらLaunchURLノードが動作しなくなります。
LaunchURLノードのiOSの場合の処理はopenURL:を使っていますが、この関数はiOS10以降非推奨になり、この非推奨がiOS18で厳格化され、ついに動作しなくなってしまいました。
iOS10以降はopenURL:options:completionHandler:が推奨されています。

対策

記事作成時(2025/5/14)の最新版であるUE5.5.4でもopenURL:を使っているので、修正されたバージョンがリリースされるまでは、

  1. エンジンのコードを書き換える
  2. C++でiOS専用のLaunchURLノードを作成する
  3. 諦める

このどれかで対応するしかありません。
3の解決策は非常に難易度が高いので、比較的簡単な1と2の解決策を載せておきます。

開発環境

  • Windows11
  • UE5.4.4(ソースコードビルド)
  • Visual Studio 2022
  • iPhone 15(iOS 18.1)

解決策1(エンジンのコード修正)

iOSのLaunchURLノードの処理は
\Engine\Source\Runtime\Core\Private\IOS\IOSPlatformProcess.cppに記載してあります。

IOSPlatformProcess.cpp
void FIOSPlatformProcess::LaunchURL( const TCHAR* URL, const TCHAR* Parms, FString* Error )
{
#if PLATFORM_VISIONOS
	*Error = TEXT("LaunchURL is not supported on VisionOS");
#else
	UE_LOG(LogIOS, Log,  TEXT("LaunchURL %s %s"), URL, Parms?Parms:TEXT("") );

	if (FCoreDelegates::ShouldLaunchUrl.IsBound() && !FCoreDelegates::ShouldLaunchUrl.Execute(URL))
	{
		if (Error)
		{
			*Error = TEXT("LaunchURL cancelled by delegate");
		}
		return;
	}

	NSString* CFUrl = (NSString*)FPlatformString::TCHARToCFString( URL );
-       PRAGMA_DISABLE_DEPRECATION_WARNINGS
-	bool Result = [[UIApplication sharedApplication] openURL: [NSURL URLWithString: CFUrl]];
-	PRAGMA_ENABLE_DEPRECATION_WARNINGS
-	if (Error != nullptr)
-	{
-		*Error = Result ? TEXT("") : TEXT("unable to open url");
-	}
+	[[UIApplication sharedApplication]openURL:[NSURL URLWithString : CFUrl] options : @{} completionHandler: ^ (BOOL success)
+	{
+		if (Error)
+		{
+			*Error = success ? TEXT("") : TEXT("unable to open url");
+		}
+	}];
#endif
}

解決策2(専用ノード作成)

新規C++クラスを作成し、Blueprint Function Libraryを継承します。

IOSLaunchURL.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "IOSLaunchURL.generated.h"

UCLASS()
class IOSTEST_API UIOSLaunchURL : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	
	
	UFUNCTION(BlueprintCallable, meta = (DisplayName = "Launch URL For IOS"))
	static void LaunchURLForIos(const FString& URL);
};
IOSLaunchURL.cpp
// Fill out your copyright notice in the Description page of Project Settings.


#include "IOSLaunchURL.h"

void UIOSLaunchURL::LaunchURLForIos(const FString& URL)
{
#if PLATFORM_IOS
	UE_LOG(LogTemp, Log, TEXT("LaunchURLForIOS %s"), *URL);

	NSString* CFUrl = (NSString*)FPlatformString::TCHARToCFString(*URL);

	[[UIApplication sharedApplication]openURL:[NSURL URLWithString : CFUrl] options : @{} completionHandler:nil];
#else
	UE_LOG(LogTemp, Warning, TEXT("LaunchURLForIOS is only supported on iOS"));
#endif
}

iOS以外のプラットフォームで実行してもログを出して終わりなので、使うときは次の画像のように分岐して使ってください。

処理をシンプルにするためにcompletionHandler:nilとして、URLが開けたかどうかの追跡はしていないのでそこだけ注意してください。

感想

iOS18。てめえだけは許さない。

参考文献

https://forums.unrealengine.com/t/ios-18-launch-url-not-working/2254005/5

https://qiita.com/g_vista/items/fec30c50bde3eed7d117

Discussion