前不久接完MSDK,又花了几天时间改之前的打包工具和MSDK的一些代码,主要是这边有骚操作,需要不带SDK的包和带SDK的包,还有很多杂七杂八的包。然后顺带着打了个iOS测试包,检测SDK有没有接好。大厂给的插件中有对XCode工程进行配置,不需要手动去拖frameworks和添加代码啥的,简单方便。稍微改下,就能快速打iOS包。确认没问题后,就马不停蹄的开始接入米大师充值SDK。

米大师SDK也有Unity版的插件,就直接用这个,安卓上的接入相对简单。XCode这边就有点麻烦了,因为米大师也在OnPostProcessBuild这个回调方法里进行了处理,就对代码进行了合并,发现各种问题,然后一个个解决过来。主要是MSDK和米大师都对XUPorter进行了修改,虽然后面全部解决了,但如果再有个第3方SDK,也用到了XUPorter,也进行了魔改,后面的维护不要太大啊。想了想,决定用Unity自带的API来,不用大厂的代码来自动配置,而且项目中Unity版本比较高,是2017版本的,也不需要配置其他插件,简单方便。

参考了一些大佬文章,用Unity的自带API也挺累的,很多都靠试,然后打包验证,花了一两天的时间结束,测试也没问题,也说下遇到的问题,google有搜到说建议用ProjectCapabilityManager这个类,用过发现不好用,不知道是不是XCode版本太高导致的,还是怎么了。PBXProject.AddCapability能开启InAppPurchase,但ProjectCapabilityManager就不能开启,后面就没有用上,这是官方的Bug吗?

代码:逻辑应该还算比较清晰,就懒得一一注释了。也测试过,MSDK和米大师都没有问题。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;
using System;public class ZPXCodePostProcess
{
#if UNITY_EDITOR[PostProcessBuild(1000)]public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject){if (target != BuildTarget.iOS) return;string projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);PBXProject project = new PBXProject();project.ReadFromString(File.ReadAllText(projPath));GenerateProjectFile(project, pathToBuiltProject);string plistPath = pathToBuiltProject + "/Info.plist";PlistDocument plist = new PlistDocument();plist.ReadFromString(File.ReadAllText(plistPath));GeneratePlistFile(plist.root, plistPath);File.WriteAllText(projPath, project.WriteToString());File.WriteAllText(plistPath, plist.WriteToString());DeployIOS.EditorCode(pathToBuiltProject);}/// <summary>/// 处理XCode工程/// </summary>/// <param name="project"></param>/// <param name="pathToBuiltProject"></param>private static void GenerateProjectFile(PBXProject project, string pathToBuiltProject){string target = project.TargetGuidByName(PBXProject.GetUnityTargetName());project.SetBuildProperty(target, "CODE_SIGN_IDENTITY", "********");project.SetBuildProperty(target, "PROVISIONING_PROFILE_SPECIFIER", "******");project.SetBuildProperty(target, "DEVELOPMENT_TEAM", "******");project.SetBuildProperty(target, "ENABLE_BITCODE", "NO");project.SetBuildProperty(target, "CODE_SIGNING_STYLE", "MANUAL");// 添加flagproject.AddBuildProperty(target, "OTHER_LDFLAGS", "-ObjC");// 添加系统库AddSystemFramework(project, target);// 添加第3方AddOther(project, target, pathToBuiltProject);//project.AddCapability(target, PBXCapabilityType.PushNotifications);project.AddCapability(target, PBXCapabilityType.InAppPurchase);project.AddCapability(target, PBXCapabilityType.BackgroundModes);}private static void AddSystemFramework(PBXProject project, string target){string[] frameworks ={"libz.dylib","libz.1.1.3.dylib","libsqlite3.dylib","libxml2.dylib","libc++.dylib","libstdc++.dylib","CoreTelephony.framework","SystemConfiguration.framework","UIKit.framework","Foundation.framework","CoreGraphics.framework","MobileCoreServices.framework","StoreKit.framework","CFNetwork.framework","CoreData.framework","Security.framework","CoreLocation.framework","ImageIO.framework","CoreText.framework","QuartzCore.framework","AdSupport.framework","Accelerate.framework","CoreImage.framework","SafariServices.framework","Social.framework","JavaScriptCore.framework","AssetsLibrary.framework","MediaPlayer.framework","AddressBook.framework","CoreMotion.framework","AVFoundation.framework","MessageUI.framework","EventKit.framework","EventKitUI.framework","CoreAudio.framework",};foreach (var framework in frameworks){project.AddFrameworkToProject(target, framework, false);}}private static void AddOther(PBXProject project, string target, string pathToBuiltProject){UpdateiOSPlugin(pathToBuiltProject);// 添加MSDK相关project.AddBuildProperty(target, "FRAMEWORK_SEARCH_PATHS", "$(PROJECT_DIR)/Third/MSDK");AddFile(project, target, "Third/MSDK/MSDK.framework");AddFile(project, target, "Third/MSDK/MSDKResources.bundle");AddFile(project, target, "Third/MSDK/WGPlatformResources.bundle");AddFile(project, target, "Third/MSDK/MSDKAdapter.framework");// Buglyproject.AddBuildProperty(target, "LIBRARY_SEARCH_PATHS", "$(PROJECT_DIR)/Third/Bugly");AddFile(project, target, "Third/Bugly/BuglyBridge.h");AddFile(project, target, "Third/Bugly/libBuglyBridge.a");// 添加米大师相关project.AddBuildProperty(target, "FRAMEWORK_SEARCH_PATHS", "$(PROJECT_DIR)/Third/Midas/local");AddFile(project, target, "Third/Midas/local/MidasIAPSDK.bundle");AddFile(project, target, "Third/Midas/local/MidasIAPSDK.framework");AddFile(project, target, "Third/Midas/Script/MidasLocalIAPSDKAdapter.h");AddFile(project, target, "Third/Midas/Script/MidasSdkConnector.h");AddFile(project, target, "Third/Midas/Script/MidasLocalIAPSDKAdapter.m");AddFile(project, target, "Third/Midas/Script/MidasSdkConnector.m");}private static bool UpdateiOSPlugin(string pathToBuiltProject){bool bIsFinish = false;try{int lastIndex = Application.dataPath.LastIndexOf("/");string sdkPluginPath = Application.dataPath.Substring(0, lastIndex) + "/PlatformSDKPlugin/iOS/Third";// C++11 版本if(ConfigSettings.Instance.UseC11)sdkPluginPath += "_C11";if (Directory.Exists(sdkPluginPath)){int length = sdkPluginPath.Length;if ('/' == sdkPluginPath[length - 1] || '\\' == sdkPluginPath[length - 1])--length;string[] files = Directory.GetFiles(sdkPluginPath, "*.*", SearchOption.AllDirectories);for (int i = 0; i < files.Length; ++i){string tempStr = files[i].Remove(0, length);string tempDestPath = pathToBuiltProject + "/Third/" + tempStr;string tempDir = Path.GetDirectoryName(tempDestPath);if (!Directory.Exists(tempDir))Directory.CreateDirectory(tempDir);File.Copy(files[i], tempDestPath, true);}}bIsFinish = true;}catch (Exception e){Debug.LogException(e);}return bIsFinish;}private static void AddFile(PBXProject project, string target, string destPath){project.AddFileToBuild(target, project.AddFile(destPath, destPath, PBXSourceTree.Source));}/// <summary>/// 处理Plist工程/// </summary>/// <param name="project"></param>/// <param name="plistPath"></param>private static void GeneratePlistFile(PlistElementDict rootDict, string plistPath){PlistElementArray urlArray = null;if (!rootDict.values.ContainsKey("CFBundleURLTypes"))urlArray = rootDict.CreateArray("CFBundleURLTypes");elseurlArray = rootDict.values["CFBundleURLTypes"].AsArray();var urlTypeDict = urlArray.AddDict();urlTypeDict.SetString("CFBundleTypeRole", "Editor");urlTypeDict.SetString("CFBundleURLName", "weixin");var urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes");urlScheme.AddString(DeploySettings.Instance.WxAppId);urlTypeDict = urlArray.AddDict();urlTypeDict.SetString("CFBundleTypeRole", "Editor");urlTypeDict.SetString("CFBundleURLName", "tencentopenapi");urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes");urlScheme.AddString("tencent" + DeploySettings.Instance.QqAppId);urlTypeDict = urlArray.AddDict();urlTypeDict.SetString("CFBundleTypeRole", "Editor");urlTypeDict.SetString("CFBundleURLName", "tencentvideo");urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes");urlScheme.AddString("tencentvideo" + DeploySettings.Instance.QqAppId);urlTypeDict = urlArray.AddDict();urlTypeDict.SetString("CFBundleTypeRole", "Editor");urlTypeDict.SetString("CFBundleURLName", "QQ");urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes");urlScheme.AddString(DeploySettings.Instance.QqScheme);urlTypeDict = urlArray.AddDict();urlTypeDict.SetString("CFBundleTypeRole", "Editor");urlTypeDict.SetString("CFBundleURLName", "QQLaunch");urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes");urlScheme.AddString("tencentlaunch" + DeploySettings.Instance.QqAppId);rootDict.SetString("CHANNEL_DENGTA", "***");rootDict.SetString("MSDK_OfferId", DeploySettings.Instance.IOSOfferId);rootDict.SetString("MSDK_ENV", ConfigSettings.Instance.MsdkUrlEnv);rootDict.SetString("QQAppID", DeploySettings.Instance.QqAppId);rootDict.SetString("WXAppID", DeploySettings.Instance.WxAppId);rootDict.SetString("MSDKKey", DeploySettings.Instance.MsdkKey);rootDict.SetBoolean("MSDK_PUSH_SWITCH", true);rootDict.SetBoolean("AutoRefreshToken", true);rootDict.SetBoolean("NeedNotice", true);rootDict.SetInteger("NoticeTime", 900);rootDict.SetInteger("MSDK_REAL_NAME_AUTH_SWITCH", 1);rootDict.SetBoolean("MSDK_Webview_Landscape_NavBar_Hideable", false);rootDict.SetBoolean("MSDK_Webview_Portrait_NavBar_Hideable", false);if (!rootDict.values.ContainsKey("LSApplicationQueriesSchemes"))urlArray = rootDict.CreateArray("LSApplicationQueriesSchemes");elseurlArray = rootDict.values["LSApplicationQueriesSchemes"].AsArray();urlArray.AddString("mqq");urlArray.AddString("mqqapi");urlArray.AddString("wtloginmqq2");urlArray.AddString("mqqopensdkapiV4");urlArray.AddString("mqqopensdkapiV3");urlArray.AddString("mqqopensdkapiV2");urlArray.AddString("mqqwpa");urlArray.AddString("mqqOpensdkSSoLogin");urlArray.AddString("mqqgamebindinggroup");urlArray.AddString("mqqopensdkfriend");urlArray.AddString("mqzone");urlArray.AddString("weixin");urlArray.AddString("wechat");rootDict.SetString("NSCameraUsageDescription", "");rootDict.SetString("NSPhotoLibraryUsageDescription", "");if (rootDict.values.ContainsKey("NSAppTransportSecurity"))rootDict.values.Remove("NSAppTransportSecurity");PlistElementDict urlDict = rootDict.CreateDict("NSAppTransportSecurity");urlDict.SetBoolean("NSAllowsArbitraryLoads", true);}
#endif
}

这边需要记一下other linker flages参数中-all_load这个参数,坑了我一天,因为米大师Demo中有这个参数,我也用上了,然后各种duplicate symbol错误,刚开始还以为是安全SDK的问题,因为接完安全SDK后就没有打iOS工程,导致我把米大师和安全SDK全删了,发现还有这个错误,对比了各种配置文件,才找到问题所在。

参考:

配置Xcode工程

PBXProject.AddFile Code Examples

[Unity]腾讯SDK踩坑之路(2)--配置Xcode工程(MSDK和米大师配置代码冲突)相关推荐

  1. [Unity]腾讯SDK踩坑之路(4)--GCloud+GVoice坑

    为啥要接GCloud呢?因为我们项目采用的方式有问题,这是腾讯专家说的,然后只能改了.先说下我们这边的方式,客户端是请求PHP后台生成的一个txt文件(Json格式的),然后获取CDN和区服相关信息, ...

  2. [Unity]腾讯SDK踩坑之路(5)--应用宝省流量更新+米大师托管模式坑

    之前项目平台没有定好是大厂独代模式,所以在大厂提出省流量更新问题的时候,大厂给的建议是用大厂自家的应用宝省流量更新功能,说是项目组自己去写这个功能的话,需要的时间估计会有点超过预期,想了一下,也对,对 ...

  3. mybatis mapper.xml dtd_全栈开发踩坑之路4-用MyBatis实现服务

    1.前言 上一篇文章介绍了如何设计后端的Mysql数据库:Alex Wang:全栈开发踩坑之路3-MySql数据库设计,本文介绍如何用MyBatis实现后端服务. 本后端项目的Github地址(撰写中 ...

  4. jmeter 3版本到5版本踩坑之路

    jmeter 3-5版本升级踩坑路 新版本下载安装 踩坑之路 新版本下载安装 下载新版本软件 ,链接: https://jmeter.apache.org/download_jmeter.cgi: 配 ...

  5. 高德定位SDK踩坑-高精度模式下获取不到GPS定位(无网络环境)

    高德定位SDK踩坑-高精度模式下获取不到GPS定位(无网络环境) 关键字:定位模式 高精度模式 GPS定位 无网络 一句话描述问题:高精度模式在断网环境下不可靠.有几率重复报错或使用缓存定位,不使用G ...

  6. 微信小程序实现大转盘抽奖----踩坑之路

    微信小程序实现大转盘抽奖----踩坑之路 需求:现在有一个小程序抽奖页面如下,此类抽奖方式为大转盘 思路:由服务端获取抽奖次数和奖品,根据服务端的中奖概率来决定是否中奖,最后利用小程序动画将转盘转起来 ...

  7. 海康摄像机sdk踩坑记述

    本文主要基于HKNetSDK6.1.6.4和HKNetSDK6.1.9.4.叙述一些sdk文档中叙述不清晰的地方以及容易被忽略的地方.后续会不断更新添加更多问题. 1.语音转发功能 如果想要获取语音, ...

  8. contentprovider踩坑之路之Failed to find provider info for com.example.app.provider和cursor=null空指针问题

    目录 bug1.Failed to find provider info for com.example.app.provider bug2:cursor=null bug1.Failed to fi ...

  9. 2021-11-01 富文本编辑器Vue-Quill-Editor 踩坑之路

    Vue-Quill-Editor 基于 Quill.适用于 Vue 的富文本编辑器,支持服务端渲染和单页应用. 相对于ssr,spa是通过component进行工作 ssr和spa的区别 1 踩坑之路 ...

最新文章

  1. 看 nova-scheduler 如何选择计算节点 - 每天5分钟玩转 OpenStack(27)
  2. 渗透知识-SQL注入
  3. 让C/C++程序员告诉你什么叫浪漫,表白黑科技
  4. Py之portalocker:portalocker的简介、安装、使用方法之详细攻略
  5. 第二阶段冲刺第四天(6月3号)
  6. revo uninstaller pro 序列号_iPhone12/pro已下架,在天猫
  7. 研究表明:满面笑容者,最有可能写出有影响力的论文!
  8. 互站卖的分发美化版可以封装双端APP
  9. poj 1182 食物链(高级的带权并查集)
  10. sql日期大于某天_(十五)sql/Linux 小技巧
  11. addeventlistener 清除_科普100秒 | 吃花生能软化血管、清除垃圾?
  12. 线段树(updata+query)
  13. 解决:PHP Deprecated: Comments starting with '#' are deprecated in ……
  14. Oracle 在SQL语句中如何获取系统当前时间并进行操作
  15. hp打印机没有右键扫描_win7右键点击打印机图标没有扫描选项怎么解决
  16. 教你解决微信跳转appstore的困扰
  17. 题目内容: 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si 注意,每个字的拼音之间有一
  18. 基于PyQt的分组工具
  19. C3P Cast-Designer 是可以直接设计量产方案的工具,不只是模拟
  20. [DB][mysql]下出现 java.sql.SQLException: Incorrect string value: '\xF4\x80\x8E\xAE\xE8\x83...'

热门文章

  1. 佛家经典禅语语录句子
  2. InnoDB log file 设置多大合适?
  3. 【Python技巧】(虚拟环境报错、pycharm)无法加载文件 ...\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。
  4. mser python车牌识别_基于MSER与SVM算法的车牌定位识别方法
  5. 在台式电脑上完美安装Mac OS X操作系统的解决方案
  6. 培训机构要不要去?适合谁去
  7. AppWidget(桌面小部件)
  8. 2022年全球市场液相色谱仪器总体规模、主要生产商、主要地区、产品和应用细分研究报告
  9. linux备忘录课程设计,linux备忘录
  10. 【STM32】窗口看门狗程序