添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
怕老婆的可乐  ·  java调用cmd有空格-掘金·  2 年前    · 
失望的斑马  ·  asp.net ...·  2 年前    · 
博学的仙人掌  ·  Itext ...·  2 年前    · 

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

2 安装包结构

MSDK的iOS版本包中包含示例 Demo 及libstdc++和libc++两个版本库 framework framework 存放在 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)上获取。

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>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

    8 配置URL Types

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

    Identifier URL Scheme

    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回调
            //登录失败
            //游戏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字段。
  • 关于微信 OpenSDK iOS 15 系统的适配说明

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

  • 微信 OpenSDK 某些接口返回错误结果;
  • 无法使用 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 系统上返回错误结果或者表现异常:

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