利用URLScheme实现Unity跳转到其他app
策划想让玩家直接在游戏的一个接口跳转到社交app里,并且跳到社交app里特定的界面,比如FB的个人主界面, instragram账号主界面, discord入群邀请链接等等。关于跳转app,安卓和苹果机型需要分开处理。
安卓Andorid:利用package name和url scheme跳转到特定的界面
- 在Unity上是有可以直接调用 Android 方法的,调用 Android 的 getPackageManager ,通过包名打开设备上安装的 apk应用,不需要 Android 端封装接口
- 如果还需要跳转到特定的界面,则需要调用Uri.parse()去解析url scheme
奉上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <code-pre class = "code-pre" id= "pre-3eTWdF" ><code-line class = "line-numbers-rows" ></code-line> using (AndroidJavaObject packageManager = activity.Call<AndroidJavaObject>( "getPackageManager" )) <code-line class = "line-numbers-rows" ></code-line>{ <code-line class = "line-numbers-rows" ></code-line> using (AndroidJavaObject intent = packageManager.Call<AndroidJavaObject>( "getLaunchIntentForPackage" , packageName)) // 比如facebook的package name是 com.facebook.katana <code-line class = "line-numbers-rows" ></code-line> { <code-line class = "line-numbers-rows" ></code-line> if ( null != intent) <code-line class = "line-numbers-rows" ></code-line> { <code-line class = "line-numbers-rows" ></code-line> AndroidJavaClass intentClass = new AndroidJavaClass( "android.content.Intent" ); <code-line class = "line-numbers-rows" ></code-line> AndroidJavaObject intentObject = new AndroidJavaObject( "android.content.Intent" ); <code-line class = "line-numbers-rows" ></code-line> intentObject.Call<AndroidJavaObject>( "setAction" , intentClass.GetStatic< string >( "ACTION_VIEW" )); <code-line class = "line-numbers-rows" ></code-line> AndroidJavaClass uriClass = new AndroidJavaClass( "android.net.Uri" ); // 对应的安卓调用函数是Uri.parse() <code-line class = "line-numbers-rows" ></code-line> AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>( "parse" , urlScheme); // app特有的url scheme在网上都可以找到 <code-line class = "line-numbers-rows" ></code-line> intentObject.Call<AndroidJavaObject>( "setData" , uriObject); <code-line class = "line-numbers-rows" ></code-line> intentObject.Call<AndroidJavaObject>( "setPackage" , packageName); // 记得要set package他才知道在哪里运行url sheme,否则url会从默认的浏览器里打开 <code-line class = "line-numbers-rows" ></code-line> activity.Call( "startActivity" , intentObject); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line>}</code-pre> |
如果你所需要跳转的app第一种方法一直失败,那就试试第二种方法,上网搜搜你所要的app是不是封装了打开apk的接口
有些app是比较特殊,比如Youtube,它封装了打开apk的接口,需要调用第三方库 com.google.android.youtube.player.YouTubeIntents
1 2 3 4 5 6 7 8 9 10 11 12 13 | <code-pre class = "code-pre" id= "pre-Pwfr54" ><code-line class = "line-numbers-rows" ></code-line> using (AndroidJavaObject packageManager = activity.Call<AndroidJavaObject>( "getPackageManager" )) <code-line class = "line-numbers-rows" ></code-line>{ <code-line class = "line-numbers-rows" ></code-line> //一般网上找的youtube package是 com.google.android.youtube,但在这里需要调用到更detailed <code-line class = "line-numbers-rows" ></code-line> using (AndroidJavaObject intent = packageManager.Call<AndroidJavaObject>( "getLaunchIntentForPackage" , “com.google.android.youtube.player.YouTubeIntents”) <code-line class = "line-numbers-rows" ></code-line> { <code-line class = "line-numbers-rows" ></code-line> if ( null != intent) <code-line class = "line-numbers-rows" ></code-line> { <code-line class = "line-numbers-rows" ></code-line> AndroidJavaObject context = activity.Call<AndroidJavaObject>( "getApplicationContext" ); <code-line class = "line-numbers-rows" ></code-line> AndroidJavaObject youtubeIntent = intent.Call<AndroidJavaObject>( "createChannelIntent" , context, "UCeXlPpsccMCro_RqHT2lYPw" ); <code-line class = "line-numbers-rows" ></code-line> activity.Call( "startActivity" , youtubeIntent); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line>}</code-pre> |
怎么查app的package name?
- 打开google play, https://play.google.com/store
- 查找你要的app
- 进入app的详情界面,网址后面的id就是它的package name。比如IG: https://play.google.com/store/apps/details?id=com.instagram.android
苹果IOS:利用url scheme跳转
Unity官方有一个接口是专门用来跳转网页的Application.OpenURL(webURL),但在苹果里有些app可以通过调用这个接口直接打开自己的app!可能是IOS系统有自动处理url寻找是否有相关的app,我没仔细看这个函数的源代码,如果有清楚原理的大神,欢迎来讨论!!
Unity 调用IOS代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <code-pre class = "code-pre" id= "pre-7ECTE4" ><code-line class = "line-numbers-rows" ></code-line> using UnityEngine; <code-line class = "line-numbers-rows" ></code-line> using System.Runtime.InteropServices; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> public class ProcessAppURL : MonoBehaviour <code-line class = "line-numbers-rows" ></code-line>{ <code-line class = "line-numbers-rows" ></code-line> [DllImport( "__Internal" )] <code-line class = "line-numbers-rows" ></code-line> private static extern void _OpenFacebookApp(); <code-line class = "line-numbers-rows" ></code-line> [DllImport( "__Internal" )] <code-line class = "line-numbers-rows" ></code-line> private static extern void _OpenYoutubebookApp(); <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> public void OpenApp( string packageName, string url) <code-line class = "line-numbers-rows" ></code-line> { <code-line class = "line-numbers-rows" ></code-line> switch (appName) <code-line class = "line-numbers-rows" ></code-line> { <code-line class = "line-numbers-rows" ></code-line> case "Facebook" : <code-line class = "line-numbers-rows" ></code-line> _OpenFacebookApp(); <code-line class = "line-numbers-rows" ></code-line> break ; <code-line class = "line-numbers-rows" ></code-line> case "Youtube" : <code-line class = "line-numbers-rows" ></code-line> _OpenYoutubebookApp(); <code-line class = "line-numbers-rows" ></code-line> break ; <code-line class = "line-numbers-rows" ></code-line> default : <code-line class = "line-numbers-rows" ></code-line> Application.OpenURL(url); // 这里的url就是正常的网址,比如 https://www.instagram.com/xxxxx <code-line class = "line-numbers-rows" ></code-line> break ; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line>}</code-pre> |
IOS方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <code-pre class = "code-pre" id = "pre-6Tjif2" ><code-line class = "line-numbers-rows" ></code-line> //"iOSProcessURL.h" <code-line class = "line-numbers-rows" ></code-line>#ifndef iOSProcessURL_h <code-line class = "line-numbers-rows" ></code-line>#define iOSProcessURL_h <code-line class = "line-numbers-rows" ></code-line> extern void _OpenFacebookApp(); <code-line class = "line-numbers-rows" ></code-line> extern void _OpenYoutubebookApp(); <code-line class = "line-numbers-rows" ></code-line>#endif <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> //"iOSProcessURL.m" <code-line class = "line-numbers-rows" ></code-line>#import <Foundation/Foundation.h> <code-line class = "line-numbers-rows" ></code-line>#include "iOSProcessURL.h" <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> @implementation iOSProcessURL <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> void _OpenFacebookApp() <code-line class = "line-numbers-rows" ></code-line>{ <code-line class = "line-numbers-rows" ></code-line> NSURL *url = [ NSURL URLWithString:@ "fb://profile/xxxxxxxxxx" ]; <code-line class = "line-numbers-rows" ></code-line> if ([[UIApplication sharedApplication] canOpenURL:url]) <code-line class = "line-numbers-rows" ></code-line> { <code-line class = "line-numbers-rows" ></code-line> [[UIApplication sharedApplication] openURL:url]; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> void _OpenYoutubebookApp() <code-line class = "line-numbers-rows" ></code-line>{ <code-line class = "line-numbers-rows" ></code-line> NSURL *url = [ NSURL URLWithString:@ "youtube://www.youtube.com/channel/xxxxxxx" ]; <code-line class = "line-numbers-rows" ></code-line> if ([[UIApplication sharedApplication] canOpenURL:url]) <code-line class = "line-numbers-rows" ></code-line> { <code-line class = "line-numbers-rows" ></code-line> [[UIApplication sharedApplication] openURL:url]; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> @end </code-pre> |
踩过的坑!!!!
就facebook的一直跳转不成功,url scheme fb, facebook什么都试过了都不行,在网上找了好久终于发现很有可能是fb没有加入url scheme白名单里,网上有两种加url scheme的方法,在这里我又踩了一个坑,我第一次用的是CFBundleURLType, 这个的确是跳转成功了,但是当打包到app store的时候发现审核没通过因为fb不允许用于url types,这下才明白这个字段是用来给其他app来launch我的app所应该用的url scheme,而不是我去调用其他app的。
url的白名单的字段应该是 LSApplicationQueriesSchemes,这个需要改info.plist.
1 2 3 4 5 6 7 8 9 10 | <code-pre class = "code-pre" id = "pre-sPYTrp" ><code-line class = "line-numbers-rows" ></code-line><key>LSApplicationQueriesSchemes</key> <code-line class = "line-numbers-rows" ></code-line> <array> <code-line class = "line-numbers-rows" ></code-line> <!-- facebook URL Scheme 白名单--> <code-line class = "line-numbers-rows" ></code-line> <string>fb</string> <code-line class = "line-numbers-rows" ></code-line> <string>facebook</string> <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> <!-- Alipay URL Scheme 白名单--> <code-line class = "line-numbers-rows" ></code-line> <string>alipay</string> <code-line class = "line-numbers-rows" ></code-line> <string>alipayshare</string> <code-line class = "line-numbers-rows" ></code-line></array></code-pre> |
如果是自己手动打包,可以直接在Xcode上改,但是在现实项目里不可能有人天天手动去改打包后的文件内容。Unity提供了一个API [postprocessbuild] 去修改Xcode项目工程配置以及修改plist文件内容,当unity build结束后, 会自动回调OnPostProcessBuild,如何用可以详情看这个blog:https://www.cnblogs.com/pandawuwyj/p/6904770.html
这次经历让我明白了游戏客户端不仅要写游戏逻辑UI逻辑还要学会安卓苹果开发,还有很长一段路要走啊
Reference:
- https://github.com/youtube/yt-android-player
- https://blog.csdn.net/u014361280/article/details/104535398
- https://www.jianshu.com/p/a1895c766400
__EOF__

本文链接:https://www.cnblogs.com/cancantrbl/p/15325341.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现