初始化
Unity3D
概述
接入向导
MSDKPolicy
TargetAPI 28
MSDK 权限列表
常见问题
Android
概述
接入向导
MSDKPolicy
TargetAPI 28
MSDK Android 权限列表
常见问题
IOS
概述
接入向导
Universal Link
MSDK iOS 权限列表
常见问题
其他
数据结构
系统工具
接入配置 / IOS / 概述

概述

MSDK是腾讯IEG为自研以及第三方手游开发团队开发提供的,旨在帮助游戏快速接入腾讯各个主要平台并上线运营的公共组件及服务库。

接入向导

1 前置条件

1)首先您需要确认是否已获取MSDK iOS版本,如果您未获取可点击下面链接进行下载。

MSDK for iOS 下载

2)需要已安装Xcode 7.0以上环境。

2 安装包结构

MSDK的iOS版本包中包含示例 Demo及libstdc++和libc++两个版本库 frameworkframework存放在MSDKDemo/Library目录,如下图所示:

其中不带_C11文件夹名中的为libstdc++版本,适用于“Build Setting->C++ Language Dialect”配置为GNU++98,“Build Setting->C++ Standard Library”为“libstdc++(GNU C++ standard library)”的工程;

对应携带_C11文件夹名中的为libc++版本,适用于“Build Setting->C++ Language Dialect”配置为GNU++11,“Build Setting->C++ Standard Library”为“libc++(LLVM C++ standard library with C++11 support)”的工程。

备注:使用XCode10及适配iOS12需要使用C11库文件

3 导入MSDK

按需求将各framework导入到工程设置的Target->Build Phases->Link Binary With Libraries中。如下图所示

注意事项

接入实名注册和内置浏览器的游戏除了需接入MSDK.framework外还需将资源文件MSDKResources.bundle、WGPlatformResources.bundle导入至工程设置的Target->Build Phases->Copy Bundle Resources中,否则实名注册界面会有按钮图片缺失,内置浏览器拉起Crash等问题。

4 导入系统依赖库

libz.tdb
libstdc++.tdb//使用C11版本的游戏需使用libc++.tdb
libz.1.1.3.tdb
libsqlite3.tdb
libxml2.tdb
CoreTelephony.framework
SystemConfiguration.framework
UIKit.framework
Foundation.framework
CoreGraphics.framework
MobileCoreServices.framewrok
StoreKit.framework
CFNetwork.framewrok
CoreData.framework
Security.framework
CoreLocation.framework
ImageIO.framework
CoreText.framework
QuartzCore.framework
AdSupport.framework
UserNotifications.framework

注意事项

3.3.8i版本开始需要将 UserNotifications.framework 这个库设置为optional,否则iOS10以下系统找不到这个库。

5 配置游戏信息

以下几个字段的游戏信息都是必需配置在工程的info.plist文件中,每个字段的值可通过您的游戏运营经理在飞鹰系统(dev.ied.com)上获取。

字段 类型 描述
MSDKKey String 对于此游戏的MSDK前后台交互使用id
QQAppID String 游戏在手Q开发平台的AppId
QQAppKey String 游戏在手Q开发平台的AppKey(2.18.0以后版本无需再配置QQAppKey)
WXAppID String 游戏在微信开发平台的AppId
MSDK_OfferId String 米大师平台iOS支付OfferId。
先由游戏运营在RDM官网rdm.oa.com申请苹果信息,申请好了后将信息给到RTX飞鹰小助手录入到飞鹰后台,然后由开发商在开放平台管理中心添加IAP版本,添加完IAP版本后可根据指引自动生成OfferId

6 配置MSDK相关信息

以下几个字段为MSDK功能相关配置信息,可按游戏自身需求配置在工程的info.plist文件中,具体配置及说明如下:

字段 类型 描述
MSDK_ENV String MSDK环境选择,联调时可选择测试环境test,正式发布时务必选择正式环境release
AutoRefreshToken Boolean MSDK微信自动刷新票据开关,默认打开,详细了解参考登录模块
MSDK_PUSH_SWITCH Boolean 腾讯移动推送功能开关,默认关闭
NeedNotice Boolean MSDK公告功能开关,默认关闭
NoticeTime Number MSDK公告系统公告数据更新时间(连网请求公告数据), 单位为秒(最小值为300秒),默认为600秒
MSDK_REAL_NAME_AUTH_SWITCH Number 实名认证配置(3.2.14及其以上版本必须配置为1);
0:使用MSDK实名认证UI,认证后回到登录页;
1:使用MSDK实名认证UI,认证后登录进入游戏;
2:使用游戏自定义认证UI,认证后回调到游戏;
CHANNEL_DENGTA String iOS系统渠道号
NSLocationWhenInUseUsageDescription String 用于iOS8下LBS定位功能,值可为空
MSDK_Webview_Portrait_NavBar_Hideable Boolean 内置浏览器竖屏导航栏可隐藏开关,默认关闭
MSDK_Webview_Landscape_NavBar_Hideable Boolean 横屏导航栏可隐藏开关,默认关闭
MSDK_DO_BEACON_EVENT_IP_SWITCH String Msdk内部灯塔上报开关使用,默认1打开
MSDK_DO_BEACON_EVENT_SWITCH String Msdk内部灯塔上报开关使用,默认1打开
SCOPE String 拓展微信scope字段,多个scope用“,”隔开;2.18.0版本开始支持
IPV6_SUPPORT Boolean 是否支持IPV6,设为true即支持,false即不支持;3.3.0版本开始支持
MSDK_PUSH_AT_FOREGROUND Boolean 腾讯移动推送前台推送开关,默认关闭;3.3.10版本开始支持
MSDK_Webview_Force_Adapt_Bang_Screen Boolean 内置浏览器全屏配置开关,配置为true时,MSDK内置浏览器横屏状态时将全屏展示;配置为false或不配置时,MSDK内置浏览器行为与之前老版本保持一致;3.3.11版本开始支持
MSDK_WEBVIEW_LOADING_BACKGROUND_COLOR String 打开webview时加载loading页面颜色的开关,不配置或者配置为""时不开启加载的loading页面;如配置,会开启携带该背景颜色的loading页面且必须填写格式为不包含透明度的16进制颜色值,如:#000000;3.3.12版本开始支持
MSDK_BUGLY_BLOCK_MONITOR_ENABLE Boolean Bugly卡顿监控配置开关,配置为true时开启,不配置默认关闭;3.3.15版本开始支持
MSDK_BUGLY_BLOCK_MONITOR_TIMEOUT Number Bugly卡顿监控开启之后,需配置卡顿监控判断间隔,单位为秒,不配置默认为5秒;3.3.15版本开始支持
MSDK_CENTER_CONTROL_WEBVIEW_LOADING_BACKGROUND_COLOR String 打开中控webview时加载loading页背景色开关,不配置默认为:#010C0F;3.3.16版本开始支持
CLOSE_BEACON_REPORT Boolean 灯塔上报开关,默认应将其设为false,设为true即关闭灯塔上报功能,不配置则默认开启;3.3.17版本开始支持
CLOSE_HTTPDNS Boolean HttpDns开关,默认应将其设为false,设为true即关闭HttpDns功能,不配置则默认开启;3.3.17版本开始支持
STAT_LOG Boolean 灯塔、Bugly、手Q OpenSDK日志开关,设为true时会打印详细日志,正式上线时需设为false或移除该配置;3.3.19版本开始支持灯塔、Bugly;3.3.271版本开始支持手Q OpenSDK
BUGLY_REPORT_URL_IOS String Bugly自定义Server Url配置,用于Bugly到CrashSight的迁移,迁移前,请确保appId已经在CrashSight后台管理端配置(添加对应项目)。触发崩溃或者Bugly日志后,验证请到CrashSight管理端进行验证;3.3.19版本开始支持
CLOSE_BUGLY_CALLBACK Boolean Crash上报回调开关,设为false即为开启回调,true即为关闭回调,不配置则默认开启;3.3.26版本开始支持
DELETE_ACCOUNT_URL_TEST String 注销账号页面测试环境url,当前配置为:https://gacc-account-web-test.odp.qq.com/writeoff.html;3.3.271版本开始支持
DELETE_ACCOUNT_URL_RELEASE String 注销账号页面正式环境url,当前配置为:https://gacc-account-web.odp.qq.com/writeoff.html;3.3.271版本开始支持
QQSdkWebviewScreenDir Number 在iOS16下当未安装手Q客户端时,通过该配置可解决横屏游戏拉起手Q网页登录后返回游戏时无法切回横屏问题;获取到以下配置值:0:横竖屏,1:横屏,2:竖屏;未获取到上述配置值:获取APP登录时UI方向,若有则返回获取的UI方向,否则返回横竖屏。3.3.271版本开始支持
IGNORE_ILINK_AUTH_BUFFER Boolean 如需要微信视频号自动授权能力,需配置为 true;3.3.32版本开始支持

IDFA iOS 14 说明

适用版本: MSDK V3.3.15 及以后版本

在 iOS 14 Apple 进一步收紧用户隐私权限,采集 IDFA 需要弹出用户授权弹窗,并在 info.plist 中新增配置填写获取 IDFA 的用途说明,业务可自行按需适时调用获取 IDFA 接口给用户弹出通知,询问用户是否授权,如果用户不授权,则获取的 IDFA 为一串没有意义的 00000-000000000-000000。IDFA获取模块化,新增MSDKSensitivity.framework,业务可按需接入。

  • Xcode - Build Phases - Link Binary With Libraries 新增 AppTrackingTransparency.framework
  • Info.plist 中新增 key Privacy - Tracking Usage Description ,value 填写使用 IDFA 原因。

调用如下API给用户弹授权弹窗:

#import <AppTrackingTransparency/AppTrackingTransparency.h>
if (@available(iOS 14.0, *)) {
    [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {

    }];
}

MSDK 从3.3.16版本开始提供了开关兼容 IDFA 的采集,如下说明:

在开发工程的 info.plist 添加 键 MSDK_APP_TRACKING_ENABLE 和值 YES 或者 NO

  • YES :业务仍需适时自行调用上述 AppTrackingTransparency.framework API 给用户弹授权弹窗,询问用户是否允许采集 IDFA,MSDK 也会调用相关 API 查询用户的授权情况,只有用户授权了才会调用接口获取 IDFA,否则直接返回没意义的00000-000000000-000000。
  • NO : MSDK 直接调用 Apple API 获取 IDFA 接口。

不添加 MSDK_APP_TRACKING_ENABLE 的默认行为为 NO

如需删除 MSDK 自身的 IDFA 相关,可按如下操作:

  • 删除 info.plist 中 IDFA 的声明
  • 删除 MSDKSensitivity.framework
  • 删除 AdSupport.framework
  • 删除 AppTrackingTransparency.framework

CAID 说明

适用版本: MSDK V3.3.17 及以后版本

CAID:是国内广告协同推广的一套 IOS 设备 ID,苹果 IDFA 无法读取后,解决广告归因的问题。有 CAID 获取和上报需求的业务需自行集成 MSDK 发布包中的 TGPA 组件 tgpasimple.framework,MSDK 内部会通过反射调用获取并上报 CAID。

注意事项:

  • CAID 的获取和上报仅支持 iOS 9.0 及以上系统,iOS 9.0 以下系统 TGPA 组件无法获取 CAID。
  • 因 CAID 的获取需要访问网络,对于首次安装或者卸载重装的场景,可能存在 CAID 获取和上报失败的情况,失败后会重新获取,下次启动登录可见。

7 配置Scheme白名单及ATS信息

由于iOS9系统限制,需要在info.plist文件中配置跳转Scheme白名单才可以正常拉起手Q、微信的授权及分享,否则授权或分享时会报类似"-canOpenURL:failed for URL:"mqq://" - error:"This app is not allowed to query for scheme mqq""错误导致无法授权和分享。另外还需配置支持http传输,否则iOS9以上系统所有的http请求将会被系统屏蔽(2.16.0版本无需再配置ATS,需要继续使用ATS声明的游戏提审时需向苹果解释说明)。可直接copy以下配置信息至info.plist中:

备注:

  • 内置浏览器(WebView) 模块跳转第三方应用需要增加白名单,如跳转到微信,则需新增:weixin、wechat

  • 3.3.8版本开始info.plist中新增 mqqopensdkminiapp 、 weixinULAPI 跳转scheme白名单,否则会造成无法授权登录、分享等问题。

  • 3.3.21版本开始info.plist中新增 mqqopensdklaunchminiapp 跳转scheme白名单,否则无法正常唤起手Q。
  • 3.3.271版本开始info.plist中新增 mqqopensdknopasteboard、mqqopensdknopasteboardios16、weixinURLParamsAPI 跳转scheme白名单,手Q、微信渠道适配iOS 16所需,业务需确认确保在 info.plist 中添加。
<key>LSApplicationQueriesSchemes</key>
<array>
        <string>tim</string>
        <string>mqq</string>
        <string>mqqapi</string>
        <string>mqqwpa</string>
        <string>mqqbrowser</string>
        <string>mttbrowser</string>
        <string>mqqOpensdkSSoLogin</string>
        <string>mqqopensdkapiV2</string>
        <string>mqqopensdkapiV3</string>
        <string>mqqopensdkapiV4</string>
        <string>wtloginmqq2</string>
        <string>mqzone</string>
        <string>mqzoneopensdk</string>
        <string>mqzoneopensdkapi</string>
        <string>mqzoneopensdkapi19</string>
        <string>mqzoneopensdkapiV2</string>
        <string>mqqapiwallet</string>
        <string>mqqopensdkfriend</string>
        <string>mqqopensdkdataline</string>
        <string>mqqgamebindinggroup</string>
        <string>mqqopensdkgrouptribeshare</string>
        <string>tencentapi.qq.reqContent</string>
        <string>tencentapi.qzone.reqContent</string>
        <string>weixin</string>
        <string>wechat</string>
        <string>weixinULAPI</string>
        <string>mqqopensdkminiapp</string>
        <string>mqqopensdklaunchminiapp</string>
        <string>mqqopensdknopasteboard</string>
        <string>mqqopensdknopasteboardios16</string>
        <string>weixinURLParamsAPI</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

8 配置URL Types

游戏还需在工程设置的Target->Info->URL Types中配置以下URL Scheme以便平台授权后或从平台游戏中心、点击分享消息等正常拉起游戏,具体配置如下:

Identifier URL Scheme 示例 备注
weixin 游戏的微信AppID wxcde873f99466f74a 接入微信必填
tencentopenapi 格式:tencent+游戏的QQAppID tencent100703379 接入手Q必填,中间无空格
QQ 格式:QQ+游戏的QQAppID的16进制 QQ06009C93 接入手Q必填,中间无空格
QQLaunch 格式:tencentlaunch+游戏的QQAppID tencentlaunch100703379 接入手Q必填,中间无空格

配置结果如下图所示:

9 透传平台拉起的URL参数

游戏需在被平台拉起的方法中透传拉起的URL参数给到MSDK,否则将无法收到MSDK的授权登录、分享回调,具体方法为AppDelegate.m- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation方法,参考示例如下:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    NSLog(@"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!url == %@",url);
    //初始化MSDK
    WGPlatform *plat = WGPlatform::GetInstance();
    WGPlatformObserver *ob = plat->GetObserver();
    if (!ob)
    {
        //设置回调
        MyObserver* ob = MyObserver::GetInstance();
        plat->WGSetObserver(ob);
        plat->WGSetADObserver(ob);
        plat->WGSetGroupObserver(ob);
    }
    //透传URL参数给MSDK
    return  [WGInterface  HandleOpenURL:url];
}

10 Universal Link

10.1 什么是 Universal Link

Universal Link 是 Apple 从 iOS 9 引入的一种打通 web 和 app 之间跳转的机制。在 Safari 或者 WebView 中打开与 app 关联的链接时,会自动跳转到 app 并且不丢失参数内容。Universal Link 解决了 URL Scheme 的部分问题:

  • 当跳转失败时,会直接在 Safari/WebView 中打开链接;
  • 可以借助 Universal Link 统一 web 端和 native 的路由;
  • 跳转时不会弹出提示框,体验更好。

有关 Universal Link 相关知识可查看:
Apple官方文档
关于 Universal Link 的接入流程可参考iOS Universal Link教程
Enabling Universal Links
苹果官方的UL测试工具

10.2 Universal Link 使用

要使用 Universal Link,要将域名和 app 关联起来,这个关联是双向的:

  • 域名对 app 的认证:在 web 服务器根目录放一个名为 apple-app-site-association 的 json 文件,里面描述哪些路径会跳转到哪个 app。
  • App 对域名的认证:在 Xcode 里设置 Associated Domains,将域名添加进去。
{
    "applinks": {
        "apps": [],
        "details": [{
            "paths": ["/app/*", "/qq_conn/100703379/*"],
            "appID": "JBS4AWYMFX.com.tencent.itop.example"
        }, 
        {
            "paths": ["/app/*", "/qq_conn/100703379/*"],
            "appID": "JBS4AWYMFX.com.tencent.imsdk2"
        }]
    }
}

注意事项:

  • 域名必须通过 HTTPS 访问 Universal Link 才能生效;
  • apple-app-site-association 只能放在域名根目录下,不能有跳转;
  • 系统会在 app 初次安装、升级时去对应的域名下拉 apple-app-site-association 文件,如果 Universal Link 不可达,而配置都正常的话,可以尝试重启手机或重装 app。

10.3 Universal Link 运作流程

  • app 第一次启动或者更新版本后第一次启动(实际结果,未体现在苹果官方文档上);
  • app 向工程里配置的域名发起 Get 请求拉取 apple-app-site-association Json 文件;
  • app 将 apple-app-site-association 注册到系统;
  • 由任意 WebView 发起跳转 url;
  • 如果命中了 apple-app-site-association 注册过的通用链接,则打开 app,触发 Universal Link delegate;
  • 没命中,WebView 继续跳转 url。

在进行 apple-app-site-association 以及 app Xcode 工程配置之后,整个 Universal Link 运作流程完全由系统控制。

注意:在上面第2步出现 apple-app-site-association 文件访问不可用时,会导致新安装用户后续都不能正常登录(在微信/手Q App授权界面无法跳转回游戏App),除非卸载重装。

10.4 接入MSDK Universal link授权登录能力

10.4.1 MSDK&QQ&微信版本支持情况
MSDK版本

MSDK 从V3.3.9版本开始支持;合入QQ OpenSDK 3.3.7、微信OpenSDK 1.8.6版本。

QQ App版本

QQ App 8.1.3及其以上版本支持。

微信 App版本

微信 App 7.0.7及其以上版本支持。

iOS系统版本

QQ需要 iOS13 及以上版本支持;微信需要 iOS12 及以上版本支持。

注意事项:

1. 因某些原因QQ平台现已关闭OpenSDK 3.3.6版本(MSDK V3.3.8)的Universal Link授权登录能力,业务需要测试QQ平台该能力的需更新至OpenSDK 3.3.7版本,该版本OpenSDK已合入MSDK V3.3.9版本。
2. 如果项目组有多款游戏,那么每一款游戏的Universal Link链接要保证唯一,不可以多款游戏共用一个链接。

10.4.2 新增weixinULAPI scheme白名单

info.plist中新增weixinULAPI跳转scheme白名单,否则会造成无法授权登录、分享等问题。

若接入的是 MSDKV3 Unity 版本,可直接在 \Assets\Msdk\Editor\Resources\MSDKInfo.plis 中添加。

10.4.3 开启AppleID Associated Domains能力

根据Apple官方文档找证书管理相关同学申请开通AppleID Associated Domains的能力,如下图所示:

AppleID开启了Associated Domains的能力之后请重新生成签名描述文件。

注意事项:

因目前企业签名证书暂不具备Universal Link能力,请各业务务必使用开发签名证书调试

10.4.4 飞鹰系统配置Universal Link相关参数

飞鹰系统中配置Universal Link,配置路径在:游戏管理 -> 我的游戏 -> SDK参数 -> 搜索:编辑iOS信息 ,如下图所示:

备注:Universal Link不强制要求部署在官网域名下,只要确保部署地方高可用即可;以下描述以部署在官网下作为举例说明

其中Universal Link一栏填写业务官网下的一个子目录且需为https链接,例如:https://xxx.com/app/,注意结尾必须要有/URL Scheme一栏填写业务的QQ跳转scheme,格式为tencent+qqappid,例如:tencent100703379;如果业务有单独的 iPad 版本,需要在飞鹰选择 iPad 版本配置。请选择上图中“有单独的 iPad 版”,并填写对应参数。

填写完之后点击提交iOS信息审核按钮保存。

注意事项:

保存之后请企业微信联系微信侧接口人wxgame审核开通权限;
若有QQ相关报错提示,请先做好下一步:10.4.5 配置apple-app-site-association
此处有任何报错均可企业微信联系MSDK助手处理

10.4.5 配置apple-app-site-association

配置样例如下:

{
    "applinks": {
        "apps": [],
        "details": [{
            "appID": "JBS4AWYMFX.com.tencent.newmsdk2",
            "paths": ["/app/*", "/qq_conn/100703379/*"]
            },
            {
            "appID": "JBS4AWYMFX.com.tencent.itop.example",
              "paths": ["/app/*", "/qq_conn/100703379/*"]
              }]
    }
}

其中appID参数需修改为业务自身的签名证书team id + bundle id,paths参数中的/app字符需替换为上一步骤10.4.4 飞鹰系统配置Universal Link相关参数中设置的官网地址.com后面的部分,例如上一步骤中配置的地址为https://xxx.com/client/,则此处的/app/*需替换为/client/*;另外QQ互联侧要求paths 参数中必须配置为/qq_conn/QQ AppID/格式,其中qq_conn为固定字段,QQ AppID填写为业务自身的QQ appid,如:/qq_conn/100703379/,否则飞鹰同步信息到QQ互联会校验失败。如需配置多个appID和paths,请参考上述事例。改好之后将文本保存为名称为apple-app-site-association的文件(注意不能加任何后缀),并将文件放置在上一步骤10.4.4 飞鹰系统配置Universal Link相关参数中设置的官网地址的根目录,需访问https://xxx.com/apple-app-site-association地址可正常下载到该文件。

10.4.6 配置Xcode Capabilities

在Xcode工程Capabilities标签下,开启Associated Domains并配置DomainsDomains固定写applinks:+官网域名,注意无需加https://样例如下:

若接入的是 MSDKV3 Unity 版本且 Unity 引擎版本为 Unity 2017 及以上版本,可参考 \assets\msdk\editor\scripts\xuporter\xcodepostprocess.cs 中的实现,样例如下:

// Need create entitlements
string relativeEntitlementFilePath = "Unity-iPhone/xxxxxx.entitlements";
Debug.Log("entitlementsPath : " + relativeEntitlementFilePath);
string absoluteEntitlementFilePath = pathToBuiltProject + "/" + relativeEntitlementFilePath;

PlistDocument tempEntitlements = new PlistDocument();
string key_associatedDomains = "com.apple.developer.associated-domains";
var arr = (tempEntitlements.root[key_associatedDomains] = new PlistElementArray()) as PlistElementArray;

// wiki.ssl.msdk.qq.com 需要替换成游戏自己域名
arr.values.Add(new PlistElementString("applinks:wiki.ssl.msdk.qq.com"));

proj.AddCapability(target_1, PBXCapabilityType.AssociatedDomains, relativeEntitlementFilePath);

string projPath_1 = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(pathToBuiltProject);
File.WriteAllText(projPath_1, proj.WriteToString());
tempEntitlements.WriteToFile(absoluteEntitlementFilePath);
10.4.7 配置info.plist

在info.plist中新增类型为string名称为WX_UNIVERSAL_LINK的配置项,值填写飞鹰系统配置的Universal Link ,示例如下:

若接入的是 MSDKV3 Unity 版本,可直接在 \Assets\Msdk\Editor\Resources\MSDKInfo.plis 中添加。

10.4.8 配置实现iOS入口函数

需实现-application:continueUserActivity:restorationHandler:入口函数,在该函数中实现MSDK的初始化以及设置相关事件回调,并将相关参数调用WGPlatform::GetInstance()->WGHandleOpenUniversalLink((unsigned char *)[urlStr UTF8String]);接口透传给MSDK,样例如下:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler
{
    NSLog(@"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!activityType == %@ webpageURL == %@",userActivity.activityType, userActivity.webpageURL);
    WGPlatform* plat = WGPlatform::GetInstance();
    WGPlatformObserver *ob = plat->GetObserver();
    if (!ob)
    {
        MyObserver* ob = MyObserver::GetInstance();
        WGPlatform::GetInstance()->WGSetObserver(ob);
        WGPlatform::GetInstance()->WGSetGroupObserver(ob);
        WGPlatform::GetInstance()->WGSetWebviewObserver(ob);
        WGPlatform::GetInstance()->WGSetEmbeddedWebViewObserver(ob);
    }

    if (userActivity && [userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])
    {
        NSURL *webpageUrl = userActivity.webpageURL;
        if (webpageUrl)
        {
            NSString *urlStr = [webpageUrl absoluteString];
            return plat->WGHandleOpenUniversalLink((unsigned char *)[urlStr UTF8String]);
        }
    }

    return YES;
}

若接入的是 MSDKV3 Unity 版本,可参考 \Assets\Msdk\Editor\Scripts\MsdkNativeCode.cs 中的实现,样例如下:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler
{
     NSLog(@""MSDK handle openUniversalLink activityType == %@ webpageURL ==%@"",userActivity.activityType, userActivity.webpageURL);
     WGPlatform* plat = WGPlatform::GetInstance();

     if (userActivity && [userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])
     {
         NSURL *webpageUrl = userActivity.webpageURL;
         if (webpageUrl)
         {
             NSString *urlStr = [webpageUrl absoluteString];
             return plat->WGHandleOpenUniversalLink((unsigned char *)[urlStr UTF8String]);
         }
     }

    return YES;
}

注意事项:

接入Apollo/GCloud组件的业务需按照Apollo/GCloud的方式实现该入口函数,具体可咨询Apollo/GCloud组件相关同学。

10.4.9 如何验证

微信 Universal Link 接入成功验证指引请参考 微信官方文档相关说明
手Q Universal Link 接入成功验证指引请参考 手Q官方文档相关说明

需拉起平台授权登录成功以及拉起平台分享成功后可通过MSDK日志查看是否是通过Universal Link授权:

日志打印 isUniversalLink:1 时说明是通过Universal Link授权,如下图日志:

日志打印 isUniversalLink:0 时说明是通过scheme授权,如下图日志:

注意事项

1.因目前企业签名证书暂不具备Universal Link能力,请各业务务必使用开发签名证书调试。

2.请各业务务必按照验收标准验证授权登录以及分享流程。

11 将游戏的最低支持版本设置为iOS8.0或以上

务必将游戏的 Deployment Target 设置为8.0或者以上,否则在iOS8.0以下系统运行会发生crash,设置方式如下图所示:

12 开启Background Modes

在Xcode工程 Capabilities 标签下开启 Background Modes 并勾选 Remote notifications 选项,如下图所示:

初始化MSDK

游戏可在AppDelegate.m中以下两个游戏启动的入口初始化MSDK并设置回调Observer,注意需先引入头文件#import <MSDK/MSDK.h>

入口1 正常启动

参考示例:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //初始化MSDK
    WGPlatform *plat = WGPlatform::GetInstance();
    WGPlatformObserver *ob = plat->GetObserver();
    if (!ob)
    {
        //设置回调
        MyObserver *ob = MyObserver::GetInstance();
        plat->WGSetObserver(ob);
        plat->WGSetGroupObserver(ob);
        plat->WGSetWebviewObserver(ob);
    }
    return YES;
}

入口2 从平台拉起

示例代码:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    NSLog(@"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!url == %@",url);
    //初始化MSDK
    WGPlatform *plat = WGPlatform::GetInstance();
    WGPlatformObserver *ob = plat->GetObserver();
    if (!ob)
    {
        //设置回调
        MyObserver* ob = MyObserver::GetInstance();
        plat->WGSetObserver(ob);
        plat->WGSetADObserver(ob);
        plat->WGSetGroupObserver(ob);
    }
    //透传URL参数给MSDK
    return  [WGInterface  HandleOpenURL:url];
}

处理登录回调、平台拉起回调

因登录回调、平台拉起回调可在游戏未调用相关接口时触发, 所以需要在游戏初始化MSDK前注册。

登录回调

登录事件结果的通知,游戏在手Q/微信的登录态以登录回调为准,详细设置参考登录模块回调设置。 示例代码:

void MyObserver::OnLoginNotify(LoginRet& loginRet)
{
    if(loginRet.flag == eFlag_Succ)
    {
        //登录成功
        //游戏TODO:进入游戏
    }
    else if (loginRet.flag == eFlag_NeedRealNameAuth)
    {
        //需要进行实名认证,业务可自行设置实名认证流程,在info.plist中配置MSDK_REAL_NAME_AUTH_SWITCH(3.2.14及其以上版本必须配置为1)
        //0,业务无需做任何操作保持在登录页即可,MSDK自动弹出实名注册界面引导用户注册,注册完引导用户重新登录
        //1,业务无需做任何操作保持在登录页即可,MSDK自动弹出实名注册界面引导用户注册,业务需再次监听登录回调,实名注册成功MSDK会自动调用本地票据登录接口进行自动登录
        //2,业务自定义实名认证界面,自行实现实名认证流程
        //自定义界面认证流程

        //1 弹出实名认证界面给用户填写相关信息
        //2 调用WGSetRealNameAuthObserver接口设置实名认证回调
        //3 调用MSDK实名认证接口进行认证并等待回调
        //4 处理OnRealNameAuthNotify回调
    }
    else
    {
        //登录失败
        //游戏TODO:根据flag提示玩家相关信息
    }
}

平台拉起回调

手Q、微信中拉起游戏时会回到此回调,回调中包含拉起的账号,平台透传数据等信息,详细设置参考登录模块异账号处理

示例代码:

void MyObserver::OnWakeupNotify(WakeupRet& wakeupRet)
{
    switch (wakeupRet.flag)
    {
        case eFlag_Succ:
            //本地账号登录成功,可直接进入游戏,或也可调用自动登录接口WGLogin(),等待登录回调
            break;
        case eFlag_NeedLogin:
            //没有有效的票据,登出游戏让用户重新登录
            break;
        case eFlag_UrlLogin:
            //本地无账号信息,自动用拉起的账号登录,需等待登录回调
            break;
        case eFlag_NeedSelectAccount:
            //需要弹出提示框让用户选择登录的账号,并根据用户的选择调用WGSwitchUser接口
            break;
        case eFlag_AccountRefresh:
            //外部账号和已登录账号相同,使用外部票据更新本地票据,需等待登录回调
            break;
        default:
            break;
    }
}

开关配置接口

MSDK 3.3.22版本开始新增开关配置接口,在用户同意用户协议条款之后,业务可调用该接口开启MSDK以及MSDK所包含的第三方组件对相关信息的获取;在开关开启之前,MSDK不会获取相关信息。

接口声明

c++接口:
/*
 * 设置是否允许获取相关信息
 */
void WGSetCouldCollectSensitiveInfo(bool couldCollect);

注意事项:

  • 用户勾选同意协议相关条款后务必主动调用该接口。
  • 【重点】手Q OpenSDK 3.5.7版本开始更新了权限相关功能,接入方未调用SetCouldCollectSensitiveInfo授权前无法使用手Q OpenSDK的各项功能。日志中会打印 “用户未授权,暂时无法使用QQ登录及分享等功能”。

设置信息字段接口

MSDK 3.3.28版本开始新增设置信息字段接口,业务可自行获取相关信息字段,调用该接口设置到MSDK以及MSDK所包含的第三方组件(目前支持该能力的有灯塔组件)。

接口示例


MSDKSensitive::SetSensitiveInfo("{\"WiFiMacAddress\":\"xxx\", \"WiFiName\":\"xxx\", \"Idfa\":\"xxx\"}");

注意事项:

  • 灯塔iOS目前支持WiFiMacAddress、WiFiName、Idfa字段。

MSDK iOS 权限列表

渠道 必选权限 可选权限 使用目的
MSDK 1、网络权限 2、位置信息 1、网络连接
2、向游戏提供 LBS 位置信息服务,游戏通过接口可以获取经纬度,附近玩家的信息,让玩家可以和自己周边的玩家进行互动。如果游戏不需要 LBS 功能,可不配置此权限
3、相机权限 3、可以在网页中访问相机,如果游戏不需要该功能,可不配置此权限
4、用户跟踪(NSUserTrackingUsageDescription) 4、获取iOS14.5以上用户IDFA,用于数据分析及广告买量统计
QQ 1、网络权限 1、网络通信
WeChat - - -
Bugly 1、网络权限 1、网络通讯
QIMEI 1、网络权限 1、网络通信
Beacon 1、网络权限 1、数据上报
TPNS 1、APNS (推送) 1、允许程序使用APNS服务
2、网络权限 2、允许程序连接

常见问题

关于微信 OpenSDK iOS 15 系统的适配说明

Xcode13.0 以及以上版本编译出的 App 在 iOS 15.0 以及以上系统上被限制了 URL Scheme query 的数量为 50。对于 plistLSApplicationQueriesSchemes 配置的 scheme 数量超过 50 的 App,可能会导致:

  1. 微信 OpenSDK 某些接口返回错误结果;
  2. 无法使用 Universal Link 拉起微信,引发分享消息到微信后,应用名被添加 "未验证应用" 的问题。

使用 13.0 以及以上版本 Xcode 编译 App 的开发者需要适配以确保微信 OpenSDK 的正常使用。

背景

从 iOS 9 开始,iOS 支持在工程 plist 中配置 LSApplicationQueriesSchemes

示例:

将其他 App 的 scheme 配置到 LSApplicationQueriesScheme 中后,可以通过以下代码判断是否可 以通过 scheme 跳转对于的 App。

 BOOL ret = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]];

在接入微信 OpenSDK 时,接入文档有要求在 LSApplicationQueriesScheme添加 weixin 和 weixinULAPI (如上面截图所示)。

iOS 15系统相关变更

和苹果确认, 在 iOS 15 系统上,使用 Xcode 13 编译出的 App, LSApplicationQueriesSchemes 的数量会限制为50个。

第 50 个之后的 scheme 配置会不生效,以下代码会返回 NO

BOOL ret = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"otherAppScheme://"]]; 

微信 OpenSDK 适配建议

如果 LSApplicationQueriesSchemes 配置的 scheme 数量小于 50,或者 "weixin" 和 "weixinULAPI" 这两个 sheme 在前 50,无需适配。

使用 Xcode 12 以及以下版本 Xcode 编译的 App 目前暂不需要适配。

确保 "weixin" 和 "weixinULAPI" 配置在 LSApplicationQueriesSchemes 的前 50。否则以下接口可能会在 iOS 15 系统上返回错误结果或者表现异常:

  1. [WXApi isWXAppInstalled]:安装微信的情况下,也返回 NO
  2. [WXApi isWXAppSupportApi]:支持的情况下,也返回 NO
  3. [WXApi isWXAppSupportStateAPI]:支持的情况下,也返回 NO
  4. [WXApi sendAuthReq:viewController:delegatecompletion]:会判断微信未安装,拉起网页授权
  5. 所有的接口都会无法使用 Universal Link 拉起微信,降级使用 scheme 拉起微信,导致未验证应用问题