利用URLScheme实现Unity跳转到其他app

策划想让玩家直接在游戏的一个接口跳转到社交app里,并且跳到社交app里特定的界面,比如FB的个人主界面, instragram账号主界面, discord入群邀请链接等等。关于跳转app,安卓和苹果机型需要分开处理。

安卓Andorid:利用package name和url scheme跳转到特定的界面

  1. 在Unity上是有可以直接调用 Android 方法的,调用 Android 的 getPackageManager ,通过包名打开设备上安装的 apk应用,不需要 Android 端封装接口
  2. 如果还需要跳转到特定的界面,则需要调用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?

  1. 打开google play, https://play.google.com/store
  2. 查找你要的app
  3. 进入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:

  1. https://github.com/youtube/yt-android-player
  2. https://blog.csdn.net/u014361280/article/details/104535398
  3. https://www.jianshu.com/p/a1895c766400

__EOF__

本文作者cancantrbl
本文链接https://www.cnblogs.com/cancantrbl/p/15325341.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cancantrbl  阅读(3332)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示