First Version of Tuyoo SDK Package
This commit is contained in:
commit
1feb0fbd3d
106
.gitignore
vendored
Normal file
106
.gitignore
vendored
Normal file
@ -0,0 +1,106 @@
|
||||
# This .gitignore file should be placed at the root of your Unity project directory
|
||||
#
|
||||
# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
|
||||
#
|
||||
.utmp/
|
||||
/[Ll]ibrary/
|
||||
/[Tt]emp/
|
||||
/[Oo]bj/
|
||||
/[Bb]uild/
|
||||
/[Bb]uilds/
|
||||
/[Ll]ogs/
|
||||
/[Uu]ser[Ss]ettings/
|
||||
*.log
|
||||
|
||||
# By default unity supports Blender asset imports, *.blend1 blender files do not need to be commited to version control.
|
||||
*.blend1
|
||||
*.blend1.meta
|
||||
|
||||
# MemoryCaptures can get excessive in size.
|
||||
# They also could contain extremely sensitive data
|
||||
/[Mm]emoryCaptures/
|
||||
|
||||
# Recordings can get excessive in size
|
||||
/[Rr]ecordings/
|
||||
|
||||
# Uncomment this line if you wish to ignore the asset store tools plugin
|
||||
# /[Aa]ssets/AssetStoreTools*
|
||||
|
||||
# Autogenerated Jetbrains Rider plugin
|
||||
/[Aa]ssets/Plugins/Editor/JetBrains*
|
||||
# Jetbrains Rider personal-layer settings
|
||||
*.DotSettings.user
|
||||
|
||||
# Visual Studio cache directory
|
||||
.vs/
|
||||
|
||||
# Gradle cache directory
|
||||
.gradle/
|
||||
|
||||
# Autogenerated VS/MD/Consulo solution and project files
|
||||
ExportedObj/
|
||||
.consulo/
|
||||
*.csproj
|
||||
*.unityproj
|
||||
*.sln
|
||||
*.suo
|
||||
*.tmp
|
||||
*.user
|
||||
*.userprefs
|
||||
*.pidb
|
||||
*.booproj
|
||||
*.svd
|
||||
*.pdb
|
||||
*.mdb
|
||||
*.opendb
|
||||
*.VC.db
|
||||
|
||||
# Unity3D generated meta files
|
||||
*.pidb.meta
|
||||
*.pdb.meta
|
||||
*.mdb.meta
|
||||
|
||||
# Unity3D generated file on crash reports
|
||||
sysinfo.txt
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Builds
|
||||
*.apk
|
||||
*.aab
|
||||
*.unitypackage
|
||||
*.unitypackage.meta
|
||||
|
||||
# Crashlytics generated file
|
||||
crashlytics-build.properties
|
||||
|
||||
# TestRunner generated files
|
||||
InitTestScene*.unity*
|
||||
|
||||
# Addressables default ignores, before user customizations
|
||||
/ServerData
|
||||
/[Aa]ssets/StreamingAssets/aa*
|
||||
/[Aa]ssets/AddressableAssetsData/link.xml*
|
||||
/[Aa]ssets/Addressables_Temp*
|
||||
# By default, Addressables content builds will generate addressables_content_state.bin
|
||||
# files in platform-specific subfolders, for example:
|
||||
# /Assets/AddressableAssetsData/OSX/addressables_content_state.bin
|
||||
/[Aa]ssets/AddressableAssetsData/*/*.bin*
|
||||
|
||||
# Visual Scripting auto-generated files
|
||||
/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db
|
||||
/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db.meta
|
||||
/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers
|
||||
/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers.meta
|
||||
|
||||
# Auto-generated scenes by play mode tests
|
||||
/[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity*
|
||||
|
||||
.vsconfig
|
||||
|
||||
Logs/
|
||||
[Aa]ssets/
|
||||
[Pp]ublish/
|
||||
.vscode/settings.json
|
||||
*.dat
|
||||
8
Packages/com.bywaystudios.tuyoosdk/Editor.meta
Normal file
8
Packages/com.bywaystudios.tuyoosdk/Editor.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3c8e031ae3a7e0e4d8856244a1c6a5e4
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Packages/com.bywaystudios.tuyoosdk/Editor/Android.meta
Normal file
8
Packages/com.bywaystudios.tuyoosdk/Editor/Android.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1d566609b714d40508c148b67774735c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<!-- This module was also published with a richer model, Gradle metadata, -->
|
||||
<!-- which should be used instead. Do not delete the following line which -->
|
||||
<!-- is to indicate to Gradle or any Gradle module metadata file consumer -->
|
||||
<!-- that they should prefer consuming it instead. -->
|
||||
<!-- do_not_remove: published-with-gradle-metadata -->
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>growsdk-gasdk</artifactId>
|
||||
<version>2.4.24_0711-RELEASE</version>
|
||||
<packaging>aar</packaging>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component.login</groupId>
|
||||
<artifactId>framework-common</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.8.6</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.okio</groupId>
|
||||
<artifactId>okio</artifactId>
|
||||
<version>1.15.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>3.12.13</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.retrofit2</groupId>
|
||||
<artifactId>retrofit</artifactId>
|
||||
<version>2.3.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.retrofit2</groupId>
|
||||
<artifactId>converter-gson</artifactId>
|
||||
<version>2.2.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.retrofit2</groupId>
|
||||
<artifactId>adapter-rxjava</artifactId>
|
||||
<version>2.1.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.reactivex</groupId>
|
||||
<artifactId>rxandroid</artifactId>
|
||||
<version>1.2.1</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.reactivex</groupId>
|
||||
<artifactId>rxjava</artifactId>
|
||||
<version>1.1.9</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>growsdk-gasdk</artifactId>
|
||||
<version>2.4.24_0711-RELEASE</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component.login</groupId>
|
||||
<artifactId>framework-oversea</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component.login</groupId>
|
||||
<artifactId>framework-common</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component.login.third</groupId>
|
||||
<artifactId>appsflyer</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.appsflyer</groupId>
|
||||
<artifactId>af-android-sdk</artifactId>
|
||||
<version>6.12.5</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.android.installreferrer</groupId>
|
||||
<artifactId>installreferrer</artifactId>
|
||||
<version>2.2</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.miui.referrer</groupId>
|
||||
<artifactId>homereferrer</artifactId>
|
||||
<version>1.0.0.6</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>androidx.core</groupId>
|
||||
<artifactId>core</artifactId>
|
||||
<version>1.3.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component.login.third</groupId>
|
||||
<artifactId>hwFacebook</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component.login</groupId>
|
||||
<artifactId>framework-oversea</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.facebook.android</groupId>
|
||||
<artifactId>facebook-android-sdk</artifactId>
|
||||
<version>16.2.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component.login.third</groupId>
|
||||
<artifactId>hwGoogle</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component.login</groupId>
|
||||
<artifactId>framework-oversea</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>androidx.credentials</groupId>
|
||||
<artifactId>credentials</artifactId>
|
||||
<version>1.5.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>androidx.credentials</groupId>
|
||||
<artifactId>credentials-play-services-auth</artifactId>
|
||||
<version>1.5.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.android.libraries.identity.googleid</groupId>
|
||||
<artifactId>googleid</artifactId>
|
||||
<version>1.1.1</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.android.gms</groupId>
|
||||
<artifactId>play-services-auth</artifactId>
|
||||
<version>21.4.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component.login.third</groupId>
|
||||
<artifactId>hwGooglePlay</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component.login</groupId>
|
||||
<artifactId>framework-oversea</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component.login</groupId>
|
||||
<artifactId>framework-common</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.android.billingclient</groupId>
|
||||
<artifactId>billing</artifactId>
|
||||
<version>7.1.1</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component.login.third</groupId>
|
||||
<artifactId>hwGuest</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component.login</groupId>
|
||||
<artifactId>framework-oversea</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>sdk_inter_layer</artifactId>
|
||||
<version>0.6.1</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies/>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>sdk_inter_layer_ga</artifactId>
|
||||
<version>0.6.1</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>sdk_inter_layer</artifactId>
|
||||
<version>0.6.1</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>growsdk-gasdk</artifactId>
|
||||
<version>2.4.23_0618-RELEASE</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>sdk_inter_layer_login</artifactId>
|
||||
<version>0.6.1</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>sdk_inter_layer</artifactId>
|
||||
<version>0.6.1</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component.login</groupId>
|
||||
<artifactId>framework-common</artifactId>
|
||||
<version>0.2.0</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>sdk_inter_layer_unity</artifactId>
|
||||
<version>0.4.7</version>
|
||||
<packaging>aar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>sdk_inter_layer</artifactId>
|
||||
<version>0.6.1</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.tuyoo.component</groupId>
|
||||
<artifactId>sdk_inter_layer_ga</artifactId>
|
||||
<version>0.6.1</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.8.6</version>
|
||||
<scope>implementation</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
Binary file not shown.
@ -0,0 +1,69 @@
|
||||
{
|
||||
"formatVersion": "1.1",
|
||||
"component": {
|
||||
"group": "com.tuyoo.sdk_plugin",
|
||||
"module": "com.tuyoo.sdk_plugin.gradle.plugin",
|
||||
"version": "1.7.5.2",
|
||||
"attributes": {
|
||||
"org.gradle.status": "release"
|
||||
}
|
||||
},
|
||||
"createdBy": {
|
||||
"gradle": {
|
||||
"version": "8.5"
|
||||
}
|
||||
},
|
||||
"variants": [
|
||||
{
|
||||
"name": "apiElements",
|
||||
"attributes": {
|
||||
"org.gradle.category": "library",
|
||||
"org.gradle.dependency.bundling": "external",
|
||||
"org.gradle.jvm.version": 8,
|
||||
"org.gradle.libraryelements": "jar",
|
||||
"org.gradle.usage": "java-api"
|
||||
},
|
||||
"files": [
|
||||
{
|
||||
"name": "com.tuyoo.sdk_plugin.gradle.plugin-1.7.5.2.jar",
|
||||
"url": "com.tuyoo.sdk_plugin.gradle.plugin-1.7.5.2.jar",
|
||||
"size": 359887,
|
||||
"sha512": "b116df2f58b39cc7716238591bd0f7cd1cdfe2687b295917ae3332fbc8e5803b4252b7208bcbd65ec18fde2a1eff0f030f7265461c2c71cd7458ea82e081ca3e",
|
||||
"sha256": "915293c3374fde81aecc6d63a88c986e0cc72e2263e38142f872dd69920f4504",
|
||||
"sha1": "699288cce58dc3b79981eab728163af63ae73448",
|
||||
"md5": "4683dece9f7fcbe1fd4ac02c984708d5"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "runtimeElements",
|
||||
"attributes": {
|
||||
"org.gradle.category": "library",
|
||||
"org.gradle.dependency.bundling": "external",
|
||||
"org.gradle.jvm.version": 8,
|
||||
"org.gradle.libraryelements": "jar",
|
||||
"org.gradle.usage": "java-runtime"
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"group": "com.google.code.gson",
|
||||
"module": "gson",
|
||||
"version": {
|
||||
"requires": "2.8.9"
|
||||
}
|
||||
}
|
||||
],
|
||||
"files": [
|
||||
{
|
||||
"name": "com.tuyoo.sdk_plugin.gradle.plugin-1.7.5.2.jar",
|
||||
"url": "com.tuyoo.sdk_plugin.gradle.plugin-1.7.5.2.jar",
|
||||
"size": 359887,
|
||||
"sha512": "b116df2f58b39cc7716238591bd0f7cd1cdfe2687b295917ae3332fbc8e5803b4252b7208bcbd65ec18fde2a1eff0f030f7265461c2c71cd7458ea82e081ca3e",
|
||||
"sha256": "915293c3374fde81aecc6d63a88c986e0cc72e2263e38142f872dd69920f4504",
|
||||
"sha1": "699288cce58dc3b79981eab728163af63ae73448",
|
||||
"md5": "4683dece9f7fcbe1fd4ac02c984708d5"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<!-- This module was also published with a richer model, Gradle metadata, -->
|
||||
<!-- which should be used instead. Do not delete the following line which -->
|
||||
<!-- is to indicate to Gradle or any Gradle module metadata file consumer -->
|
||||
<!-- that they should prefer consuming it instead. -->
|
||||
<!-- do_not_remove: published-with-gradle-metadata -->
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tuyoo.sdk_plugin</groupId>
|
||||
<artifactId>com.tuyoo.sdk_plugin.gradle.plugin</artifactId>
|
||||
<version>1.7.5.2</version>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.8.9</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@ -0,0 +1,77 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using UnityEngine;
|
||||
|
||||
class BuildGradleProcessor
|
||||
{
|
||||
private string launcherBuildGradle;
|
||||
private string unityLibraryBuildGradle;
|
||||
private string rootBuildGradle;
|
||||
private string rootProjectPath;
|
||||
private string settings;
|
||||
|
||||
public BuildGradleProcessor(string rootProjectPath)
|
||||
{
|
||||
this.rootProjectPath = rootProjectPath;
|
||||
this.launcherBuildGradle = Path.Combine(rootProjectPath, "launcher/build.gradle");
|
||||
this.unityLibraryBuildGradle = Path.Combine(rootProjectPath, "unityLibrary/build.gradle");
|
||||
this.rootBuildGradle = Path.Combine(rootProjectPath, "build.gradle");
|
||||
this.settings = Path.Combine(rootProjectPath, "settings.gradle");
|
||||
Debug.Log("BuildGradleProcessor, rootProjectPath:" + rootProjectPath + "\n,launcherBuildGradle:"
|
||||
+ launcherBuildGradle + "\n,unityLibraryBuildGradle:" + unityLibraryBuildGradle + "\n,settings:" + settings);
|
||||
}
|
||||
|
||||
public static string GetAGPVersion(string rootBuildGradle)
|
||||
{
|
||||
if (!File.Exists(rootBuildGradle))
|
||||
{
|
||||
Debug.LogError("build.gradle 文件不存在: " + rootBuildGradle);
|
||||
return null;
|
||||
}
|
||||
|
||||
string buildGradleContent = File.ReadAllText(rootBuildGradle);
|
||||
string agpVersion = null;
|
||||
|
||||
// 尝试匹配 id 'com.android.application' version 'x.y.z'
|
||||
Match idVersionMatch = Regex.Match(buildGradleContent, @"id\s+['""]com\.android\.application['""]\s+version\s+['""](\d+\.\d+\.\d+)['""]");
|
||||
if (idVersionMatch.Success)
|
||||
{
|
||||
agpVersion = idVersionMatch.Groups[1].Value;
|
||||
Debug.Log("AGP Version from id version: " + agpVersion);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果 id version 未匹配,尝试匹配 classpath 'com.android.tools.build:gradle:x.y.z'
|
||||
Match classpathMatch = Regex.Match(buildGradleContent, @"classpath\s+['""]com\.android\.tools\.build:gradle:(\d+\.\d+\.\d+)['""]");
|
||||
if (classpathMatch.Success)
|
||||
{
|
||||
agpVersion = classpathMatch.Groups[1].Value;
|
||||
Debug.Log("AGP Version from classpath: " + agpVersion);
|
||||
}
|
||||
}
|
||||
if (agpVersion == null)
|
||||
{
|
||||
Debug.LogError("AGP Version not found in build.gradle");
|
||||
}
|
||||
|
||||
return agpVersion;
|
||||
}
|
||||
|
||||
public void process()
|
||||
{
|
||||
|
||||
string agpVersion = GetAGPVersion(rootBuildGradle);
|
||||
Debug.Log("process, agpVersion:" + agpVersion);
|
||||
|
||||
if (agpVersion.StartsWith("7.") || agpVersion.StartsWith("8."))
|
||||
{
|
||||
(new BuildGradleProcessor7x(rootProjectPath)).process();
|
||||
}
|
||||
else
|
||||
{
|
||||
(new BuildGradleProcessor4x(rootProjectPath)).process();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: feb747b7ceeb74a1393d78b94baccd48
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,155 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using UnityEngine;
|
||||
|
||||
class BuildGradleProcessor4x
|
||||
{
|
||||
private string launcherBuildGradle;
|
||||
private string unityLibraryBuildGradle;
|
||||
private string rootBuildGradle;
|
||||
|
||||
public BuildGradleProcessor4x(string rootProjectPath)
|
||||
{
|
||||
this.launcherBuildGradle = Path.Combine(rootProjectPath, "launcher/build.gradle");
|
||||
this.unityLibraryBuildGradle = Path.Combine(rootProjectPath, "unityLibrary/build.gradle");
|
||||
this.rootBuildGradle = Path.Combine(rootProjectPath, "build.gradle");
|
||||
Debug.Log("BuildGradleProcessor, rootProjectPath:" + rootProjectPath + "\n,launcherBuildGradle:"
|
||||
+ launcherBuildGradle + "\n,unityLibraryBuildGradle:" + unityLibraryBuildGradle);
|
||||
}
|
||||
|
||||
public void process()
|
||||
{
|
||||
Debug.Log("BuildGradleProcessor4x, process start....");
|
||||
//1. 添加maven仓库
|
||||
processMaven();
|
||||
|
||||
//3. 添加插件 ,apply + classpath + json文件 + 打包设置
|
||||
processPlugin();
|
||||
Debug.Log("BuildGradleProcessor4x, process end....");
|
||||
}
|
||||
|
||||
private void processMaven()
|
||||
{
|
||||
string buildGradleContent = File.ReadAllText(rootBuildGradle);
|
||||
List<string> pluginMaven = new List<string>();
|
||||
buildGradleContent = insertMaven(pluginMaven, buildGradleContent);
|
||||
pluginMaven.Add("http://sdkck.tuyoo.com/artifactory/tuyoo-component/");
|
||||
pluginMaven.Add("https://jcenter.bintray.com/");
|
||||
// pluginMaven.Add("http://sdkck.tuyoo.com/artifactory/tuyoo-component-test/");
|
||||
pluginMaven.Add("https://developer.huawei.com/repo/");
|
||||
buildGradleContent = insertMaven(pluginMaven, buildGradleContent);
|
||||
|
||||
// 保存修改后的内容回文件
|
||||
File.WriteAllText(rootBuildGradle, buildGradleContent);
|
||||
}
|
||||
|
||||
private string insertMaven(List<string> maven, string buildGradleContent)
|
||||
{
|
||||
if (maven == null)
|
||||
{
|
||||
return buildGradleContent;
|
||||
}
|
||||
// 添加自定义的 Maven 仓库
|
||||
foreach (string url in maven)
|
||||
{
|
||||
if (!buildGradleContent.Contains(url))
|
||||
{
|
||||
string mavenRepository = buildMavenString(url);
|
||||
Debug.Log("mavenRepository: " + mavenRepository);
|
||||
|
||||
// 在 repositories 块中添加自定义仓库
|
||||
buildGradleContent = buildGradleContent.Replace("repositories {", $"repositories {{\n{mavenRepository}");
|
||||
}
|
||||
}
|
||||
|
||||
return buildGradleContent;
|
||||
}
|
||||
|
||||
string buildMavenString(string url)
|
||||
{
|
||||
string mavenString = "";
|
||||
mavenString += $@"
|
||||
maven {{
|
||||
allowInsecureProtocol = true
|
||||
url '{url}'
|
||||
}}";
|
||||
return mavenString;
|
||||
}
|
||||
|
||||
|
||||
private void processPlugin()
|
||||
{
|
||||
//root build gradle 处理
|
||||
string rootBuildGradleContent = File.ReadAllText(rootBuildGradle);
|
||||
if (!rootBuildGradleContent.Contains("com.tuyoo.sdk_plugin"))
|
||||
{
|
||||
rootBuildGradleContent = rootBuildGradleContent.Replace("dependencies {", @"dependencies {
|
||||
classpath 'com.tuyoo.sdk_plugin:com.tuyoo.sdk_plugin.gradle.plugin:1.7.5.2'");
|
||||
File.WriteAllText(rootBuildGradle, rootBuildGradleContent);
|
||||
}
|
||||
|
||||
//launcher build gradle 处理
|
||||
string launcherBuildGradleContent = File.ReadAllText(launcherBuildGradle);
|
||||
// 正则表达式:匹配 #START1 到 #END1 之间的所有内容(包括换行)
|
||||
string pattern = @"//START1[\s\S]*?//END1";
|
||||
// string replaceMent = @"import groovy.json.JsonSlurper
|
||||
// // File tyConfigFileDir = project.rootProject.file('config')
|
||||
// // File tyConfigFile = new File(tyConfigFileDir,'build.json')
|
||||
// // // 使用 JsonSlurper 解析 JSON
|
||||
// // def jsonSlurper = new JsonSlurper()
|
||||
// // def jsonObject = jsonSlurper.parseText(tyConfigFile.text)
|
||||
// buildscript {
|
||||
// repositories {
|
||||
// google {
|
||||
// content {
|
||||
// includeGroupByRegex(""com\\.android.*"")
|
||||
// includeGroupByRegex(""com\\.google.*"")
|
||||
// includeGroupByRegex(""androidx.*"")
|
||||
// }
|
||||
// }
|
||||
// mavenCentral()
|
||||
// gradlePluginPortal()
|
||||
|
||||
// // 配置HMS Core SDK的Maven仓地址。
|
||||
// maven { url 'https://developer.huawei.com/repo/' }
|
||||
// }
|
||||
// dependencies {
|
||||
// // 增加Android Gradle插件版本号配置,{version}为实际的Gradle插件版本号,例如7.1.1。
|
||||
// // 增加AGC插件配置,请您参见AGC插件依赖关系选择合适的AGC插件版本。
|
||||
// classpath 'com.huawei.agconnect:agcp:1.9.0.300'
|
||||
|
||||
// // 增加Android Gradle插件版本号配置,{version}为实际的Gradle插件版本号,例如7.1.1。
|
||||
// classpath 'com.android.tools.build:gradle:7.4.2'
|
||||
// }
|
||||
// }
|
||||
// apply plugin: 'com.tuyoo.sdk_plugin'";
|
||||
string replaceMent = @"
|
||||
apply plugin: 'com.tuyoo.sdk_plugin'";
|
||||
string insertContent = $"//START1\n{replaceMent}\n//END1";
|
||||
// 执行替换
|
||||
string tmp = Regex.Replace(launcherBuildGradleContent, pattern, insertContent);
|
||||
if (tmp.Equals(launcherBuildGradleContent))
|
||||
{
|
||||
if (!tmp.Contains("apply plugin: 'com.tuyoo.sdk_plugin'"))
|
||||
{
|
||||
launcherBuildGradleContent = launcherBuildGradleContent + "\n" + insertContent;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
launcherBuildGradleContent = tmp;
|
||||
}
|
||||
File.WriteAllText(launcherBuildGradle, launcherBuildGradleContent);
|
||||
|
||||
//unity build gradle 处理
|
||||
string unityBuildGradleContent = File.ReadAllText(unityLibraryBuildGradle);
|
||||
if (!unityBuildGradleContent.Contains("apply plugin: 'com.tuyoo.sdk_plugin'"))
|
||||
{
|
||||
unityBuildGradleContent = unityBuildGradleContent + "\n" + "apply plugin: 'com.tuyoo.sdk_plugin'";
|
||||
File.WriteAllText(unityLibraryBuildGradle, unityBuildGradleContent);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9e0134cd3b6c846b1b6f23f3a516680f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,133 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
class BuildGradleProcessor7x
|
||||
{
|
||||
private string launcherBuildGradle;
|
||||
private string unityLibraryBuildGradle;
|
||||
private string rootBuildGradle;
|
||||
private string settings;
|
||||
|
||||
public BuildGradleProcessor7x(string rootProjectPath)
|
||||
{
|
||||
this.launcherBuildGradle = Path.Combine(rootProjectPath, "launcher/build.gradle");
|
||||
this.unityLibraryBuildGradle = Path.Combine(rootProjectPath, "unityLibrary/build.gradle");
|
||||
this.rootBuildGradle = Path.Combine(rootProjectPath, "build.gradle");
|
||||
this.settings = Path.Combine(rootProjectPath, "settings.gradle");
|
||||
Debug.Log("BuildGradleProcessor, rootProjectPath:" + rootProjectPath + "\n,launcherBuildGradle:"
|
||||
+ launcherBuildGradle + "\n,unityLibraryBuildGradle:" + unityLibraryBuildGradle + "\n,settings:" + settings);
|
||||
}
|
||||
|
||||
public void process()
|
||||
{
|
||||
//1. 添加maven仓库
|
||||
processMaven();
|
||||
|
||||
//3. 添加插件 ,apply + classpath + json文件 + 打包设置
|
||||
processPlugin();
|
||||
}
|
||||
|
||||
private void processMaven()
|
||||
{
|
||||
string buildGradleContent = File.ReadAllText(settings);
|
||||
List<string> pluginMaven = new List<string>();
|
||||
buildGradleContent = insertMaven(pluginMaven, buildGradleContent);
|
||||
//pluginMaven.Add("http://sdkck.tuyoo.com/artifactory/tuyoo-component/");
|
||||
pluginMaven.Add("file:///" + FileUtil.GetPhysicalPath("Packages/com.bywaystudios.tuyoosdk/Editor/Android") + "/.m2/repository");
|
||||
pluginMaven.Add("https://jcenter.bintray.com/");
|
||||
// pluginMaven.Add("http://sdkck.tuyoo.com/artifactory/tuyoo-component-test/");
|
||||
pluginMaven.Add("https://developer.huawei.com/repo/");
|
||||
buildGradleContent = insertMaven(pluginMaven, buildGradleContent);
|
||||
// 保存修改后的内容回文件
|
||||
File.WriteAllText(settings, buildGradleContent);
|
||||
}
|
||||
|
||||
private string insertMaven(List<string> maven, string buildGradleContent)
|
||||
{
|
||||
if (maven == null)
|
||||
{
|
||||
return buildGradleContent;
|
||||
}
|
||||
// 添加自定义的 Maven 仓库
|
||||
foreach (string url in maven)
|
||||
{
|
||||
if (!buildGradleContent.Contains(url))
|
||||
{
|
||||
string mavenRepository = buildMavenString(url);
|
||||
Debug.Log("mavenRepository: " + mavenRepository);
|
||||
|
||||
// 在 repositories 块中添加自定义仓库
|
||||
buildGradleContent = buildGradleContent.Replace("repositories {", $"repositories {{\n{mavenRepository}");
|
||||
}
|
||||
}
|
||||
|
||||
return buildGradleContent;
|
||||
}
|
||||
|
||||
string buildMavenString(string url)
|
||||
{
|
||||
string mavenString = "";
|
||||
mavenString += $@"
|
||||
maven {{
|
||||
allowInsecureProtocol = true
|
||||
url '{url}'
|
||||
}}";
|
||||
return mavenString;
|
||||
}
|
||||
|
||||
|
||||
private void processPlugin()
|
||||
{
|
||||
string projectPluginVersion = "1.7.5.2";
|
||||
string firebasePluginVersion = "4.3.15"; // AGP 7.x 适合用4.3.15版本, AGP 8.x 适合用4.4.x版本
|
||||
string crashPluginVersion = "2.9.5"; //支持AGP8以下
|
||||
// string crashPluginVersion = "3.0.2"; //支持AGP8
|
||||
|
||||
//root build gradle 处理
|
||||
string rootBuildGradleContent = File.ReadAllText(rootBuildGradle);
|
||||
if (!rootBuildGradleContent.Contains("com.tuyoo.sdk_plugin"))
|
||||
{
|
||||
|
||||
rootBuildGradleContent = rootBuildGradleContent.Replace("plugins {", @"plugins {
|
||||
id 'com.tuyoo.sdk_plugin' version '" + projectPluginVersion + @"' apply false
|
||||
id 'com.google.gms.google-services' version '" + firebasePluginVersion + @"' apply false;
|
||||
id 'com.google.firebase.crashlytics' version '" + crashPluginVersion + @"' apply false");
|
||||
File.WriteAllText(rootBuildGradle, rootBuildGradleContent);
|
||||
}
|
||||
|
||||
//launcher build gradle 处理
|
||||
string launcherBuildGradleContent = File.ReadAllText(launcherBuildGradle);
|
||||
// 正则表达式:匹配 #START1 到 #END1 之间的所有内容(包括换行)
|
||||
string pattern = @"//START1[\s\S]*?//END1";
|
||||
string replaceMent = @"
|
||||
apply plugin: 'com.tuyoo.sdk_plugin'";
|
||||
string insertContent = $"//START1\n{replaceMent}\n//END1";
|
||||
// 执行替换
|
||||
string tmp = Regex.Replace(launcherBuildGradleContent, pattern, insertContent);
|
||||
if (tmp.Equals(launcherBuildGradleContent))
|
||||
{
|
||||
if (!tmp.Contains("apply plugin: 'com.tuyoo.sdk_plugin'"))
|
||||
{
|
||||
launcherBuildGradleContent = launcherBuildGradleContent + "\n" + insertContent;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
launcherBuildGradleContent = tmp;
|
||||
}
|
||||
File.WriteAllText(launcherBuildGradle, launcherBuildGradleContent);
|
||||
|
||||
//unity build gradle 处理
|
||||
string unityBuildGradleContent = File.ReadAllText(unityLibraryBuildGradle);
|
||||
if (!unityBuildGradleContent.Contains("apply plugin: 'com.tuyoo.sdk_plugin'"))
|
||||
{
|
||||
unityBuildGradleContent = unityBuildGradleContent + "\n" + "apply plugin: 'com.tuyoo.sdk_plugin'";
|
||||
File.WriteAllText(unityLibraryBuildGradle, unityBuildGradleContent);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e72cb856786c2404f988cc074d9f1734
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,257 @@
|
||||
using System.IO;
|
||||
using System.Xml;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using System.Text.RegularExpressions;
|
||||
using System;
|
||||
|
||||
#if UNITY_EDITOR && UNITY_ANDROID
|
||||
using UnityEngine;
|
||||
using UnityEditor.Android;
|
||||
|
||||
class TySdkProjectGenerator : IPostGenerateGradleAndroidProject
|
||||
{
|
||||
public int callbackOrder { get { return 0; } }
|
||||
|
||||
public static string sdkInUnityRootPath;
|
||||
public static string rootProjectPath;
|
||||
public static string assetsRootPath;
|
||||
|
||||
/**
|
||||
* 要做的事情:
|
||||
* 1. AndroidManifest修改
|
||||
1. activity \ applciatoin 修改
|
||||
2. 添加插件
|
||||
仓库、声明、脚本
|
||||
3. 拷贝json配置文件
|
||||
*
|
||||
**/
|
||||
public void OnPostGenerateGradleAndroidProject(string path)
|
||||
{
|
||||
Debug.Log("TySdkProjectGenerator.OnPostGenerateGradleAndroidProject at path " + path);
|
||||
rootProjectPath = Directory.GetParent(path).FullName;
|
||||
|
||||
//获取Assets根目录
|
||||
assetsRootPath = Application.dataPath;
|
||||
|
||||
//获取sdk在unity中的路径
|
||||
//var stackTrace = new System.Diagnostics.StackTrace(true);
|
||||
//var frame = stackTrace.GetFrame(0);
|
||||
//string filePath = frame.GetFileName();
|
||||
//sdkInUnityRootPath = Path.GetDirectoryName(filePath);
|
||||
sdkInUnityRootPath = FileUtil.GetPhysicalPath("Packages/com.bywaystudios.tuyoosdk/Editor/Android");
|
||||
Debug.Log("TySdkProjectGenerator.OnPostGenerateGradleAndroidProject sdkInUnityRootPath " + sdkInUnityRootPath);
|
||||
|
||||
//处理androidMnifest
|
||||
ManifestProcessor manifestProcessor = new ManifestProcessor(Path.Combine(path, "src/main/AndroidManifest.xml"));
|
||||
manifestProcessor.process();
|
||||
|
||||
//处理build.gradle
|
||||
BuildGradleProcessor buildGradleProcessor = new BuildGradleProcessor(rootProjectPath);
|
||||
buildGradleProcessor.process();
|
||||
|
||||
//拷贝json文件
|
||||
copyJsonFile();
|
||||
}
|
||||
|
||||
private void copyJsonFile()
|
||||
{
|
||||
Debug.Log("TySdkProjectGenerator.copyJsonFile start");
|
||||
//package gameConfig -> root/config/..
|
||||
CopyFile(Path.Combine(FileUtil.GetPhysicalPath("ProjectSettings/Packages/com.bywaystudios.tuyoosdk"), "gameconfig.json"), Path.Combine(rootProjectPath, "config", "gameconfig.json"));
|
||||
CopyFile(Path.Combine(FileUtil.GetPhysicalPath("ProjectSettings/Packages/com.bywaystudios.tuyoosdk"), "gameconfig.json"), Path.Combine(rootProjectPath, "launcher", "gameconfig.json"));
|
||||
//gameConfigs/.. -> root/config/..
|
||||
CopyFiles(Path.Combine(sdkInUnityRootPath, "gameConfigs"), Path.Combine(rootProjectPath, "config"));
|
||||
CopyFiles(Path.Combine(sdkInUnityRootPath, "gameConfigs"), Path.Combine(rootProjectPath, "launcher"));
|
||||
//兼容firebase crashlytics
|
||||
CopyFile(Path.Combine(FileUtil.GetPhysicalPath("ProjectSettings/Packages/com.bywaystudios.firebase"), "google-services.json"), Path.Combine(rootProjectPath, "launcher","google-services.json"));
|
||||
Debug.Log("TySdkProjectGenerator.copyJsonFile end");
|
||||
}
|
||||
|
||||
public static void CopyFile(string sourceFile, string destinationFile)
|
||||
{
|
||||
// 检查源文件是否存在
|
||||
if (!File.Exists(sourceFile))
|
||||
{
|
||||
Console.WriteLine("源文件不存在: " + sourceFile);
|
||||
return;
|
||||
}
|
||||
|
||||
// 创建目标文件夹(如果不存在)
|
||||
string destinationFolder = Path.GetDirectoryName(destinationFile);
|
||||
if (!Directory.Exists(destinationFolder))
|
||||
{
|
||||
Directory.CreateDirectory(destinationFolder);
|
||||
Console.WriteLine("目标文件夹已创建: " + destinationFolder);
|
||||
}
|
||||
|
||||
// 复制文件到目标路径
|
||||
File.Copy(sourceFile, destinationFile, true); // 允许覆盖
|
||||
Console.WriteLine("已复制文件: " + sourceFile + " 到 " + destinationFile);
|
||||
}
|
||||
|
||||
public static void CopyFiles(string sourceFolder, string destinationFolder)
|
||||
{
|
||||
// 检查源文件夹是否存在
|
||||
if (!Directory.Exists(sourceFolder))
|
||||
{
|
||||
Console.WriteLine("源文件夹不存在: " + sourceFolder);
|
||||
return;
|
||||
}
|
||||
|
||||
// 创建目标文件夹(如果不存在)
|
||||
if (!Directory.Exists(destinationFolder))
|
||||
{
|
||||
Directory.CreateDirectory(destinationFolder);
|
||||
Console.WriteLine("目标文件夹已创建: " + destinationFolder);
|
||||
}
|
||||
|
||||
// 获取源文件夹中的所有文件
|
||||
string[] files = Directory.GetFiles(sourceFolder);
|
||||
|
||||
// 复制每个文件到目标文件夹
|
||||
foreach (string file in files)
|
||||
{
|
||||
if (!file.EndsWith("json"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
string fileName = Path.GetFileName(file); // 获取文件名
|
||||
string destFile = Path.Combine(destinationFolder, fileName); // 组合目标文件路径
|
||||
File.Copy(file, destFile, true); // 复制文件,允许覆盖
|
||||
Console.WriteLine("已复制文件: " + file + " 到 " + destFile);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal class ManifestProcessor
|
||||
{
|
||||
|
||||
private string manifestPath;
|
||||
|
||||
public ManifestProcessor(string manifestPath)
|
||||
{
|
||||
Debug.Log("ManifestProcessor, manifestPath:" + manifestPath);
|
||||
this.manifestPath = manifestPath;
|
||||
}
|
||||
|
||||
|
||||
// 1. 处理Applicatioin
|
||||
// 2. 处理Activity
|
||||
public void process()
|
||||
{
|
||||
Debug.Log("ManifestProcessor, process start.");
|
||||
|
||||
if (!File.Exists(manifestPath))
|
||||
{
|
||||
Debug.LogError("manifestPath not exit!! manifestPath:" + manifestPath);
|
||||
return;
|
||||
}
|
||||
|
||||
// 加载AndroidManifest.xml文件
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
xmlDoc.Load(manifestPath);
|
||||
|
||||
// 定义 Android 命名空间
|
||||
string androidNamespaceURI = "http://schemas.android.com/apk/res/android";
|
||||
|
||||
// 获取<manifest>节点
|
||||
XmlNode manifestNode = xmlDoc.SelectSingleNode("/manifest");
|
||||
if (manifestNode == null)
|
||||
{
|
||||
Debug.LogError("manifestNode is NULL!!");
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取<application>节点
|
||||
XmlNode applicationNode = manifestNode.SelectSingleNode("application");
|
||||
if (applicationNode == null)
|
||||
{
|
||||
Debug.LogError("applicationNode is NULL!!");
|
||||
return;
|
||||
}
|
||||
|
||||
// 设置name属性
|
||||
XmlAttribute nameAttribute = applicationNode.Attributes["android:name"];
|
||||
var applicationName = "android.app.Application";
|
||||
if (nameAttribute == null || nameAttribute.Value.Equals(applicationName))
|
||||
{
|
||||
//默认application,修改成sdk的application
|
||||
Debug.Log("修改成SDK的application");
|
||||
// 修改已有的name属性
|
||||
if(nameAttribute == null){
|
||||
nameAttribute = xmlDoc.CreateAttribute("android:name", androidNamespaceURI);
|
||||
nameAttribute.Value = "com.tuyoo.sdk.Application";
|
||||
applicationNode.Attributes.Append(nameAttribute);
|
||||
}else{
|
||||
nameAttribute.Value = "com.tuyoo.sdk.Application";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//游戏自定义了application,不做处理了
|
||||
Debug.Log("游戏自定义了application,不做处理了,需要游戏自行处理sdk接口调用");
|
||||
}
|
||||
|
||||
// 复制sdk的application到游戏中。
|
||||
var tuyooJavaDir = Path.Combine(rootProjectPath, "unityLibrary/src/main/java/com/tuyoo/sdk");
|
||||
if (!Directory.Exists(tuyooJavaDir))
|
||||
{
|
||||
Directory.CreateDirectory(tuyooJavaDir);
|
||||
Console.WriteLine("文件夹创建成功: " + tuyooJavaDir);
|
||||
}
|
||||
//设置sdk的application继承游戏的applicaiton
|
||||
var sdkApplicationContent = File.ReadAllText(Path.Combine(sdkInUnityRootPath, "sdkConfigs", "Application.txt"));
|
||||
sdkApplicationContent = sdkApplicationContent.Replace(@"${0}", applicationName);
|
||||
File.WriteAllText(Path.Combine(tuyooJavaDir, "Application.java"), sdkApplicationContent);
|
||||
|
||||
|
||||
// 创建命名空间管理器,并添加命名空间
|
||||
XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
|
||||
nsManager.AddNamespace("android", androidNamespaceURI);
|
||||
|
||||
// 查找主Activity:包含<meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 的<activity>节点
|
||||
XmlNode mainActivity = xmlDoc.SelectSingleNode("/manifest/application/activity[meta-data[@android:name='unityplayer.UnityActivity' and @android:value='true']]", nsManager);
|
||||
|
||||
Debug.Log("mainActivity :" + mainActivity.Attributes["android:name"]);
|
||||
// 找到主Activity,修改android:name属性
|
||||
XmlAttribute nameAttribute1 = mainActivity.Attributes["android:name"];
|
||||
var activityName = "com.unity3d.player.UnityPlayerActivity";
|
||||
if (nameAttribute1 == null || nameAttribute1.Value.Equals(activityName))
|
||||
{
|
||||
Debug.Log("游戏使用的默认Activity,插件替换成SDK的Activity");
|
||||
if(nameAttribute1 == null){
|
||||
nameAttribute1 = xmlDoc.CreateAttribute("android", "name", androidNamespaceURI);
|
||||
nameAttribute1.Value = "com.tuyoo.sdk.Activity";
|
||||
mainActivity.Attributes.Append(nameAttribute1);
|
||||
}else{
|
||||
nameAttribute1.Value = "com.tuyoo.sdk.Activity";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("游戏自定义了MainActivity,因此插件不做处理,由游戏自行调用SDK声明周期接口");
|
||||
}
|
||||
|
||||
//将SDK的activity引入的游戏
|
||||
if (!Directory.Exists(tuyooJavaDir))
|
||||
{
|
||||
Directory.CreateDirectory(tuyooJavaDir);
|
||||
Console.WriteLine("文件夹创建成功: " + tuyooJavaDir);
|
||||
}
|
||||
//设置sdk的application继承游戏的applicaiton
|
||||
var sdkActivityContent = File.ReadAllText(Path.Combine(sdkInUnityRootPath, "sdkConfigs", "Activity.txt"));
|
||||
sdkActivityContent = sdkActivityContent.Replace(@"${0}", activityName);
|
||||
File.WriteAllText(Path.Combine(tuyooJavaDir, "Activity.java"), sdkActivityContent);
|
||||
|
||||
|
||||
// 保存修改后的AndroidManifest.xml文件
|
||||
xmlDoc.Save(manifestPath);
|
||||
UnityEngine.Debug.Log("AndroidManifest.xml 已修改,设置 application name 为 com.tuyoo.sdk.Application.");
|
||||
UnityEngine.Debug.Log("AndroidManifest.xml 已修改,设置主Activity为 com.tuyoo.sdk.Activity.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6237c5592c4b446e3ab1ed8570bf7920
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 69cd8b9b58430450f859954bc7dd1082
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
{
|
||||
"engine_sdk": "com.tuyoo.component:sdk_inter_layer_unity:0.4.7",
|
||||
"com.tuyoo.component:sdk_inter_layer_login": "com.tuyoo.component:sdk_inter_layer_login:0.6.1",
|
||||
"com.tuyoo.component:sdk_inter_layer_survey": "com.tuyoo.component:sdk_inter_layer_survey:0.6.1",
|
||||
"com.tuyoo.component:sdk_inter_layer_push": "com.tuyoo.component:sdk_inter_layer_survey:0.6.1",
|
||||
"com.tuyoo.component.login.third:alipayweb": "com.tuyoo.component.login.third:alipayweb:0.2.0",
|
||||
"com.tuyoo.component.login.third:quickLogin": "com.tuyoo.component.login.third:quickLogin:0.2.0"
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bda52be9838704740ab7e2dc94aa3c87
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4cd2e24681bc744368dcd5a6979a3e7a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,57 @@
|
||||
package com.tuyoo.sdk;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.tuyoo.sdk.sdk_inter_layer_unity.UnityInterface;
|
||||
|
||||
public class Activity extends ${0} {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
UnityInterface.onActivityCreate(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
UnityInterface.onActivityResume(this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
UnityInterface.onActivityStart(this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
UnityInterface.onActivityStop(this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
UnityInterface.onActivityPause(this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
UnityInterface.onResult(this, requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent) {
|
||||
super.onNewIntent(intent);
|
||||
UnityInterface.onNewIntent(this, intent);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a471b5ba113ff40d89068a6751b8f789
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,20 @@
|
||||
package com.tuyoo.sdk;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.tuyoo.sdk.sdk_inter_layer_unity.UnityInterface;
|
||||
|
||||
public class Application extends ${0} {
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
UnityInterface.onApplicationCreate(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void attachBaseContext(Context base) {
|
||||
super.attachBaseContext(base);
|
||||
UnityInterface.onAttachBaseContext(this, base);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eba7b7f816a5c4b90bc1ce1019b97ec2
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Packages/com.bywaystudios.tuyoosdk/Editor/WebGL.meta
Normal file
8
Packages/com.bywaystudios.tuyoosdk/Editor/WebGL.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7082721ea27c14ebab76f86ef86f8b3b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,105 @@
|
||||
using UnityEditor;
|
||||
using UnityEditor.Build;
|
||||
using UnityEditor.Build.Reporting;
|
||||
using System.IO;
|
||||
using UnityEngine;
|
||||
|
||||
public class TYPostProcessWeb : IPostprocessBuildWithReport
|
||||
{
|
||||
public int callbackOrder => int.MaxValue;
|
||||
private string buildPath;
|
||||
|
||||
// 导出完成后调用的方法
|
||||
public void OnPostprocessBuild(BuildReport report)
|
||||
{
|
||||
string platform = report.summary.platform.ToString();
|
||||
if (platform == "WebGL" || platform == "MiniGame")
|
||||
{
|
||||
buildPath = report.summary.outputPath;
|
||||
Debug.Log("channel compile buildPath: " + buildPath);
|
||||
CopyTyResouceFile();
|
||||
}
|
||||
}
|
||||
|
||||
private void CopyTyResouceFile()
|
||||
{
|
||||
string destinationDir = string.Empty;
|
||||
string sourceDir = string.Empty;
|
||||
string channelType = TYPreProcessWeb.GetBuildChannelType();
|
||||
Debug.Log("TYPostProcessWeb channelType: " + channelType);
|
||||
|
||||
if (channelType == TYWebBuildConfig.MiniGameChannelType.ALI)
|
||||
{
|
||||
// 阿里小游戏
|
||||
destinationDir = ProcessDestinationDir("alipay");
|
||||
if (!Directory.Exists(destinationDir))
|
||||
{
|
||||
destinationDir = ProcessDestinationDir("alipaygame");
|
||||
}
|
||||
sourceDir = ProcessSourceDir("aliminigame");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(destinationDir) && !string.IsNullOrEmpty(sourceDir))
|
||||
{
|
||||
Debug.Log("TYPostProcessWeb CopyTyResouceFile, sourceDir: " + sourceDir);
|
||||
Debug.Log("TYPostProcessWeb CopyTyResouceFile, destinationDir: " + destinationDir);
|
||||
CopyFilesToDirectory(sourceDir, destinationDir);
|
||||
} else {
|
||||
Debug.Log("TYPostProcessWeb CopyTyResouceFile, current channel dont need copy resource file.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private string ProcessDestinationDir(string finnalOutputPath)
|
||||
{
|
||||
return Path.Combine(Directory.GetParent(buildPath).FullName, finnalOutputPath);
|
||||
}
|
||||
|
||||
private string ProcessSourceDir(string ChannelResPath)
|
||||
{
|
||||
return Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, ChannelResPath);
|
||||
}
|
||||
|
||||
public static void CopyFilesToDirectory(string sourceDir, string destinationDir)
|
||||
{
|
||||
if (!Directory.Exists(destinationDir))
|
||||
{
|
||||
Debug.LogError("目标文件目录不存在");
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取源目录下的所有文件
|
||||
string[] files = Directory.GetFiles(sourceDir);
|
||||
|
||||
foreach (string file in files)
|
||||
{
|
||||
// 获取文件的文件名(不包含路径)
|
||||
string fileName = Path.GetFileName(file);
|
||||
|
||||
// 跳过以 .meta 结尾的文件
|
||||
if (fileName.EndsWith(".meta"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (fileName == "TyJsBridge.js")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 目标文件的完整路径
|
||||
string destFile = Path.Combine(destinationDir, fileName);
|
||||
|
||||
try
|
||||
{
|
||||
// 复制文件到目标目录(如果目标文件已经存在,覆盖它)
|
||||
File.Copy(file, destFile, true);
|
||||
Debug.Log($"File copied: {fileName}");
|
||||
}
|
||||
catch (System.Exception e)
|
||||
{
|
||||
Debug.Log($"Failed to copy file {fileName}: {e.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2c83ce3ffa42443eda040950dacbd36f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,432 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using EngineSdkConverter.Unity.Plugins.WebGL;
|
||||
using UnityEditor;
|
||||
using UnityEditor.Build;
|
||||
using UnityEditor.Build.Reporting;
|
||||
using UnityEngine;
|
||||
public class TYPreProcessWeb : IPreprocessBuildWithReport
|
||||
{
|
||||
// 定义回调的顺序
|
||||
public int callbackOrder => 0;
|
||||
private string configFilePath;
|
||||
private string configJsonString;
|
||||
private ConfigData configData;
|
||||
private static string channelType;
|
||||
|
||||
// 构建前的回调方法
|
||||
public void OnPreprocessBuild(BuildReport report)
|
||||
{
|
||||
string platform = report.summary.platform.ToString();
|
||||
if (platform == "WebGL" || platform == "MiniGame")
|
||||
{
|
||||
configFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_GAMECONFIG_DIR);
|
||||
configJsonString = File.ReadAllText(configFilePath);
|
||||
configData = JsonUtility.FromJson<ConfigData>(configJsonString);
|
||||
channelType = configData.tuyooParam.channelType;
|
||||
CopyTyConfigFile();
|
||||
CopyTyBridgeFile();
|
||||
if (channelType == TYWebBuildConfig.MiniGameChannelType.WeiXin)
|
||||
{
|
||||
CopyTywxToWXTemplate();
|
||||
if (configData.login.tywx.txAdSetId != 0 && !string.IsNullOrEmpty(configData.login.tywx.txAdSetKey))
|
||||
{
|
||||
// copy 广点通归因上报sdk的资源
|
||||
CopyDnSdkResouce();
|
||||
}
|
||||
InsertTywx();
|
||||
}
|
||||
if (channelType == TYWebBuildConfig.MiniGameChannelType.BYTEDANCE)
|
||||
{
|
||||
// copy js sdk 资源到 StreamingAssets下,只有StreamingAssets的资源会被渠道打包zip包里
|
||||
CopyBytedanceResource();
|
||||
}
|
||||
if (channelType == TYWebBuildConfig.MiniGameChannelType.JINGDONG)
|
||||
{
|
||||
string jdDirectoryPath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "jingdongminigame");
|
||||
string[] files = Directory.GetFiles(jdDirectoryPath, "tuyoosdk_jingdong*.js");
|
||||
string sourceFile = files[0];
|
||||
CopyTuyooSdkJdRes(sourceFile);
|
||||
InsertJDTuyooSdk(sourceFile);
|
||||
}
|
||||
if (channelType == TYWebBuildConfig.MiniGameChannelType.OPPO)
|
||||
{
|
||||
string oppoDirectoryPath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "oppominigame");
|
||||
string[] files = Directory.GetFiles(oppoDirectoryPath, "tuyoosdk_oppo*.js");
|
||||
string sourceFile = files[0];
|
||||
CopyTuyooSdkOppoRes(sourceFile);
|
||||
InsertOppoTuyooSdk(sourceFile);
|
||||
}
|
||||
if (channelType == TYWebBuildConfig.MiniGameChannelType.MEITUAN)
|
||||
{
|
||||
string mtDirectoryPath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "meituanminigame");
|
||||
string[] files = Directory.GetFiles(mtDirectoryPath, "tuyoosdk_meituan*.js");
|
||||
string sourceFile = files[0];
|
||||
CopyTuyooSdkMtRes(sourceFile);
|
||||
InsertMtTuyooSdk(sourceFile);
|
||||
}
|
||||
if (channelType == TYWebBuildConfig.MiniGameChannelType.KUAISHOU)
|
||||
{
|
||||
string mtDirectoryPath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "kuaishouminigame");
|
||||
string[] files = Directory.GetFiles(mtDirectoryPath, "tuyoosdk_kuaishou*.js");
|
||||
string sourceFile = files[0];
|
||||
CopyTuyooSdkKSRes(sourceFile);
|
||||
InsertKSTuyooSdk(sourceFile);
|
||||
}
|
||||
if (channelType == TYWebBuildConfig.MiniGameChannelType.XIAOMI)
|
||||
{
|
||||
string mtDirectoryPath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "xiaomiminigame");
|
||||
string[] files = Directory.GetFiles(mtDirectoryPath, "tuyoosdk_xiaomi*.js");
|
||||
string sourceFile = files[0];
|
||||
CopyTuyooSdkMIRes(sourceFile);
|
||||
InsertMITuyooSdk(sourceFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetBuildChannelType()
|
||||
{
|
||||
return channelType;
|
||||
}
|
||||
|
||||
private void CopyTyConfigFile()
|
||||
{
|
||||
string destinationPath = Path.Combine(Application.dataPath, "Resources/tygameconfig.json");
|
||||
CopyFileContent(configFilePath, destinationPath);
|
||||
}
|
||||
|
||||
private void CopyTyBridgeFile()
|
||||
{
|
||||
if (channelType == TYWebBuildConfig.MiniGameChannelType.ALI)
|
||||
{
|
||||
// 阿里小游戏
|
||||
CopyBridgeContent("aliminigame");
|
||||
}
|
||||
else if (channelType == TYWebBuildConfig.MiniGameChannelType.WeiXin)
|
||||
{
|
||||
// 微信小游戏
|
||||
CopyBridgeContent("tywx");
|
||||
InsertTywx();
|
||||
}
|
||||
else if (channelType == TYWebBuildConfig.MiniGameChannelType.BYTEDANCE)
|
||||
{
|
||||
// 字节小游戏
|
||||
CopyBridgeContent("zijieminigame");
|
||||
}
|
||||
else if (channelType == TYWebBuildConfig.MiniGameChannelType.JINGDONG)
|
||||
{
|
||||
// 京东小游戏
|
||||
CopyBridgeContent("jingdongminigame");
|
||||
}
|
||||
else if (channelType == TYWebBuildConfig.MiniGameChannelType.OPPO)
|
||||
{
|
||||
// oppo小游戏
|
||||
CopyBridgeContent("oppominigame");
|
||||
}
|
||||
else if (channelType == TYWebBuildConfig.MiniGameChannelType.MEITUAN)
|
||||
{
|
||||
CopyBridgeContent("meituanminigame");
|
||||
}
|
||||
else if (channelType == TYWebBuildConfig.MiniGameChannelType.KUAISHOU)
|
||||
{
|
||||
CopyBridgeContent("kuaishouminigame");
|
||||
}
|
||||
else if (channelType == TYWebBuildConfig.MiniGameChannelType.XIAOMI)
|
||||
{
|
||||
CopyBridgeContent("xiaomiminigame");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 打一个的默认jslib,可以直接导出WebGL
|
||||
CopyBridgeContent("tywx");
|
||||
}
|
||||
}
|
||||
|
||||
public void CopyBridgeContent(string filePath)
|
||||
{
|
||||
string sourceFile = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, filePath, "TyJsBridge.js");
|
||||
string targetFile = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_JSBRIDGE_DIR);
|
||||
CopyFileContent(sourceFile, targetFile);
|
||||
}
|
||||
|
||||
// https://wechat-miniprogram.github.io/minigame-unity-webgl-transform/Design/BuildTemplate.html
|
||||
private void CopyTywxToWXTemplate()
|
||||
{
|
||||
string sourceFile = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "tywx/tywx.js");
|
||||
string targetFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_WX_DEFULT_DIR, "tysdk");
|
||||
CheckAndDeletePath(targetFilePath);
|
||||
string targetFile = Path.Combine(targetFilePath, Path.GetFileName(sourceFile));
|
||||
CopyFileContent(sourceFile, targetFile);
|
||||
}
|
||||
|
||||
private void CopyDnSdkResouce()
|
||||
{
|
||||
string sourcePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "tywx/dn-sdk-minigame-1.5.4");
|
||||
string targetPath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_WX_DEFULT_DIR, "tysdk/dn-sdk-minigame-1.5.4");
|
||||
CopyDirectoryAllFiles(sourcePath, targetPath);
|
||||
}
|
||||
|
||||
private void InsertTywx()
|
||||
{
|
||||
string wxGameJSFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_WX_DEFULT_DIR, "game.js");
|
||||
string content = "import { tywx } from \"./tysdk/tywx.js\";\nGameGlobal.tywx = tywx;";
|
||||
string[] keyword = new string[] { "GameGlobal.tywx = tywx;", "GameGlobal.TuyooSdk = TuyooSdk;" };
|
||||
InsertContentToFile(wxGameJSFilePath, 2, content, keyword);
|
||||
}
|
||||
|
||||
private void CopyBytedanceResource()
|
||||
{
|
||||
string directoryPath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "zijieminigame");
|
||||
string[] files = Directory.GetFiles(directoryPath, "tuyoosdk_zijiegame*.js");
|
||||
string sourceFile = files[0];
|
||||
string targetFilePath = Path.Combine(Application.streamingAssetsPath, "__cp_js_files/tysdk.js");
|
||||
CopyFileContent(sourceFile, targetFilePath);
|
||||
}
|
||||
|
||||
private void CopyTuyooSdkJdRes(string sourceFile)
|
||||
{
|
||||
string targetFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_JD_DEFULT_DIR, "tysdk");
|
||||
// 如果已经存在了,删除里面的tysdk,避免重复copy不同版本
|
||||
CheckAndDeletePath(targetFilePath);
|
||||
string targetFile = Path.Combine(targetFilePath, Path.GetFileName(sourceFile));
|
||||
CopyFileContent(sourceFile, targetFile);
|
||||
if (configData.login.jingdongminigame.packageType == "wasmsplit")
|
||||
{
|
||||
string tywxSourceFile = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "tywx/tywx.js");
|
||||
string tywxTargetFilePath = Path.Combine(targetFilePath, "tywx.js");
|
||||
CopyFileContent(tywxSourceFile, tywxTargetFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
private void InsertJDTuyooSdk(string sourceFile)
|
||||
{
|
||||
string jdGameJSDefaultFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_JD_DEFULT_DIR, "game.js");
|
||||
string tyfileName = "./tysdk/" + Path.GetFileName(sourceFile);
|
||||
string content = $"var TuyooSdk = require(\"{tyfileName}\");\nGameGlobal.TuyooSdk = TuyooSdk;";
|
||||
string[] keyword = new string[] { "GameGlobal.tywx = tywx;", "GameGlobal.TuyooSdk = TuyooSdk;" };
|
||||
InsertContentToFile(jdGameJSDefaultFilePath, 2, content, keyword);
|
||||
if (configData.login.jingdongminigame.packageType == "wasmsplit")
|
||||
{
|
||||
string tywxContent = "import { tywx } from \"./tysdk/tywx.js\";\nGameGlobal.tywx = tywx;";
|
||||
InsertContentToFile(jdGameJSDefaultFilePath, 2, tywxContent, new string[] { });
|
||||
}
|
||||
}
|
||||
|
||||
private void CopyTuyooSdkOppoRes(string sourceFile)
|
||||
{
|
||||
string targetFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_WX_DEFULT_DIR, "tysdk");
|
||||
// 如果已经存在了,删除里面的tysdk,避免重复copy不同版本
|
||||
CheckAndDeletePath(targetFilePath);
|
||||
string targetFile = Path.Combine(targetFilePath, Path.GetFileName(sourceFile));
|
||||
CopyFileContent(sourceFile, targetFile);
|
||||
if (configData.login.oppominigame.packageType == "wasmsplit")
|
||||
// 因为oppo小游戏需要用微信小游戏的开发者工具跑分包,所以需要把微信的资源脚本也打到包里
|
||||
{
|
||||
string tywxSourceFile = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_CHANNEL_RESOURCE_DIR, "tywx/tywx.js");
|
||||
string tywxTargetFilePath = Path.Combine(targetFilePath, "tywx.js");
|
||||
CopyFileContent(tywxSourceFile, tywxTargetFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
private void InsertOppoTuyooSdk(string sourceFile)
|
||||
{
|
||||
string gameJSDefaultFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_WX_DEFULT_DIR, "game.js");
|
||||
string tyfileName = "./tysdk/" + Path.GetFileName(sourceFile);
|
||||
string content = $"var TuyooSdk = require(\"{tyfileName}\");\nGameGlobal.TuyooSdk = TuyooSdk;";
|
||||
string[] keyword = new string[] { "GameGlobal.tywx = tywx;", "GameGlobal.TuyooSdk = TuyooSdk;" };
|
||||
InsertContentToFile(gameJSDefaultFilePath, 2, content, keyword);
|
||||
if (configData.login.oppominigame.packageType == "wasmsplit")
|
||||
{
|
||||
string tywxContent = "import { tywx } from \"./tysdk/tywx.js\";\nGameGlobal.tywx = tywx;";
|
||||
InsertContentToFile(gameJSDefaultFilePath, 2, tywxContent, new string[] { });
|
||||
}
|
||||
}
|
||||
|
||||
private void CopyTuyooSdkMtRes(string sourceFile)
|
||||
{
|
||||
string targetFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_MT_DEFULT_DIR, "tysdk");
|
||||
// 如果已经存在了,删除里面的tysdk,避免重复copy不同版本
|
||||
CheckAndDeletePath(targetFilePath);
|
||||
string targetFile = Path.Combine(targetFilePath, Path.GetFileName(sourceFile));
|
||||
CopyFileContent(sourceFile, targetFile);
|
||||
}
|
||||
|
||||
private void InsertMtTuyooSdk(string sourceFile)
|
||||
{
|
||||
string tyfileName = "./tysdk/" + Path.GetFileName(sourceFile);
|
||||
string mtGameJSFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_MT_DEFULT_DIR, "game.js");
|
||||
string content = $"var TuyooSdk = require(\"{tyfileName}\");\nGameGlobal.TuyooSdk = TuyooSdk;";
|
||||
string[] keyword = new string[] { "GameGlobal.TuyooSdk = TuyooSdk;" };
|
||||
InsertContentToFile(mtGameJSFilePath, 2, content, keyword);
|
||||
}
|
||||
|
||||
private void CopyTuyooSdkKSRes(string sourceFile)
|
||||
{
|
||||
string targetFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_KS_DEFULT_DIR, "tysdk");
|
||||
// 如果已经存在了,删除里面的tysdk,避免重复copy不同版本
|
||||
CheckAndDeletePath(targetFilePath);
|
||||
string targetFile = Path.Combine(targetFilePath, Path.GetFileName(sourceFile));
|
||||
CopyFileContent(sourceFile, targetFile);
|
||||
}
|
||||
|
||||
private void InsertKSTuyooSdk(string sourceFile)
|
||||
{
|
||||
string tyfileName = "./tysdk/" + Path.GetFileName(sourceFile);
|
||||
string ksGameJSFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_KS_DEFULT_DIR, "game.js");
|
||||
string content = $"var TuyooSdk = require(\"{tyfileName}\");\nGameGlobal.TuyooSdk = TuyooSdk;";
|
||||
string[] keyword = new string[] { "GameGlobal.TuyooSdk = TuyooSdk;" };
|
||||
InsertContentToFile(ksGameJSFilePath, 2, content, keyword);
|
||||
}
|
||||
|
||||
private void CopyTuyooSdkMIRes(string sourceFile)
|
||||
{
|
||||
string targetFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_MI_DEFULT_DIR, "tysdk");
|
||||
// 如果已经存在了,删除里面的tysdk,避免重复copy不同版本
|
||||
CheckAndDeletePath(targetFilePath);
|
||||
string targetFile = Path.Combine(targetFilePath, Path.GetFileName(sourceFile));
|
||||
CopyFileContent(sourceFile, targetFile);
|
||||
}
|
||||
|
||||
private void InsertMITuyooSdk(string sourceFile)
|
||||
{
|
||||
string tyfileName = "./tysdk/" + Path.GetFileName(sourceFile);
|
||||
string miGameJSFilePath = Path.Combine(Application.dataPath, TYWebBuildConfig.TY_WEB_MI_DEFULT_DIR, "game.js");
|
||||
string content = $"var TuyooSdk = require(\"{tyfileName}\");\nwindow.TuyooSdk = TuyooSdk;";
|
||||
string[] keyword = new string[] { "window.TuyooSdk = TuyooSdk;" };
|
||||
InsertContentToFile(miGameJSFilePath, 1, content, keyword);
|
||||
}
|
||||
|
||||
public void CheckAndDeletePath(string targetPath)
|
||||
{
|
||||
if (Directory.Exists(targetPath))
|
||||
{
|
||||
string[] files = Directory.GetFiles(targetPath, "*", SearchOption.AllDirectories);
|
||||
foreach (string file in files)
|
||||
{
|
||||
File.Delete(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void CopyDirectoryAllFiles(string sourcePath, string targetPath)
|
||||
{
|
||||
if (!Directory.Exists(targetPath))
|
||||
{
|
||||
Directory.CreateDirectory(targetPath);
|
||||
}
|
||||
string[] files = Directory.GetFiles(sourcePath);
|
||||
|
||||
foreach (string file in files)
|
||||
{
|
||||
string fileName = Path.GetFileName(file);
|
||||
if (fileName.EndsWith(".meta"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
string destFile = Path.Combine(targetPath, fileName);
|
||||
|
||||
try
|
||||
{
|
||||
File.Copy(file, destFile, true);
|
||||
}
|
||||
catch (System.Exception e)
|
||||
{
|
||||
Debug.Log($"Failed to copy file {fileName}: {e.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void CopyFileContent(string sourceFile, string targetFile)
|
||||
{
|
||||
if (!File.Exists(sourceFile))
|
||||
{
|
||||
Debug.LogError($"源文件不存在: {sourceFile}");
|
||||
return;
|
||||
}
|
||||
|
||||
// 确保目标目录存在
|
||||
string targetDirectory = Path.GetDirectoryName(targetFile);
|
||||
if (!Directory.Exists(targetDirectory))
|
||||
{
|
||||
Directory.CreateDirectory(targetDirectory);
|
||||
}
|
||||
|
||||
// 读取源文件内容并写入目标文件(覆盖方式)
|
||||
File.Copy(sourceFile, targetFile, true);
|
||||
|
||||
Debug.Log($"已复制 {sourceFile} 的内容到 {targetFile}");
|
||||
}
|
||||
|
||||
public void InsertContentToFile(string filePath, int targetLine, string insertContent, string[] checkKeyword)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!File.Exists(filePath))
|
||||
{
|
||||
Debug.LogError("文件不存在: " + filePath);
|
||||
return;
|
||||
}
|
||||
|
||||
var fileLines = new List<string>(File.ReadAllLines(filePath));
|
||||
|
||||
foreach (string keyword in checkKeyword)
|
||||
{
|
||||
int matchIndex = fileLines.FindIndex(line => line.Trim() == keyword);
|
||||
if (matchIndex >= 1)
|
||||
{
|
||||
// 删除该行和它上面一行,如: "import { tywx } from \"./tysdk/tywx.js\";\nGameGlobal.tywx = tywx;";
|
||||
fileLines.RemoveAt(matchIndex);
|
||||
fileLines.RemoveAt(matchIndex - 1);
|
||||
}
|
||||
}
|
||||
|
||||
string[] lines = fileLines.ToArray();
|
||||
|
||||
// 插入内容
|
||||
if (targetLine > lines.Length)
|
||||
{
|
||||
// 如果目标行号超过文件行数,则追加
|
||||
File.AppendAllText(filePath, Environment.NewLine + insertContent + Environment.NewLine);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 在指定行插入
|
||||
fileLines.Insert(targetLine - 1, insertContent);
|
||||
File.WriteAllLines(filePath, fileLines);
|
||||
}
|
||||
|
||||
Debug.Log($"已修改文件: {filePath}");
|
||||
}
|
||||
catch (System.Exception e)
|
||||
{
|
||||
Debug.LogError($"修改文件失败: {e.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveTargetContent(string filePath, string target)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!File.Exists(filePath))
|
||||
{
|
||||
Debug.LogError("文件不存在: " + filePath);
|
||||
return;
|
||||
}
|
||||
// 读取文件内容
|
||||
string text = File.ReadAllText(filePath);
|
||||
|
||||
// 删除目标内容
|
||||
string newText = text.Replace(target, "");
|
||||
|
||||
// 写回文件
|
||||
File.WriteAllText(filePath, newText);
|
||||
}
|
||||
catch (System.Exception e)
|
||||
{
|
||||
Debug.LogError($"删除指定内容失败: {e.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bf40edd3df60c492981a79cb33398b5c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,39 @@
|
||||
public class TYWebBuildConfig
|
||||
{
|
||||
|
||||
// gameconfig dir
|
||||
public const string TY_WEB_GAMECONFIG_DIR = "EngineSdkConverter/Unity/Plugins/WebGL/gameconfig.json";
|
||||
|
||||
public const string TY_WEB_CHANNEL_RESOURCE_DIR = "EngineSdkConverter/Unity/Plugins/WebGL/ChannelResource";
|
||||
|
||||
public const string TY_WEB_JSBRIDGE_DIR = "EngineSdkConverter/Unity/Plugins/WebGL/TyJsBridge.jslib";
|
||||
|
||||
public const string TY_WEB_WX_TEMPLATE_DIR = "WX-WASM-SDK-V2/Editor/template/minigame";
|
||||
|
||||
public const string TY_WEB_WX_DEFULT_DIR = "WX-WASM-SDK-V2/Runtime/wechat-default";
|
||||
|
||||
public const string TY_WEB_JD_TEMPLATE_DIR = "WX-WASM-SDK-V2/Editor/template/minigame";
|
||||
|
||||
public const string TY_WEB_JD_DEFULT_DIR = "WX-WASM-SDK-V2/Runtime/wechat-default";
|
||||
|
||||
public const string TY_WEB_MT_TEMPLATE_DIR = "MGC-WASM-SDK/Editor/template/minigame";
|
||||
|
||||
public const string TY_WEB_MT_DEFULT_DIR = "MGC-WASM-SDK/Runtime/wechat-default";
|
||||
|
||||
public const string TY_WEB_KS_DEFULT_DIR = "KS-WASM-SDK-V2/Runtime/minigame-default";
|
||||
|
||||
public const string TY_WEB_MI_DEFULT_DIR = "XIAOMI-minigame/MiQGame";
|
||||
|
||||
public class MiniGameChannelType
|
||||
{
|
||||
public const string ALI = "ali.cn.minigame";
|
||||
public const string WeiXin = "wx.cn.minigame";
|
||||
public const string BYTEDANCE = "bytedance.cn.minigame";
|
||||
public const string JINGDONG = "jingdong.cn.minigame";
|
||||
public const string OPPO = "oppo.cn.minigame";
|
||||
public const string MEITUAN = "mt.cn.minigame";
|
||||
public const string KUAISHOU = "kuaishou.cn.minigame";
|
||||
public const string XIAOMI = "xiaomi.cn.minigame";
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 894b657888acb4a1d9a61ed5a1efd7db
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "com.tuyoo.unitysdk.editor",
|
||||
"rootNamespace": "",
|
||||
"references": [
|
||||
"GUID:2104153dbb22d46e89c9a1195f478f01"
|
||||
],
|
||||
"includePlatforms": [
|
||||
"Editor"
|
||||
],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f232f093b6a904b4a84b64f3bac882ca
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Packages/com.bywaystudios.tuyoosdk/Editor/iOS.meta
Normal file
8
Packages/com.bywaystudios.tuyoosdk/Editor/iOS.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5779445bed0ed4206a40991b635b0b0c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,160 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using UnityEditor;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace EngineSdkConverter.Unity.Editor
|
||||
{
|
||||
public class Result
|
||||
{
|
||||
/// <summary>
|
||||
/// Standard output stream from command line.
|
||||
/// </summary>
|
||||
public string StandardOutput;
|
||||
|
||||
/// <summary>
|
||||
/// Standard error stream from command line.
|
||||
/// </summary>
|
||||
public string StandardError;
|
||||
|
||||
/// <summary>
|
||||
/// Exit code returned from command line.
|
||||
/// </summary>
|
||||
public int ExitCode;
|
||||
|
||||
/// <summary>
|
||||
/// The description of the result that can be used for error logging.
|
||||
/// </summary>
|
||||
public string Message;
|
||||
}
|
||||
|
||||
public class EngineSdkConverterUtils
|
||||
{
|
||||
const string TAG = "EnginSdkConverterUtils ";
|
||||
|
||||
static public string GetFilePathByAssetName(string assetName)
|
||||
{
|
||||
var assetGuids = AssetDatabase.FindAssets(assetName);
|
||||
string retPath = "";
|
||||
foreach (var guid in assetGuids)
|
||||
{
|
||||
retPath = AssetDatabase.GUIDToAssetPath(guid);
|
||||
if (File.Exists(retPath))
|
||||
{
|
||||
retPath = Path.Combine(retPath);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
retPath = "";
|
||||
}
|
||||
}
|
||||
return retPath;
|
||||
}
|
||||
|
||||
public static Result RunShell(string toolPath, string arguments, string workingDirectory)
|
||||
{
|
||||
var stdoutFileName = Path.GetTempFileName();
|
||||
var stderrFileName = Path.GetTempFileName();
|
||||
|
||||
var process = new Process();
|
||||
process.StartInfo.UseShellExecute = false;
|
||||
process.StartInfo.CreateNoWindow = false;
|
||||
process.StartInfo.RedirectStandardInput = false;
|
||||
process.StartInfo.RedirectStandardOutput = false;
|
||||
process.StartInfo.RedirectStandardError = false;
|
||||
|
||||
process.StartInfo.EnvironmentVariables["LANG"] = "en_US.UTF-8";
|
||||
process.StartInfo.EnvironmentVariables["PATH"] = $"{Environment.GetEnvironmentVariable("PATH")}:/usr/local/bin";
|
||||
|
||||
process.StartInfo.WorkingDirectory = workingDirectory;
|
||||
process.StartInfo.FileName = "bash";
|
||||
string argumentsFormat = string.Format("-l -c '\"{0}\" {1} 1> {2} 2> {3}'", toolPath, arguments, stdoutFileName, stderrFileName);
|
||||
process.StartInfo.Arguments = argumentsFormat;
|
||||
process.Start();
|
||||
|
||||
process.WaitForExit();
|
||||
|
||||
var stdout = File.ReadAllText(stdoutFileName);
|
||||
var stderr = File.ReadAllText(stderrFileName);
|
||||
|
||||
File.Delete(stdoutFileName);
|
||||
File.Delete(stderrFileName);
|
||||
|
||||
var result = new Result();
|
||||
result.StandardOutput = stdout;
|
||||
result.StandardError = stderr;
|
||||
result.ExitCode = process.ExitCode;
|
||||
|
||||
var messagePrefix = result.ExitCode == 0 ? "Command executed successfully" : "Failed to run command";
|
||||
result.Message = string.Format("{0}: '{1} {2}'\nstdout: {3}\nstderr: {4}\nExit code: {5}", messagePrefix, toolPath, arguments, stdout, stderr, process.ExitCode);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Result RunPython(string scriptPath, string arguments, string workingDirectory)
|
||||
{
|
||||
var stdoutFileName = Path.GetTempFileName();
|
||||
var stderrFileName = Path.GetTempFileName();
|
||||
|
||||
var process = new Process();
|
||||
process.StartInfo.UseShellExecute = false;
|
||||
process.StartInfo.CreateNoWindow = false;
|
||||
process.StartInfo.RedirectStandardInput = false;
|
||||
process.StartInfo.RedirectStandardOutput = false;
|
||||
process.StartInfo.RedirectStandardError = false;
|
||||
|
||||
process.StartInfo.EnvironmentVariables["LANG"] = "en_US.UTF-8";
|
||||
process.StartInfo.EnvironmentVariables["PATH"] = $"{Environment.GetEnvironmentVariable("PATH")}:/usr/local/bin";
|
||||
|
||||
process.StartInfo.WorkingDirectory = workingDirectory;
|
||||
process.StartInfo.FileName = "bash";
|
||||
|
||||
// 直接调用 Python3 并保证参数安全
|
||||
string argumentsFormat = $"-l -c 'python3 \"{scriptPath}\" {arguments} 1> \"{stdoutFileName}\" 2> \"{stderrFileName}\"'";
|
||||
process.StartInfo.Arguments = argumentsFormat;
|
||||
|
||||
process.Start();
|
||||
process.WaitForExit();
|
||||
|
||||
var stdout = File.ReadAllText(stdoutFileName);
|
||||
var stderr = File.ReadAllText(stderrFileName);
|
||||
|
||||
File.Delete(stdoutFileName);
|
||||
File.Delete(stderrFileName);
|
||||
|
||||
var result = new Result
|
||||
{
|
||||
StandardOutput = stdout,
|
||||
StandardError = stderr,
|
||||
ExitCode = process.ExitCode,
|
||||
Message = $"{(process.ExitCode == 0 ? "Command executed successfully" : "Failed to run command")}: 'python3 {scriptPath} {arguments}'\nstdout: {stdout}\nstderr: {stderr}\nExit code: {process.ExitCode}"
|
||||
};
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void CopyDirectory(string sourceDir, string destDir, bool replace)
|
||||
{
|
||||
// 确保目标文件夹存在
|
||||
if (!Directory.Exists(destDir))
|
||||
{
|
||||
Directory.CreateDirectory(destDir);
|
||||
}
|
||||
|
||||
// 复制所有文件
|
||||
foreach (var file in Directory.GetFiles(sourceDir))
|
||||
{
|
||||
string destFilePath = Path.Combine(destDir, Path.GetFileName(file));
|
||||
File.Copy(file, destFilePath, replace); // true 表示覆盖已有文件
|
||||
}
|
||||
|
||||
// 递归复制子文件夹
|
||||
foreach (var subDir in Directory.GetDirectories(sourceDir))
|
||||
{
|
||||
string newDestDir = Path.Combine(destDir, Path.GetFileName(subDir));
|
||||
CopyDirectory(subDir, newDestDir, replace);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d7ebf1247305d4ac3bd13cf3cc628e1c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,948 @@
|
||||
import os
|
||||
import re
|
||||
import json
|
||||
import argparse
|
||||
from pbxproj import XcodeProject
|
||||
from pbxproj.pbxsections import PBXShellScriptBuildPhase
|
||||
import subprocess
|
||||
import plistlib
|
||||
|
||||
#TODO:待修改字段
|
||||
IOSMINIVERSION = '12.0'
|
||||
LOCAL_SOURCE_LINE = 'http://tygit.tuyoo.com/dev_platform/ios/frameworks/pods/private-pod-repo.git'
|
||||
SOURCE_LINE = 'ssh://git@tygit.tuyoo.com:2222/dev_platform/ios/frameworks/pods/private-pod-repo.git'
|
||||
CUSTOM_OSS_HTTP_PATH = 'https://sa201-ptsdk-res.oss-cn-beijing.aliyuncs.com'
|
||||
|
||||
build_config = {}
|
||||
build_package_config = {}
|
||||
build_sdk_names_list = []
|
||||
dependencies = []
|
||||
|
||||
CHANNEL_AND_NAME_LIST = ["wechat",
|
||||
"wangyiyidun",
|
||||
"yidunloginv2",
|
||||
"douyin",
|
||||
"rongheguiyin",
|
||||
"yidunzhiwen",
|
||||
"yiduncaptcha",
|
||||
"yidunlivedetect",
|
||||
"appsflyer",
|
||||
"firebaseanalytics",
|
||||
"firebasecrashlytics",
|
||||
"firebaseodm",
|
||||
"yuenanlogin",
|
||||
"facebook",
|
||||
"google",
|
||||
"line",
|
||||
"twitter",
|
||||
"idfa",
|
||||
"haiwailogin",
|
||||
"aihelp",
|
||||
"bugly",
|
||||
"push",
|
||||
"fcm"]
|
||||
|
||||
BUNDLE_SOURCE = {
|
||||
"yidunloginv2":["NTESResource.bundle","TDKYiDunLoginV2Bundle.bundle"],
|
||||
"yidunzhiwen":["FPSupport.bundle"],
|
||||
"yiduncaptcha":["NTESVerifyCodeResources.bundle","TDKYidunCaptchaBundle.bundle"],
|
||||
"yidunlivedetect":["NTESLiveDetectBundle.bundle","TDKYidunLiveDetectBundle.bundle"],
|
||||
"haiwailogin":["TDKHaiWaiLoginSource.bundle"],
|
||||
"aihelp":["AIHelpSupportSDK.bundle"]
|
||||
}
|
||||
|
||||
EMBEM_FRAMEWORK_SOURCE = {
|
||||
"douyin":["UnionOpenPlatformCore.framework","UnionOpenPlatformCPS.framework"],
|
||||
"yidunlivedetect":["NEYDnn.framework"]
|
||||
}
|
||||
|
||||
def parse_build_config_json(build_config_json_path, coustom_plist_path):
|
||||
print(f"1️⃣ parse_build_config_json, path = {build_config_json_path} begin")
|
||||
abs_build_config_json_path = os.path.abspath(build_config_json_path)
|
||||
if os.path.isfile(abs_build_config_json_path):
|
||||
with open(abs_build_config_json_path, 'r', encoding='utf-8') as json_file:
|
||||
data = json.loads(json_file.read())
|
||||
# print(f"1️⃣ parse_build_config_json, json = {data} ing")
|
||||
# 将数据写入 plist 文件
|
||||
with open(coustom_plist_path, 'wb') as plist_file:
|
||||
plistlib.dump(data, plist_file)
|
||||
global coustom_plist_file_path
|
||||
coustom_plist_file_path = coustom_plist_path
|
||||
global build_config
|
||||
build_config = data
|
||||
global build_package_config
|
||||
build_package_config = data.get('buildConfig')
|
||||
global build_sdk_names_list
|
||||
names = data.get('login').get('sdks')
|
||||
build_sdk_names_list = list(set([name for name in names if name]))
|
||||
fcm = data.get('fcm')
|
||||
push = data.get('push')
|
||||
if fcm:
|
||||
build_sdk_names_list.append('fcm')
|
||||
if push:
|
||||
build_sdk_names_list.append('push')
|
||||
if ('firebasecrashlytics' in build_sdk_names_list or 'firebaseodm' in build_sdk_names_list) and 'firebaseanalytics' not in build_sdk_names_list:
|
||||
build_sdk_names_list.append('firebaseanalytics')
|
||||
else:
|
||||
print(f"❌ parse_build_config_json file error")
|
||||
exit(1)
|
||||
|
||||
def get_add_project_capability_flag():
|
||||
if build_package_config and "addCapability" in build_package_config:
|
||||
return build_package_config.get("addCapability")
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_git_access_method():
|
||||
if build_package_config and "gitAccessMethod" in build_package_config:
|
||||
return build_package_config.get("gitAccessMethod")
|
||||
else:
|
||||
return "ssh"
|
||||
|
||||
def get_sdk_source_method():
|
||||
if build_package_config and "getSourceMethod" in build_package_config:
|
||||
return build_package_config.get("getSourceMethod")
|
||||
else:
|
||||
return "git"
|
||||
|
||||
def add_file_to_project(project, file_path, skip_if_exsit=True, target_name = None):
|
||||
print(f"💡 add_file_to_project {file_path}")
|
||||
abs_file_path = os.path.abspath(file_path)
|
||||
if os.path.exists(abs_file_path):
|
||||
if not project.get_files_by_path(abs_file_path):
|
||||
project.add_file(abs_file_path, target_name = target_name)
|
||||
print(f"⚠️ add_file_to_project {abs_file_path} add")
|
||||
elif not skip_if_exsit:
|
||||
project.remove_files_by_path(abs_file_path)
|
||||
print(f"🗑️ 已删除旧的 {abs_file_path}")
|
||||
file_ref = project.add_file(abs_file_path, target_name = target_name)
|
||||
print(f"✅ 已添加: {abs_file_path} -> {file_ref}")
|
||||
else:
|
||||
print(f"⚠️ add_file_to_project {abs_file_path} already exist")
|
||||
else:
|
||||
print(f"⚠️ add_file_to_project {abs_file_path} not exist")
|
||||
|
||||
def set_library_search_paths(project, search_paths, target_name=None):
|
||||
print(f"💡 set_library_search_paths {search_paths}")
|
||||
library_search_paths = None
|
||||
for target in project.objects.get_targets():
|
||||
build_configurations = project.objects.get_configurations_on_targets(target.name)
|
||||
for config in build_configurations:
|
||||
library_search_paths = config.buildSettings.get("LIBRARY_SEARCH_PATHS", [])
|
||||
default_paths = ['$(inherited)']
|
||||
if library_search_paths:
|
||||
if not isinstance(library_search_paths, list):
|
||||
library_search_paths = [library_search_paths]
|
||||
print(f"💡 set_library_search_paths {library_search_paths}")
|
||||
library_search_paths = default_paths + list(dict.fromkeys(search_paths + library_search_paths))
|
||||
|
||||
library_search_paths = default_paths + [item for item in library_search_paths if item not in default_paths]
|
||||
else:
|
||||
library_search_paths = default_paths
|
||||
config.buildSettings["LIBRARY_SEARCH_PATHS"] = library_search_paths
|
||||
print(f"💡 set_library_search_paths {target.name} - {library_search_paths}")
|
||||
else:
|
||||
print(f"💡 set_library_search_paths fail")
|
||||
return None
|
||||
|
||||
# **处理 Info.plist Begin**
|
||||
def add_bool_to_info_plist(plist_file_path, key, value, skip_existing_elements = True):
|
||||
print(f"💡 add_bool_to_info_plist {plist_file_path} - {key} - {value}")
|
||||
if not key and key == '':
|
||||
print(f"⚠️ add_bool_to_info_plist {key} invalue")
|
||||
return
|
||||
if not isinstance(value, bool):
|
||||
print(f"⚠️ add_bool_to_info_plist {value} invalue")
|
||||
return
|
||||
with open(plist_file_path, 'rb') as f:
|
||||
plist_data = plistlib.load(f)
|
||||
if not skip_existing_elements or key not in plist_data:
|
||||
# 如果存在,但不跳过,则直接覆盖, 如果不存在,则创建一个新的列表并添加 schemes_to_add
|
||||
plist_data[key] = value
|
||||
|
||||
# 将修改后的数据写回 info.plist 文件
|
||||
with open(plist_file_path, 'wb') as f:
|
||||
plistlib.dump(plist_data, f)
|
||||
|
||||
def add_string_to_info_plist(plist_file_path, key, value, skip_existing_elements = True):
|
||||
print(f"💡 add_string_to_info_plist {plist_file_path} - {key} - {value}")
|
||||
if not key and key == '':
|
||||
print(f"⚠️ add_string_to_info_plist {key} invalue")
|
||||
return
|
||||
if not isinstance(value, str):
|
||||
print(f"⚠️ add_array_to_info_plist {value} invalue")
|
||||
return
|
||||
with open(plist_file_path, 'rb') as f:
|
||||
plist_data = plistlib.load(f)
|
||||
if not skip_existing_elements or key not in plist_data:
|
||||
# 如果存在,但不跳过,则直接覆盖, 如果不存在,则创建一个新的列表并添加 schemes_to_add
|
||||
plist_data[key] = value
|
||||
|
||||
# 将修改后的数据写回 info.plist 文件
|
||||
with open(plist_file_path, 'wb') as f:
|
||||
plistlib.dump(plist_data, f)
|
||||
|
||||
def add_array_to_info_plist(plist_file_path, key, value, skip_existing_elements = True):
|
||||
print(f"💡 add_array_to_info_plist {plist_file_path} - {key} - {value}")
|
||||
if not os.path.exists(plist_file_path):
|
||||
print(f"⚠️ add_array_to_info_plist {plist_file_path} invalue")
|
||||
return
|
||||
if not key or key == '':
|
||||
print(f"⚠️ add_array_to_info_plist {key} invalue")
|
||||
return
|
||||
if not isinstance(value, list):
|
||||
print(f"⚠️ add_array_to_info_plist {value} invalue")
|
||||
return
|
||||
|
||||
with open(plist_file_path, 'rb') as f:
|
||||
plist_data = plistlib.load(f)
|
||||
|
||||
# 检查 key 是否存在
|
||||
if key not in plist_data:
|
||||
plist_data[key] = []
|
||||
current_array = plist_data[key]
|
||||
for item in value:
|
||||
if not skip_existing_elements or item not in current_array:
|
||||
current_array.append(item)
|
||||
with open(plist_file_path, 'wb') as f:
|
||||
plistlib.dump(plist_data, f)
|
||||
|
||||
def is_json(variable):
|
||||
try:
|
||||
json.loads(variable)
|
||||
return True
|
||||
except (json.JSONDecodeError, TypeError):
|
||||
return False
|
||||
|
||||
def add_dictionary_to_info_plist(plist_file_path, key, value, skip_existing_elements = True):
|
||||
print(f"💡 add_dictionary_to_info_plist {plist_file_path} - {key} - {value}")
|
||||
if not key and key == '':
|
||||
print(f"⚠️ add_dictionary_to_info_plist {key} invalue")
|
||||
return
|
||||
if not is_json(value):
|
||||
print(f"⚠️ add_dictionary_to_info_plist {value} invalue")
|
||||
return
|
||||
with open(plist_file_path, 'rb') as f:
|
||||
plist_data = plistlib.load(f)
|
||||
if not skip_existing_elements or key not in plist_data:
|
||||
# 如果存在,但不跳过,则直接覆盖, 如果不存在,则创建一个新的列表并添加 schemes_to_add
|
||||
plist_data[key] = value
|
||||
|
||||
# 将修改后的数据写回 info.plist 文件
|
||||
with open(plist_file_path, 'wb') as f:
|
||||
plistlib.dump(plist_data, f)
|
||||
# **处理 Info.plist End**
|
||||
|
||||
# **处理 BuildSetting-ShellScript Begin**
|
||||
def normalize_script(script: str):
|
||||
if not script:
|
||||
return ''
|
||||
return script.strip().strip('"').strip("'")
|
||||
|
||||
def add_shell_script(project, run_script, input_files=None, output_files=None ,target_name=None, insert_before_compile=False, run_install_build=0):
|
||||
# 检查是否已经存在该脚本,避免重复添加
|
||||
for target in project.objects.get_targets(target_name):
|
||||
print(f'target = {target}')
|
||||
for build_phase_id in target.buildPhases:
|
||||
build_phase = project.objects[build_phase_id]
|
||||
print(f'build_phase = {build_phase_id} = {build_phase}')
|
||||
if not isinstance(build_phase, PBXShellScriptBuildPhase):
|
||||
continue
|
||||
shellScript = build_phase.shellScript or ""
|
||||
print(f'build_phase = start1 {shellScript}')
|
||||
print(f'build_phase = start2 {run_script}')
|
||||
if normalize_script(shellScript) == normalize_script(run_script):
|
||||
print("⚠️ 已存在 先删除 ")
|
||||
del project.objects[build_phase_id]
|
||||
target.remove_build_phase(build_phase)
|
||||
project.add_run_script(
|
||||
script=run_script,
|
||||
input_files=input_files,
|
||||
output_files=output_files,
|
||||
target_name=target_name,
|
||||
insert_before_compile=insert_before_compile,
|
||||
run_install_build=run_install_build
|
||||
)
|
||||
print("✅ 已添加 Run Script Phase。")
|
||||
project.save()
|
||||
# **处理 BuildSetting-ShellScript Begin**
|
||||
|
||||
# **处理 entitlements Begin**
|
||||
def get_entitlements_file_path(project, skip_file_not_exist=True, app_target_name=None):
|
||||
print(f"💡 get_entitlements_file_path ")
|
||||
entitlements_path = None
|
||||
for target in project.objects.get_targets():
|
||||
build_configurations = project.objects.get_configurations_on_targets(target.name)
|
||||
for config in build_configurations:
|
||||
entitlements_path = config.buildSettings.get("CODE_SIGN_ENTITLEMENTS", "")
|
||||
if entitlements_path:
|
||||
print(f"💡 get_entitlements_file_path {entitlements_path}")
|
||||
return os.path.abspath(entitlements_path)
|
||||
if not skip_file_not_exist and app_target_name:
|
||||
entitlements_file_path = f"{app_target_name}/{app_target_name}.entitlements"
|
||||
with open(entitlements_file_path, "wb") as f:
|
||||
plistlib.dump({}, f)
|
||||
for target in project.objects.get_targets():
|
||||
build_configurations = project.objects.get_configurations_on_targets(target.name)
|
||||
for config in build_configurations:
|
||||
config.buildSettings["CODE_SIGN_ENTITLEMENTS"] = entitlements_file_path
|
||||
project.save()
|
||||
return os.path.abspath(entitlements_file_path)
|
||||
else:
|
||||
return None
|
||||
|
||||
def add_sign_in_with_apple_capability(project, app_target_name):
|
||||
print(f"💡 add_sign_in_with_apple_capability")
|
||||
if not get_add_project_capability_flag():
|
||||
print(f"💡 add_sign_in_with_apple_capability skip")
|
||||
return
|
||||
entitlements_file_path = get_entitlements_file_path(project, False, app_target_name)
|
||||
SIGNIN_KEY = "com.apple.developer.applesignin"
|
||||
if os.path.exists(entitlements_file_path):
|
||||
with open(entitlements_file_path, "rb") as f:
|
||||
entitlements = plistlib.load(f)
|
||||
if SIGNIN_KEY in entitlements:
|
||||
print(f"✅ add_sign_in_with_apple_capability 已启用")
|
||||
else:
|
||||
print(f"➕ add_sign_in_with_apple_capability 新增 ")
|
||||
entitlements[SIGNIN_KEY] = ["Default"]
|
||||
with open(entitlements_file_path, "wb") as f:
|
||||
plistlib.dump(entitlements, f)
|
||||
print(f"✅ add_sign_in_with_apple_capability `.entitlements` 文件已更新")
|
||||
else:
|
||||
print(f"⚠️ add_sign_in_with_apple_capability `.entitlements` not exist")
|
||||
|
||||
def add_notification_capability(project, app_target_name):
|
||||
print(f"💡 add_notification_capability")
|
||||
if not get_add_project_capability_flag():
|
||||
print(f"💡 add_notification_capability skip")
|
||||
return
|
||||
entitlements_file_path = get_entitlements_file_path(project, False, app_target_name)
|
||||
APS_ENV_KEY = "aps-environment"
|
||||
if os.path.exists(entitlements_file_path):
|
||||
with open(entitlements_file_path, "rb") as f:
|
||||
entitlements = plistlib.load(f)
|
||||
if APS_ENV_KEY in entitlements:
|
||||
print(f"✅ add_notification_capability 已启用")
|
||||
else:
|
||||
print(f"➕ add_notification_capability 新增 ")
|
||||
entitlements[APS_ENV_KEY] = "production"
|
||||
with open(entitlements_file_path, "wb") as f:
|
||||
plistlib.dump(entitlements, f)
|
||||
print(f"✅ add_notification_capability `.entitlements` 文件已更新")
|
||||
else:
|
||||
print(f"⚠️ add_notification_capability `.entitlements` not exist")
|
||||
|
||||
def add_background_modes_capability(info_plist_path):
|
||||
print(f"💡 add_background_modes_capability")
|
||||
if not get_add_project_capability_flag():
|
||||
print(f"💡 add_background_modes_capability skip")
|
||||
return
|
||||
print(f"✅ `info.plist` 文件已更新 UIBackgroundModes 和 remote-notification 权限")
|
||||
add_array_to_info_plist(info_plist_path, 'UIBackgroundModes', ['remote-notification'])
|
||||
|
||||
def add_keychain_capability(project, app_target_name):
|
||||
print(f"💡 add_keychain_capability")
|
||||
if not get_add_project_capability_flag():
|
||||
print(f"💡 add_keychain_capability skip")
|
||||
return
|
||||
entitlements_file_path = get_entitlements_file_path(project, False, app_target_name)
|
||||
KEY_CHANIN_KEY = "keychain-access-groups"
|
||||
if os.path.exists(entitlements_file_path):
|
||||
with open(entitlements_file_path, "rb") as f:
|
||||
entitlements = plistlib.load(f)
|
||||
if KEY_CHANIN_KEY in entitlements:
|
||||
print(f"✅ add_keychain_capability 已启用")
|
||||
else:
|
||||
print(f"➕ add_keychain_capability 新增 ")
|
||||
entitlements[KEY_CHANIN_KEY] = [""]
|
||||
with open(entitlements_file_path, "wb") as f:
|
||||
plistlib.dump(entitlements, f)
|
||||
print(f"✅ add_keychain_capability `.entitlements` 文件已更新")
|
||||
else:
|
||||
print(f"⚠️ add_keychain_capability `.entitlements` not exist")
|
||||
|
||||
def process_applinks(applinks):
|
||||
"""
|
||||
处理 applinks 列表,确保每个 URL 被转换为符合 Apple Universal Links 规范的格式。
|
||||
"""
|
||||
processed_applinks = []
|
||||
for url in applinks:
|
||||
if url.startswith("http://"):
|
||||
domain = url[len("http://"):]
|
||||
elif url.startswith("https://"):
|
||||
domain = url[len("https://"):]
|
||||
else:
|
||||
domain = url
|
||||
|
||||
domain = domain.split('/')[0]
|
||||
processed_applinks.append(f"applinks:{domain}")
|
||||
|
||||
return processed_applinks
|
||||
|
||||
def add_associated_domains_capability(project, applinks, app_target_name):
|
||||
print(f"💡 add_associated_domains_capability")
|
||||
if not get_add_project_capability_flag():
|
||||
print(f"💡 add_associated_domains_capability skip")
|
||||
return
|
||||
entitlements_file_path = get_entitlements_file_path(project, False, app_target_name)
|
||||
DOMAINS_KEY = "com.apple.developer.associated-domains"
|
||||
processed_applinks = process_applinks(applinks)
|
||||
if os.path.exists(entitlements_file_path):
|
||||
with open(entitlements_file_path, "rb") as f:
|
||||
entitlements = plistlib.load(f)
|
||||
if DOMAINS_KEY in entitlements:
|
||||
print(f"✅ 已启用 Associated Domains,正在补充信息")
|
||||
current_domains = entitlements[DOMAINS_KEY]
|
||||
# 合并两个列表,去重
|
||||
updated_domains = list(set(current_domains + processed_applinks))
|
||||
entitlements[DOMAINS_KEY] = updated_domains
|
||||
else:
|
||||
print(f"➕ add_associated_domains_capability 新增 ")
|
||||
entitlements[DOMAINS_KEY] = processed_applinks
|
||||
with open(entitlements_file_path, "wb") as f:
|
||||
plistlib.dump(entitlements, f)
|
||||
print(f"✅ add_associated_domains_capability `.entitlements` 文件已更新")
|
||||
else:
|
||||
print(f"⚠️ add_associated_domains_capability `.entitlements` not exist")
|
||||
# **处理 entitlements End**
|
||||
|
||||
def add_dependencies_set(dependency):
|
||||
if dependency and isinstance(dependency, list):
|
||||
global dependencies
|
||||
dependencies = list(set(dependencies+dependency))
|
||||
|
||||
def create_podfile(podfile_path, miniversion, app_target_name, target_name):
|
||||
"""创建一个新的 Podfile 文件"""
|
||||
print(f"💡 create_podfile {podfile_path} - {target_name}")
|
||||
with open(podfile_path, 'w') as f:
|
||||
f.write(f"platform :ios, '{miniversion}'\n")
|
||||
# if app_target_name != target_name:
|
||||
# f.write(f"target '{app_target_name}' do\n")
|
||||
# f.write(f" use_frameworks!\n")
|
||||
# f.write(f" target '{target_name}' do\n")
|
||||
# f.write(f" use_frameworks!\n")
|
||||
# f.write(" end\n")
|
||||
# f.write("end\n")
|
||||
# else:
|
||||
f.write(f"target '{target_name}' do\n")
|
||||
f.write(f" use_frameworks!\n")
|
||||
f.write("end\n")
|
||||
def read_podfile(podfile_path):
|
||||
"""读取 Podfile 内容"""
|
||||
with open(podfile_path, 'r') as f:
|
||||
return f.readlines()
|
||||
|
||||
def write_podfile(podfile_path, lines):
|
||||
"""写入更新后的 Podfile 内容"""
|
||||
with open(podfile_path, 'w') as f:
|
||||
f.writelines(lines)
|
||||
|
||||
def extract_pod_info(pod_line):
|
||||
# 正则表达式模式,处理可能的多个空格
|
||||
# 解释:
|
||||
# \s* 匹配任意数量的空格(包括0个)
|
||||
# '([^']+)' 匹配单引号内的内容(组件名和版本号)
|
||||
pattern = r"pod\s+'([^']+)'\s*,\s*'([^']+)'"
|
||||
|
||||
# 执行匹配
|
||||
match = re.match(pattern, pod_line.strip())
|
||||
|
||||
if match:
|
||||
# 返回组件名和版本号
|
||||
return match.group(1), match.group(2)
|
||||
else:
|
||||
return None, None
|
||||
|
||||
def update_dependencies(lines, app_target_name, target_name, dependencies):
|
||||
"""更新 Podfile 中的依赖项 - 根据目标名称判断更新方式"""
|
||||
|
||||
# 检查 source 信息
|
||||
source_found = False
|
||||
# 检查 source 获取方式
|
||||
if get_sdk_source_method() == 'http':
|
||||
source_line = f"OSS_HTTP_PATH = '{CUSTOM_OSS_HTTP_PATH}'"
|
||||
else:
|
||||
if get_git_access_method() == 'ssh':
|
||||
source_line = f"source '{SOURCE_LINE}'"
|
||||
else:
|
||||
source_line = f"source '{LOCAL_SOURCE_LINE}'"
|
||||
for i, line in enumerate(lines):
|
||||
if line.strip() == source_line.strip():
|
||||
source_found = True
|
||||
break
|
||||
|
||||
# 处理 target_name 和 app_target_name 是否相同的情况
|
||||
# if app_target_name == target_name:
|
||||
print(f"🔄 Updating dependencies for target '{target_name}'")
|
||||
|
||||
# 直接处理 target_name 闭包
|
||||
target_found = False
|
||||
target_index = -1
|
||||
end_index = -1
|
||||
# 查找target闭包
|
||||
for i, line in enumerate(lines):
|
||||
if f"target '{target_name}' do" in line:
|
||||
target_found = True
|
||||
target_index = i
|
||||
# 在目标的 do 之前插入 source
|
||||
if not source_found:
|
||||
lines.insert(i, f'{source_line}\n')
|
||||
target_index = target_index + 1
|
||||
break
|
||||
|
||||
if not target_found:
|
||||
print(f"➕ Adding new target '{target_name}'")
|
||||
lines.append(f"\ntarget '{target_name}' do\n")
|
||||
lines.append(" use_frameworks!\n")
|
||||
lines.append("end\n")
|
||||
target_index = len(lines) - 3
|
||||
end_index = len(lines) - 1
|
||||
else:
|
||||
for j in range(target_index + 1, len(lines)):
|
||||
if 'end' in lines[j]:
|
||||
end_index = j
|
||||
break
|
||||
|
||||
# 查找依赖项并更新
|
||||
existing_deps = [
|
||||
dep.strip().split(',')[0].strip() for dep in lines[target_index + 1:end_index]
|
||||
if dep.strip().lower().startswith("pod ")
|
||||
]
|
||||
|
||||
dealDependencies = []
|
||||
# 处理 http 资源
|
||||
if get_sdk_source_method() == 'http':
|
||||
# "pod 'TYWeChatHandle', '1.1.0'"
|
||||
for dep in dependencies:
|
||||
podName, podVersion = extract_pod_info(dep)
|
||||
if podName != None and podVersion != None:
|
||||
# TODO: 得把test改掉!!
|
||||
dealDependencies.append(f"pod '{podName}', :podspec => \"#{{OSS_HTTP_PATH}}/{podName}/test/{podVersion}/{podName}.podspec\"")
|
||||
else :
|
||||
dealDependencies = dependencies
|
||||
|
||||
new_lines = lines.copy()
|
||||
for dep in dealDependencies:
|
||||
dep_name = dep.strip().split(',')[0].strip()
|
||||
if dep_name and dep_name not in existing_deps:
|
||||
new_lines.insert(target_index + 1, f" {dep}\n")
|
||||
end_index += 1
|
||||
else:
|
||||
for i in range(len(new_lines)):
|
||||
if i > target_index and i < end_index:
|
||||
line = new_lines[i]
|
||||
if line.strip().startswith('pod ') and line.strip().split(',')[0].strip() == dep_name:
|
||||
new_lines[i] = f" {dep}\n"
|
||||
|
||||
lines[:] = new_lines
|
||||
return True
|
||||
|
||||
# else:
|
||||
# # 如果 target_name 和 app_target_name 不同,则嵌套 target_name 在 app_target_name 内部
|
||||
# print(f"🔄 Updating dependencies for target '{target_name}' inside the '{app_target_name}' target.")
|
||||
|
||||
# # 处理 app_target_name 闭包
|
||||
# target_found = False
|
||||
# app_target_index = -1
|
||||
# app_end_index = -1
|
||||
# for i, line in enumerate(lines):
|
||||
# if f"target '{app_target_name}' do" in line:
|
||||
# target_found = True
|
||||
# app_target_index = i
|
||||
# # 在目标的 do 之前插入 source
|
||||
# if not source_found:
|
||||
# lines.insert(i, f'{source_line}\n')
|
||||
# break
|
||||
|
||||
# if not target_found:
|
||||
# print(f"➕ Adding new target '{app_target_name}'")
|
||||
# lines.append(f"\ntarget '{app_target_name}' do\n")
|
||||
# lines.append(" use_frameworks!\n")
|
||||
# lines.append("end\n")
|
||||
# app_target_index = len(lines) - 3
|
||||
# app_end_index = len(lines) - 1
|
||||
# else:
|
||||
# for j in range(app_target_index + 1, len(lines)):
|
||||
# if 'end' in lines[j]:
|
||||
# app_end_index = j
|
||||
# break
|
||||
|
||||
# # 查找 app_target_name 下的子目标 target_name 的闭包
|
||||
# child_target_found = False
|
||||
# child_target_index = -1
|
||||
# for i, line in enumerate(lines[app_target_index + 1: app_end_index]):
|
||||
# if f"target '{target_name}' do" in line:
|
||||
# child_target_found = True
|
||||
# child_target_index = i + app_target_index + 1
|
||||
# break
|
||||
|
||||
# if not child_target_found:
|
||||
# print(f"➕ Adding target '{target_name}' inside '{app_target_name}'")
|
||||
# lines.insert(app_end_index, f"\ntarget '{target_name}' do\n")
|
||||
# lines.insert(app_end_index + 1, " use_frameworks!\n")
|
||||
# lines.insert(app_end_index + 2, "end\n")
|
||||
# child_target_index = app_end_index + 1
|
||||
|
||||
# # 在 target_name 的闭包中添加依赖项
|
||||
# for dep in dependencies:
|
||||
# lines.insert(child_target_index + 1, f" {dep}\n")
|
||||
# child_target_index += 1
|
||||
|
||||
# return True
|
||||
|
||||
def process_podfile(podfile_path, app_target_name, target_name, miniversion, dependencies):
|
||||
"""处理 Podfile
|
||||
1. podfile_path:podfile文件的路径
|
||||
2. target_name:项目名称
|
||||
3. dependencies:pod依赖信息的列表(示例: ["pod 'XYSDK'", "pod 'TDKWechatHandle'"])
|
||||
"""
|
||||
print(f"process_podfile {podfile_path} - {target_name} - {miniversion} - {dependencies}")
|
||||
if not os.path.exists(podfile_path):
|
||||
create_podfile(podfile_path, miniversion, app_target_name, target_name)
|
||||
|
||||
lines = read_podfile(podfile_path)
|
||||
|
||||
# 更新依赖项
|
||||
if update_dependencies(lines, app_target_name, target_name, dependencies):
|
||||
write_podfile(podfile_path, lines)
|
||||
|
||||
def install_podfile(project_dir):
|
||||
# 执行 pod 命令
|
||||
print("执行 pod deintegrate && pod install")
|
||||
result = subprocess.run(["pod", "deintegrate"], cwd=project_dir)
|
||||
if result.returncode != 0:
|
||||
print("❌ pod deintegrate 失败")
|
||||
exit(4)
|
||||
|
||||
result = subprocess.run(["pod", "install", "--repo-update"], cwd=project_dir)
|
||||
if result.returncode != 0:
|
||||
print("❌ pod install 失败")
|
||||
exit(4)
|
||||
|
||||
print("✅ Podfile 处理完成!")
|
||||
|
||||
def find_app_target_names(project):
|
||||
print(f"💡 find_app_targets ")
|
||||
# 遍历所有的targets,找到主工程target
|
||||
app_targets = []
|
||||
for target in project.objects.get_targets():
|
||||
if target.productType == "com.apple.product-type.application":
|
||||
app_targets.append(target.name)
|
||||
return app_targets
|
||||
|
||||
def copy_bundle_to_main_projet(project, project_path):
|
||||
print(f"💡 copy_bundle_to_main_projet {project_path}")
|
||||
pod_source_path = os.path.join(project_path, "Pods")
|
||||
if os.path.exists(pod_source_path):
|
||||
bundle_paths = []
|
||||
bundle_sources = [bundle for bundles in BUNDLE_SOURCE.values() for bundle in bundles]
|
||||
for root, dirs, files in os.walk(pod_source_path):
|
||||
folder_name = os.path.basename(root)
|
||||
if "Pods" in root and root.endswith(".bundle") and folder_name in bundle_sources:
|
||||
bundle_paths.append(os.path.abspath(root))
|
||||
target_names = find_app_target_names(project)
|
||||
print(f"💡 copy_bundle_to_main_projet target_names {target_names}")
|
||||
for bundle in bundle_paths:
|
||||
for target_name in target_names:
|
||||
add_file_to_project(project, bundle, target_name=target_name, skip_if_exsit=False)
|
||||
project.save()
|
||||
|
||||
def add_file_to_embed_frameworks(project, project_path):
|
||||
print(f"💡 add_file_to_embed_frameworks {project_path}")
|
||||
pod_source_path = os.path.join(project_path, "Pods")
|
||||
if os.path.exists(pod_source_path):
|
||||
embed_framework_paths = []
|
||||
embed_framework_sources = [framework for frameworks in EMBEM_FRAMEWORK_SOURCE.values() for framework in frameworks]
|
||||
for root, dirs, files in os.walk(pod_source_path):
|
||||
folder_name = os.path.basename(root)
|
||||
if "Pods" in root and (root.endswith(".framework") or root.endswith(".xcframework")) and folder_name in embed_framework_sources:
|
||||
embed_framework_paths.append(os.path.abspath(root))
|
||||
target_names = find_app_target_names(project)
|
||||
print(f"💡 add_file_to_embed_frameworks target_names {embed_framework_paths}")
|
||||
print(f"💡 add_file_to_embed_frameworks target_names {target_names}")
|
||||
for framework in embed_framework_paths:
|
||||
for target_name in target_names:
|
||||
add_file_to_project(project, framework, target_name=target_name, skip_if_exsit=False)
|
||||
project.save()
|
||||
|
||||
def process_wechat_setting(project,info_plist_path, app_target_name):
|
||||
print(f"💡 process_wechat_setting ")
|
||||
wechat_config = build_config.get('login').get('wechat')
|
||||
if wechat_config.get('wxAppId') and wechat_config.get('wxUniversalLink'):
|
||||
add_array_to_info_plist(info_plist_path, 'LSApplicationQueriesSchemes', ['weixin','weixinULAPI','weixinURLParamsAPI','wechat'])
|
||||
url_scheme = {
|
||||
'CFBundleURLName': 'wx',
|
||||
'CFBundleURLSchemes': [wechat_config.get('wxAppId')]
|
||||
}
|
||||
add_array_to_info_plist(info_plist_path, 'CFBundleURLTypes', [url_scheme])
|
||||
add_associated_domains_capability(project, wechat_config.get('wxUniversalLink'), app_target_name)
|
||||
else:
|
||||
print(f"❌ process_wechat_setting configs are incomplete ")
|
||||
|
||||
def process_yidunlivedetect_setting(project,info_plist_path):
|
||||
print(f"💡 process_yidunlivedetect_setting ")
|
||||
channel_config = build_config.get('login').get('yidunlivedetect')
|
||||
if channel_config.get('businessId'):
|
||||
add_string_to_info_plist(info_plist_path, 'kYiDunLiveDetectBusinessId', channel_config.get('businessId'), False)
|
||||
if not channel_config.get('NSPhotoLibraryUsageDescription'):
|
||||
add_string_to_info_plist(info_plist_path, 'NSPhotoLibraryUsageDescription', '相册权限文案')
|
||||
else:
|
||||
add_string_to_info_plist(info_plist_path, 'NSPhotoLibraryUsageDescription', channel_config.get('NSPhotoLibraryUsageDescription'))
|
||||
if not channel_config.get('NSCameraUsageDescription'):
|
||||
add_string_to_info_plist(info_plist_path, 'NSCameraUsageDescription', '相机权限文案')
|
||||
else:
|
||||
add_string_to_info_plist(info_plist_path, 'NSCameraUsageDescription', channel_config.get('NSCameraUsageDescription'))
|
||||
else:
|
||||
print(f"❌ process_yidunlivedetect_setting configs are incomplete ")
|
||||
|
||||
def process_facebook_setting(project,info_plist_path):
|
||||
print(f"💡 process_facebook_setting ")
|
||||
channel_config = build_config.get('login').get('facebook')
|
||||
if channel_config.get('facebookAppId') and channel_config.get('facebookClientToken') and channel_config.get('facebookDisplayName'):
|
||||
facebookAppId = channel_config.get('facebookAppId')
|
||||
add_string_to_info_plist(info_plist_path, 'FacebookAppID', facebookAppId, False)
|
||||
add_string_to_info_plist(info_plist_path, 'FacebookClientToken', channel_config.get('facebookClientToken'), False)
|
||||
add_string_to_info_plist(info_plist_path, 'FacebookDisplayName', channel_config.get('facebookDisplayName'), False)
|
||||
add_array_to_info_plist(info_plist_path, 'LSApplicationQueriesSchemes', ['fb-messenger-share-api','fbapi'])
|
||||
url_scheme = {
|
||||
'CFBundleURLName': 'fb',
|
||||
'CFBundleURLSchemes': [f'fb{facebookAppId}']
|
||||
}
|
||||
add_array_to_info_plist(info_plist_path, 'CFBundleURLTypes', [url_scheme])
|
||||
else:
|
||||
print(f"❌ process_facebook_setting configs are incomplete ")
|
||||
|
||||
def process_google_setting(project,info_plist_path):
|
||||
print(f"💡 process_google_setting ")
|
||||
channel_config = build_config.get('login').get('google')
|
||||
googleiOSClientId = channel_config.get('googleiOSClientId')
|
||||
if googleiOSClientId:
|
||||
add_string_to_info_plist(info_plist_path, 'GIDClientID', googleiOSClientId, False)
|
||||
fanzhuan_google_client_id = ".".join(googleiOSClientId.split(".")[::-1])
|
||||
url_scheme = {
|
||||
'CFBundleURLName': 'google',
|
||||
'CFBundleURLSchemes': [fanzhuan_google_client_id]
|
||||
}
|
||||
add_array_to_info_plist(info_plist_path, 'CFBundleURLTypes', [url_scheme])
|
||||
else:
|
||||
print(f"❌ process_google_setting configs are incomplete ")
|
||||
|
||||
def process_line_setting(project,info_plist_path):
|
||||
print(f"💡 process_line_setting ")
|
||||
channel_config = build_config.get('login').get('line')
|
||||
if channel_config.get('TYLineChannelID') and channel_config.get('TYLineLinkURL'):
|
||||
add_string_to_info_plist(info_plist_path, 'TYLineChannelID', channel_config.get('TYLineChannelID'), False)
|
||||
add_string_to_info_plist(info_plist_path, 'TYLineLinkURL', channel_config.get('TYLineLinkURL'), False)
|
||||
add_array_to_info_plist(info_plist_path, 'LSApplicationQueriesSchemes', ['lineauth2'])
|
||||
package = build_config.get('package')
|
||||
url_scheme = {
|
||||
'CFBundleURLName': 'line',
|
||||
'CFBundleURLSchemes': [f'line3rdp.{package}']
|
||||
}
|
||||
add_array_to_info_plist(info_plist_path, 'CFBundleURLTypes', [url_scheme])
|
||||
try:
|
||||
result = subprocess.run(["where", "carthage"], capture_output=True, text=True, check=True)
|
||||
carthage_path = result.stdout.strip().split("\n")[0]
|
||||
shell_scrip = f"{carthage_path} copy-frameworks"
|
||||
target_names = find_app_target_names(project)
|
||||
add_shell_script(project, shell_scrip, target_name=target_names)
|
||||
except subprocess.CalledProcessError:
|
||||
print(f"❌ process_line_setting Carthage not exist ")
|
||||
exit(1)
|
||||
else:
|
||||
print(f"❌ process_line_setting configs are incomplete ")
|
||||
|
||||
def process_twitter_setting(project,info_plist_path):
|
||||
print(f"💡 process_twitter_setting ")
|
||||
channel_config = build_config.get('login').get('twitter')
|
||||
if channel_config.get('twitterClientid') and channel_config.get('twitterSpoce'):
|
||||
add_string_to_info_plist(info_plist_path, 'TYTwitterClientid', channel_config.get('twitterClientid'), False)
|
||||
add_array_to_info_plist(info_plist_path, 'TYTwitterSpoce', list(channel_config.get('twitterSpoce')))
|
||||
else:
|
||||
print(f"❌ process_twitter_setting configs are incomplete ")
|
||||
|
||||
def process_rongheguiyin_setting(project, info_plist_path):
|
||||
channel_config = build_config.get('login').get('rongheguiyin')
|
||||
url_scheme = {
|
||||
'CFBundleURLName': 'rongheguiyin',
|
||||
'CFBundleURLSchemes': [build_config.get('package')]
|
||||
}
|
||||
add_array_to_info_plist(info_plist_path, 'CFBundleURLTypes', [url_scheme])
|
||||
if channel_config and 'RongHeGuiYinStrategy' in channel_config:
|
||||
add_bool_to_info_plist(info_plist_path, "RongHeGuiYinStrategy", channel_config.get('RongHeGuiYinStrategy'), False)
|
||||
|
||||
def process_aihelp_setting(project, info_plist_path):
|
||||
channel_config = build_config.get('login').get('aihelp')
|
||||
if channel_config.get('TYAIHelpAppID') and channel_config.get('TYAIHelpDomainName') and channel_config.get('TYAIHelpLanguage'):
|
||||
add_string_to_info_plist(info_plist_path, 'TYAIHelpAppID', channel_config.get('TYAIHelpAppID'), False)
|
||||
add_string_to_info_plist(info_plist_path, 'TYAIHelpDomainName', channel_config.get('TYAIHelpDomainName'), False)
|
||||
add_string_to_info_plist(info_plist_path, 'TYAIHelpLanguage', channel_config.get('TYAIHelpLanguage'), False)
|
||||
add_string_to_info_plist(info_plist_path, 'NSPhotoLibraryUsageDescription', channel_config.get('NSPhotoLibraryUsageDescription'), False)
|
||||
add_bool_to_info_plist(info_plist_path, 'PHPhotoLibraryPreventAutomaticLimitedAccessAlert', channel_config.get('PHPhotoLibraryPreventAutomaticLimitedAccessAlert'), False)
|
||||
else:
|
||||
print(f"❌ process_aihelp_setting configs are incomplete ")
|
||||
|
||||
def process_bugly_setting(project, info_plist_path):
|
||||
channel_config = build_config.get('login').get('bugly')
|
||||
if channel_config.get('BuglyAppID'):
|
||||
add_string_to_info_plist(info_plist_path, 'BuglyAppID', channel_config.get('BuglyAppID'), False)
|
||||
else:
|
||||
print(f"❌ process_bugly_setting configs are incomplete ")
|
||||
|
||||
def get_info_plist_path(project_path, target_name):
|
||||
path = os.path.join(project_path, f'Info.plist')
|
||||
if os.path.exists(path):
|
||||
info_plist_path = path
|
||||
else:
|
||||
path = os.path.join(project_path, f'{target_name}/Info.plist')
|
||||
if os.path.exists(path):
|
||||
info_plist_path = path
|
||||
print(f"💡 get_info_plist_path {info_plist_path}")
|
||||
return info_plist_path
|
||||
|
||||
def process_project_setting(project_path, project_name, miniversion, target_name):
|
||||
print("2️⃣ process_project_setting")
|
||||
project_pbxproj_path = os.path.join(project_path, f'{project_name}/project.pbxproj')
|
||||
# 工程
|
||||
project = XcodeProject.load(project_pbxproj_path)
|
||||
# plist文件
|
||||
info_plist_path = get_info_plist_path(project_path, target_name)
|
||||
target_names = find_app_target_names(project)
|
||||
if len(target_names) != 0:
|
||||
app_target_name = target_names[0]
|
||||
else:
|
||||
app_target_name = None
|
||||
# 基础设置: 钥匙串 apple登录 applink C++兼容 swift
|
||||
add_file_to_project(project, coustom_plist_file_path, skip_if_exsit=False)
|
||||
project.add_other_ldflags(['$(inherited)', '-ObjC', '-all_load'])
|
||||
add_sign_in_with_apple_capability(project, app_target_name)
|
||||
set_library_search_paths(project, [])
|
||||
# add_keychain_capability(project, app_target_name)
|
||||
|
||||
# 遍历设置每一个渠道所需信息
|
||||
print(f"2️⃣ process_project_setting {build_sdk_names_list}")
|
||||
for channel_name in build_sdk_names_list:
|
||||
if channel_name in CHANNEL_AND_NAME_LIST:
|
||||
if channel_name == "fcm" or channel_name == "push":
|
||||
print(f"💡 process_{channel_name}_setting ")
|
||||
channel_config = build_config.get(channel_name)
|
||||
add_dependencies_set(channel_config.get('podDependencies'))
|
||||
if channel_name == "push":
|
||||
add_notification_capability(project, app_target_name)
|
||||
add_background_modes_capability(info_plist_path)
|
||||
else:
|
||||
channel_config = build_config.get('login').get(channel_name)
|
||||
add_dependencies_set(channel_config.get('podDependencies'))
|
||||
if channel_name == "wechat":
|
||||
process_wechat_setting(project, info_plist_path, app_target_name)
|
||||
elif channel_name == "wangyiyidun" or channel_name == "yidunloginv2":
|
||||
if channel_config.get('unionSpecialLogo'):
|
||||
union_special_logo_path = os.path.join(project_path, 'union_special_logo.png')
|
||||
add_file_to_project(project, union_special_logo_path, skip_if_exsit=False)
|
||||
project.add_other_ldflags(['$(inherited)', '-fprofile-instr-generate'])
|
||||
elif channel_name == "yidunzhiwen":
|
||||
add_string_to_info_plist(info_plist_path, 'kYiDunDeviceBusinessId', channel_config.get('businessId'), False)
|
||||
elif channel_name == "yiduncaptcha":
|
||||
add_string_to_info_plist(info_plist_path, 'kYiDunCaptchaBusinessId', channel_config.get('businessId'), False)
|
||||
if channel_config.get('kYiDunCaptchaCloseBtn'):
|
||||
add_string_to_info_plist(info_plist_path, 'kYiDunCaptchaCloseBtn', "1", False)
|
||||
elif channel_name == "yidunlivedetect":
|
||||
process_yidunlivedetect_setting(project, info_plist_path)
|
||||
elif channel_name == "appsflyer":
|
||||
add_string_to_info_plist(info_plist_path, 'TYAppsFlyerAppleAppId', channel_config.get('appsFlyerAppleAppId'), False)
|
||||
add_string_to_info_plist(info_plist_path, 'TYAppsFlyerDevkey', channel_config.get('appsFlyerDevkey'), False)
|
||||
elif channel_name == "firebaseanalytics":
|
||||
google_plist_path = os.path.join(project_path, 'GoogleService-Info.plist')
|
||||
add_file_to_project(project, google_plist_path, skip_if_exsit=False)
|
||||
elif channel_name == "facebook":
|
||||
process_facebook_setting(project, info_plist_path)
|
||||
elif channel_name == "google":
|
||||
process_google_setting(project, info_plist_path)
|
||||
elif channel_name == "line":
|
||||
process_line_setting(project, info_plist_path)
|
||||
elif channel_name == "twitter":
|
||||
process_twitter_setting(project, info_plist_path)
|
||||
elif channel_name == "rongheguiyin":
|
||||
process_rongheguiyin_setting(project, info_plist_path)
|
||||
elif channel_name == "douyin":
|
||||
douyin_config_path = os.path.join(project_path, 'UOPSDKConfig.json')
|
||||
add_file_to_project(project, douyin_config_path, skip_if_exsit=False)
|
||||
elif channel_name == "aihelp":
|
||||
process_aihelp_setting(project, info_plist_path)
|
||||
elif channel_name == "bugly":
|
||||
process_bugly_setting(project, info_plist_path)
|
||||
elif channel_name == "firebasecrashlytics":
|
||||
input_files = [
|
||||
'${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}',
|
||||
'$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)'
|
||||
]
|
||||
shell_scrip = '"$SRCROOT/Pods/FirebaseCrashlyticsSDK/run"'
|
||||
target_names = find_app_target_names(project)
|
||||
print(f'✅ target_namestarget_namestarget_names = {target_names}')
|
||||
add_shell_script(project, shell_scrip, target_name=target_names, input_files=input_files)
|
||||
project.set_flags('DEBUG_INFORMATION_FORMAT', 'dwarf-with-dsym')
|
||||
elif channel_name == "firebaseodm":
|
||||
add_bool_to_info_plist(info_plist_path, 'kFirebaseODM', True, False)
|
||||
|
||||
project.save()
|
||||
# 处理pod文件,并install
|
||||
podfile_path = os.path.join(project_path, "Podfile")
|
||||
add_dependencies_set(build_config.get('tuyooParam').get('podDependencies'))
|
||||
process_podfile(podfile_path, app_target_name, target_name, miniversion, dependencies)
|
||||
install_podfile(project_path)
|
||||
if app_target_name and app_target_name != target_name:
|
||||
copy_bundle_to_main_projet(project, project_path)
|
||||
add_file_to_embed_frameworks(project, project_path)
|
||||
install_podfile(project_path)
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(f'✅ input info {argparse}')
|
||||
|
||||
parser = argparse.ArgumentParser(description="Process some integers.")
|
||||
parser.add_argument('--configFile', type=str, required=True, help='build config json path')
|
||||
parser.add_argument('--workspace', type=str, required=True, help='export ipa project path')
|
||||
parser.add_argument('--minos', type=str, required=True, help='miniversion')
|
||||
parser.add_argument('--targetName', type=str, help='target_name')
|
||||
args = parser.parse_args()
|
||||
print(f"args: {args}")
|
||||
if args.configFile:
|
||||
build_config_json_path = args.configFile
|
||||
else:
|
||||
print('❌ config json path not set')
|
||||
exit(1)
|
||||
|
||||
if args.workspace:
|
||||
export_ipa_project_path = args.workspace
|
||||
if not export_ipa_project_path or not os.path.isdir(export_ipa_project_path):
|
||||
print('❌ project path not set')
|
||||
exit(1)
|
||||
xcodeproj_path = ''
|
||||
project_name = ''
|
||||
for file in os.listdir(export_ipa_project_path):
|
||||
xcodeproj_path = os.path.join(export_ipa_project_path, file)
|
||||
if os.path.exists(xcodeproj_path) and xcodeproj_path.endswith('.xcodeproj'):
|
||||
project_name = os.path.basename(xcodeproj_path)
|
||||
print(f"✅ project 文件存在: {project_name} - {xcodeproj_path}")
|
||||
break
|
||||
|
||||
if args.minos:
|
||||
miniversion = args.minos
|
||||
if args.targetName:
|
||||
target_name = args.targetName
|
||||
|
||||
if not miniversion:
|
||||
miniversion = IOSMINIVERSION
|
||||
if not target_name:
|
||||
target_name = target_name = os.path.splitext(project_name)[0]
|
||||
|
||||
print(f"✅ 打包基础信息:\n build_config_json_path - {build_config_json_path} \n export_ipa_project_path - {export_ipa_project_path} \n project_name - {project_name} \n miniversion - {miniversion} \n target_name - {target_name}")
|
||||
if os.path.exists(xcodeproj_path) and project_name != '':
|
||||
# 解析配置信息
|
||||
costom_plist_file_path = os.path.join(export_ipa_project_path, 'EngineSdkBaseInfo.plist')
|
||||
parse_build_config_json(build_config_json_path, costom_plist_file_path)
|
||||
# SDK+渠道配置
|
||||
process_project_setting(export_ipa_project_path, project_name, miniversion, target_name)
|
||||
else:
|
||||
print('❌ xcodeproj file not exist')
|
||||
exit(1)
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 687db4b74404e453abf9203b736952a3
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,69 @@
|
||||
using System.IO;
|
||||
using UnityEditor;
|
||||
using UnityEditor.Callbacks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace EngineSdkConverter.Unity.Editor
|
||||
{
|
||||
public class TYPostProcessiOS
|
||||
{
|
||||
const string TAG = "TYPostProcessiOS OnPostProcessBuild ";
|
||||
const string ENGINE_SDK_CONVERTER_RESOURCE_FROM_UNITY_RELATIVE_PATH = "EngineSdkConverter/Unity/Editor/iOS";
|
||||
|
||||
const string ENGINE_SDK_CONVERTER_PLUGINS_FROM_UNITY_RELATIVE_PATH = "EngineSdkConverter/Unity/Plugins/iOS";
|
||||
const string ENGINE_SDK_CONVERTER_PYTHON_PACKAGE_SITE_PATH = "EngineSdkConverter/Unity/Plugins/iOS/python_sites";
|
||||
const string GAME_BUILD_CONFIG_FILE_PATH = "gameConfigs";
|
||||
const string GAME_BUILD_CONFIG_FILE_NAME = "gameconfig.json";
|
||||
|
||||
const string UNION_SPECIAL_LOGO = "union_special_logo.png";
|
||||
|
||||
// iOSSDK资源-脚本文件名称
|
||||
const string CUSTOMIZE_SCRIPT_FILE_NAME = "EngineSdkiOSBuildProcess.py";
|
||||
|
||||
// 项目Unity Traget Name
|
||||
const string UNITY_TARGET_NAME = "Unity-iPhone";
|
||||
const string UNITY_FRAMEWORK_TARGET_NAME = "UnityFramework";
|
||||
|
||||
[PostProcessBuild(49)]
|
||||
public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
|
||||
{
|
||||
Debug.Log(TAG + " start " + path);
|
||||
|
||||
if (buildTarget == BuildTarget.iOS)
|
||||
{
|
||||
Debug.Log(TAG + "start");
|
||||
// 移动脚本/配置 - 运行脚本
|
||||
string resourceOfUnityPluginsPath = Path.Combine(Application.dataPath, ENGINE_SDK_CONVERTER_RESOURCE_FROM_UNITY_RELATIVE_PATH);
|
||||
string pythonPackageSitePath = Path.Combine(Application.dataPath, ENGINE_SDK_CONVERTER_PYTHON_PACKAGE_SITE_PATH);
|
||||
string pluginsPath = Path.Combine(Application.dataPath, ENGINE_SDK_CONVERTER_PLUGINS_FROM_UNITY_RELATIVE_PATH);
|
||||
|
||||
string unionSpecialLogoPath = Path.Combine(pluginsPath, UNION_SPECIAL_LOGO);
|
||||
string targetUnionSpecialLogoPath = Path.Combine(path, UNION_SPECIAL_LOGO);
|
||||
File.Copy(unionSpecialLogoPath, targetUnionSpecialLogoPath, true);
|
||||
|
||||
string customScriptPath = Path.Combine(resourceOfUnityPluginsPath, CUSTOMIZE_SCRIPT_FILE_NAME);
|
||||
string targetScriptPath = Path.Combine(path, CUSTOMIZE_SCRIPT_FILE_NAME);
|
||||
File.Copy(customScriptPath, targetScriptPath, true);
|
||||
// 资源
|
||||
string customGameConfigPath = Path.Combine(resourceOfUnityPluginsPath, GAME_BUILD_CONFIG_FILE_PATH);
|
||||
string targetGameConfigPath = path;
|
||||
EngineSdkConverterUtils.CopyDirectory(customGameConfigPath, targetGameConfigPath, true);
|
||||
EngineSdkConverterUtils.CopyDirectory(pythonPackageSitePath, targetGameConfigPath, true);
|
||||
string targetConfigPath = Path.Combine(path, GAME_BUILD_CONFIG_FILE_NAME);
|
||||
TryRunBuildScript(path, targetScriptPath, targetConfigPath);
|
||||
}
|
||||
}
|
||||
|
||||
static void TryRunBuildScript(string workspace, string scriptFilePath, string configFilePath)
|
||||
{
|
||||
Debug.Log(TAG + " TryRunBuildScript start " + workspace + " " + scriptFilePath);
|
||||
string iosMinOSVersion = PlayerSettings.iOS.targetOSVersionString;
|
||||
string arguments = $"--configFile \"{configFilePath}\" --workspace \"{workspace}\" --minos \"{iosMinOSVersion}\" --targetName \"{UNITY_FRAMEWORK_TARGET_NAME}\"";
|
||||
Debug.Log(TAG + $"EngineSDKConverter RunPython arguments :{arguments} ");
|
||||
Result buildResult = EngineSdkConverterUtils.RunPython(scriptFilePath, arguments, workspace);
|
||||
Debug.Log(TAG + $"EngineSDKConverter buildResult error :{buildResult.ExitCode} ");
|
||||
Debug.Log(TAG + $"EngineSDKConverter buildResult error :{buildResult.Message} ");
|
||||
Debug.Log(TAG + "TryRunBuildScript finish");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3c05b2395d8b1438e9a2340e07356dff
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Packages/com.bywaystudios.tuyoosdk/Plugins.meta
Normal file
8
Packages/com.bywaystudios.tuyoosdk/Plugins.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: df2ae868d776f465c971b79b02356948
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Packages/com.bywaystudios.tuyoosdk/Plugins/WebGL.meta
Normal file
8
Packages/com.bywaystudios.tuyoosdk/Plugins/WebGL.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc6ad16c05bd04a12a8726fed4ef7a5b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6d4cdd383393d49448f34dc594d8d244
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3cbd9f85438a64df39f96a750daa1685
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,228 @@
|
||||
var TuyooSdkBridge = {
|
||||
|
||||
loadJsScriptToBridge: function (channelType) {
|
||||
var channelTypeFromCS = UTF8ToString(channelType);
|
||||
console.log("channelTypeFromCS:" + channelTypeFromCS);
|
||||
var TuyooSdk;
|
||||
if (channelTypeFromCS == "ali.cn.minigame") {
|
||||
TuyooSdk = require("./tuyoosdk_aliminigame_1.0.4.250915_release.js");
|
||||
}
|
||||
window.TuyooSdk = TuyooSdk;
|
||||
},
|
||||
|
||||
InitToBridge: function (initEventInfo) {
|
||||
try {
|
||||
var initCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "InitResult", callbackString);
|
||||
}
|
||||
var initInfoFromCS = UTF8ToString(initEventInfo);
|
||||
var initInfo = JSON.parse(initInfoFromCS);
|
||||
var tyInitParams = {};
|
||||
tyInitParams.appId = initInfo.tuyooParam.appId;
|
||||
tyInitParams.gameId = initInfo.tuyooParam.gameId;
|
||||
tyInitParams.pay_version = "hall37";
|
||||
tyInitParams.baseurl = initInfo.tuyooParam.serverUrl.endsWith("/") ? initInfo.tuyooParam.serverUrl : initInfo.tuyooParam.serverUrl + "/";
|
||||
tyInitParams.bi_base_url = "https://cbi.tuyoo.com/";
|
||||
tyInitParams.cloudId = initInfo.tuyooParam.cloudId;
|
||||
tyInitParams.packageName = initInfo.package;
|
||||
tyInitParams.clientId = initInfo.tuyooParam.clientId;
|
||||
tyInitParams.ali_appId = initInfo.login.aliminigame.ali_appId;
|
||||
console.log("initInfo: " + JSON.stringify(initInfo));
|
||||
window.TuyooSdk.OnInit(initInfo.tuyooParam.channelType, tyInitParams, initCallback, this);
|
||||
} catch (e) {
|
||||
console.error("InitToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
// 切换SDK域名
|
||||
UpdateServerUrlToBridge: function (serverUrl) {
|
||||
try {
|
||||
var serverUrlFromCS = UTF8ToString(serverUrl);
|
||||
window.TuyooSdk.baseuri = (serverUrlFromCS.substring(serverUrlFromCS.length - 1) === '/') ? serverUrlFromCS.substring(0, serverUrlFromCS.length - 1) : serverUrlFromCS;
|
||||
console.log("update serverUrl to: " + window.TuyooSdk.baseuri);
|
||||
} catch (e) {
|
||||
console.error("UpdateServerUrlToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
LoginToBridge: function (loginEventInfo) {
|
||||
try {
|
||||
var loginCallback = function (code, result, error) {
|
||||
var callbackResult = {
|
||||
code: code,
|
||||
result: result && result.logindata ? result.logindata : result,
|
||||
error: error
|
||||
};
|
||||
var callbackString = JSON.stringify(callbackResult);
|
||||
SendMessage("NativeCallBack", "LoginResult", callbackString);
|
||||
}
|
||||
var loginInfoFromCS = UTF8ToString(loginEventInfo);
|
||||
var loginInfo = JSON.parse(loginInfoFromCS);
|
||||
var tyLoginParams = {};
|
||||
if (loginInfo.loginType) {
|
||||
tyLoginParams.ChannelType = loginInfo.loginType;
|
||||
}
|
||||
if (loginInfo.extraParams) {
|
||||
var extraParams = JSON.parse(loginInfo.extraParams);
|
||||
tyLoginParams.extraParams = extraParams;
|
||||
}
|
||||
console.log("tyLoginParams: " + JSON.stringify(tyLoginParams));
|
||||
window.TuyooSdk.Login(tyLoginParams, loginCallback, this);
|
||||
} catch (e) {
|
||||
console.error("LoginToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
PayToBridge: function (payEventInfo) {
|
||||
try {
|
||||
var payCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "PayResult", callbackString);
|
||||
}
|
||||
var payInfoFromCS = UTF8ToString(payEventInfo);
|
||||
var payInfo = JSON.parse(payInfoFromCS);
|
||||
var tyPayParams = {};
|
||||
tyPayParams.prodCount = 1;
|
||||
tyPayParams.appInfo = "";
|
||||
if (payInfo.chargeService) {
|
||||
tyPayParams.ChargeType = payInfo.chargeService;
|
||||
}
|
||||
if (payInfo.productCount) {
|
||||
tyPayParams.prodCount = payInfo.productCount;
|
||||
}
|
||||
if (payInfo.serverAppInfo) {
|
||||
tyPayParams.appInfo = payInfo.serverAppInfo;
|
||||
}
|
||||
if (payInfo.gameOrderId) {
|
||||
tyPayParams.prodOrderId = payInfo.gameOrderId;
|
||||
}
|
||||
if (payInfo.extraParams) {
|
||||
var extraParams = JSON.parse(payInfo.extraParams);
|
||||
tyPayParams.extraParams = extraParams;
|
||||
}
|
||||
tyPayParams.prodId = payInfo.productId;
|
||||
tyPayParams.prodName = payInfo.productName;
|
||||
tyPayParams.prodPrice = payInfo.productPrice;
|
||||
console.log("tyPayParams: " + JSON.stringify(tyPayParams));
|
||||
window.TuyooSdk.Pay(tyPayParams, payCallback, this);
|
||||
} catch (e) {
|
||||
console.error("PayToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
SetShareInfoToBridge: function (shareEventInfo) {
|
||||
try {
|
||||
var shareCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "ShareResult", callbackString);
|
||||
}
|
||||
var shareInfoFromCS = UTF8ToString(shareEventInfo);
|
||||
var shareInfo = JSON.parse(shareInfoFromCS);
|
||||
var shareInfoToJs = shareInfo.resource;
|
||||
shareInfoToJs.callback = shareCallback;
|
||||
console.log("shareInfoToJs: " + JSON.stringify(shareInfoToJs));
|
||||
window.TuyooSdk.SetDefaultShareInfo(shareInfoToJs);
|
||||
} catch (e) {
|
||||
console.error("SetShareInfoToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
ShareToBridge: function (shareEventInfo) {
|
||||
try {
|
||||
var shareCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "ShareResult", callbackString);
|
||||
}
|
||||
var shareInfoFromCS = UTF8ToString(shareEventInfo);
|
||||
var shareInfo = JSON.parse(shareInfoFromCS);
|
||||
var shareInfoToJs = shareInfo.resource;
|
||||
console.log("shareInfoToJs: " + JSON.stringify(shareInfoToJs));
|
||||
window.TuyooSdk.Share(shareInfoToJs, shareCallback);
|
||||
} catch (e) {
|
||||
console.error("ShareToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAEventTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
if (!reportInfo.typeName) {
|
||||
reportInfo.typeName = "track";
|
||||
}
|
||||
window.TuyooSdk.bi.trackWithType(reportInfo.typeName, reportInfo.eventName, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAEventTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAProfileTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
window.TuyooSdk.bi.profileTrack(reportInfo.profileType, reportInfo.profileSubjectType, reportInfo.profileSubjectPrimary, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAProfileTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GetShareInfoBridge: function (shareEventInfo) {
|
||||
console.error("current channel not support GetShareInfo function");
|
||||
},
|
||||
|
||||
GetAdInfoBridge: function () {
|
||||
console.error("current channel not support GetAdInfo function");
|
||||
},
|
||||
|
||||
TxAdSDKReportToBridge: function (txAdReportInfo) {
|
||||
console.error("current channel not support TxAdSDKReport function");
|
||||
},
|
||||
|
||||
CheckBindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support CheckBind function");
|
||||
},
|
||||
|
||||
SendSmsCodeToBridge: function (loginEventInfo) {
|
||||
console.error("current channel not support SendSmsCode function");
|
||||
},
|
||||
|
||||
BindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support Bind function");
|
||||
},
|
||||
|
||||
SetWxUserInfoToBridge: function (type, userInfo) {
|
||||
console.error("current channel not support SetWxUserInfo function");
|
||||
},
|
||||
|
||||
GetDeviceLevelToBridge: function() {
|
||||
try {
|
||||
var callback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "GetDeviceLevelResult", callbackString);
|
||||
}
|
||||
window.TuyooSdk.getDeviceBenchmarkLevel(callback, this);
|
||||
} catch (error) {
|
||||
console.error("GetDeviceLevelToBridge catch error: " + error);
|
||||
}
|
||||
},
|
||||
|
||||
CreatGridGamePanelToBridge: function(gridGameModule) {
|
||||
console.error("current channel not support CreatGridGamePanel function");
|
||||
},
|
||||
|
||||
ShowGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support ShowGridGamePanel function");
|
||||
},
|
||||
|
||||
HideGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support HideGridGamePanel function");
|
||||
},
|
||||
|
||||
DestroyGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support DestroyGridGamePanel function");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
mergeInto(LibraryManager.library, TuyooSdkBridge);
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9ba02a912db5c43fe8d5e99add46e7e0
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b5a72e3fac2214d22b1626dcba46ba35
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8778c3a0c2fd54bd79e6da7000b3f202
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,300 @@
|
||||
var TuyooSdkBridge = {
|
||||
|
||||
loadJsScriptToBridge: function (channelType) {
|
||||
var channelTypeFromCS = UTF8ToString(channelType);
|
||||
console.log("channelTypeFromCS:" + channelTypeFromCS);
|
||||
},
|
||||
|
||||
InitToBridge: function (initEventInfo) {
|
||||
try {
|
||||
var initCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "InitResult", callbackString);
|
||||
}
|
||||
var initInfoFromCS = UTF8ToString(initEventInfo);
|
||||
var initInfo = JSON.parse(initInfoFromCS);
|
||||
var tyInitParams = {};
|
||||
tyInitParams.appId = initInfo.tuyooParam.appId;
|
||||
tyInitParams.gameId = initInfo.tuyooParam.gameId;
|
||||
tyInitParams.pay_version = "hall37";
|
||||
tyInitParams.baseurl = initInfo.tuyooParam.serverUrl.endsWith("/") ? initInfo.tuyooParam.serverUrl : initInfo.tuyooParam.serverUrl + "/";
|
||||
tyInitParams.bi_base_url = "https://cbi.tuyoo.com/";
|
||||
tyInitParams.cloudId = initInfo.tuyooParam.cloudId;
|
||||
tyInitParams.packageName = initInfo.package;
|
||||
tyInitParams.clientId = initInfo.tuyooParam.clientId;
|
||||
tyInitParams.jingdongAppId = initInfo.login.jingdongminigame.jingdongAppId;
|
||||
console.log("initInfo: " + JSON.stringify(initInfo));
|
||||
if (initInfo.login.jingdongminigame.packageType === "wasmsplit" && GameGlobal.tywx) {
|
||||
GameGlobal.tywx.StateInfo.debugMode = initInfo.debug.toLowerCase() === "true";
|
||||
GameGlobal.tywx.SystemInfo.loginUrl = initInfo.tuyooParam.serverUrl.endsWith("/") ? initInfo.tuyooParam.serverUrl : initInfo.tuyooParam.serverUrl + "/";
|
||||
GameGlobal.tywx.SystemInfo.clientId = initInfo.tuyooParam.clientId;
|
||||
GameGlobal.tywx.SystemInfo.cloudId = initInfo.tuyooParam.cloudId;
|
||||
GameGlobal.tywx.SystemInfo.appId = initInfo.tuyooParam.appId;
|
||||
GameGlobal.tywx.SystemInfo.gameId = initInfo.tuyooParam.gameId;
|
||||
GameGlobal.tywx.SystemInfo.wxAppId = initInfo.login.tywx.wx_appId;
|
||||
GameGlobal.tywx.SystemInfo.packageName = initInfo.package;
|
||||
}
|
||||
GameGlobal.TuyooSdk.OnInit(initInfo.tuyooParam.channelType, tyInitParams, initCallback, this);
|
||||
} catch (e) {
|
||||
console.error("InitToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
// 切换SDK域名
|
||||
UpdateServerUrlToBridge: function (serverUrl) {
|
||||
try {
|
||||
var serverUrlFromCS = UTF8ToString(serverUrl);
|
||||
window.TuyooSdk.baseuri = (serverUrlFromCS.substring(serverUrlFromCS.length - 1) === '/') ? serverUrlFromCS.substring(0, serverUrlFromCS.length - 1) : serverUrlFromCS;
|
||||
console.log("update serverUrl to: " + window.TuyooSdk.baseuri);
|
||||
} catch (e) {
|
||||
console.error("UpdateServerUrlToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
LoginToBridge: function (loginEventInfo) {
|
||||
try {
|
||||
var loginCallback = function (code, result, error) {
|
||||
var callbackResult = {
|
||||
code: code,
|
||||
result: result && result.logindata ? result.logindata : result,
|
||||
error: error
|
||||
};
|
||||
var callbackString = JSON.stringify(callbackResult);
|
||||
SendMessage("NativeCallBack", "LoginResult", callbackString);
|
||||
}
|
||||
var loginInfoFromCS = UTF8ToString(loginEventInfo);
|
||||
var loginInfo = JSON.parse(loginInfoFromCS);
|
||||
if (loginInfo.loginType === "wx.cn.minigame" && GameGlobal.tywx) {
|
||||
GameGlobal.tywx.TuyooSDK.login(loginCallback);
|
||||
return;
|
||||
}
|
||||
var tyLoginParams = {};
|
||||
if (loginInfo.loginType) {
|
||||
tyLoginParams.ChannelType = loginInfo.loginType;
|
||||
}
|
||||
if (loginInfo.extraParams) {
|
||||
var extraParams = JSON.parse(loginInfo.extraParams);
|
||||
tyLoginParams.extraParams = extraParams;
|
||||
}
|
||||
console.log("tyLoginParams: " + JSON.stringify(tyLoginParams));
|
||||
GameGlobal.TuyooSdk.Login(tyLoginParams, loginCallback, this);
|
||||
} catch (e) {
|
||||
console.error("LoginToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
PayToBridge: function (payEventInfo) {
|
||||
try {
|
||||
var payCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "PayResult", callbackString);
|
||||
}
|
||||
var payInfoFromCS = UTF8ToString(payEventInfo);
|
||||
var payInfo = JSON.parse(payInfoFromCS);
|
||||
var tyPayParams = {};
|
||||
tyPayParams.prodCount = 1;
|
||||
tyPayParams.appInfo = "";
|
||||
if (payInfo.chargeService) {
|
||||
tyPayParams.ChargeType = payInfo.chargeService;
|
||||
}
|
||||
if (payInfo.productCount) {
|
||||
tyPayParams.prodCount = payInfo.productCount;
|
||||
}
|
||||
if (payInfo.serverAppInfo) {
|
||||
tyPayParams.appInfo = payInfo.serverAppInfo;
|
||||
}
|
||||
if (payInfo.gameOrderId) {
|
||||
tyPayParams.prodOrderId = payInfo.gameOrderId;
|
||||
}
|
||||
if (payInfo.extraParams) {
|
||||
var extraParams = JSON.parse(payInfo.extraParams);
|
||||
if(extraParams.jingdongCurrency) {
|
||||
tyPayParams.jingdongCurrency = extraParams.jingdongCurrency;
|
||||
delete extraParams.jingdongCurrency;
|
||||
}
|
||||
tyPayParams.extraParams = extraParams;
|
||||
}
|
||||
tyPayParams.prodId = payInfo.productId;
|
||||
tyPayParams.prodName = payInfo.productName;
|
||||
tyPayParams.prodPrice = payInfo.productPrice;
|
||||
console.log("tyPayParams: " + JSON.stringify(tyPayParams));
|
||||
GameGlobal.TuyooSdk.Pay(tyPayParams, payCallback, this);
|
||||
} catch (e) {
|
||||
console.error("PayToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
SetShareInfoToBridge: function (shareEventInfo) {
|
||||
try {
|
||||
var shareCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "ShareResult", callbackString);
|
||||
}
|
||||
var shareInfoFromCS = UTF8ToString(shareEventInfo);
|
||||
var shareInfo = JSON.parse(shareInfoFromCS);
|
||||
var shareInfoToJs = shareInfo.resource;
|
||||
var tyShareParams = {};
|
||||
shareInfoToJs.title && (tyShareParams.title = shareInfoToJs.title);
|
||||
shareInfoToJs.imageUrl && (tyShareParams.imageUrl = shareInfoToJs.imageUrl);
|
||||
shareInfoToJs.desc && (tyShareParams.desc = shareInfoToJs.desc);
|
||||
shareInfoToJs.type && (tyShareParams.type = shareInfoToJs.type);
|
||||
if(shareInfoToJs.extraParams) {
|
||||
var extraParams = JSON.parse(shareInfoToJs.extraParams);
|
||||
if(extraParams.channel) {
|
||||
tyShareParams.channel = extraParams.channel;
|
||||
delete extraParams.channel;
|
||||
}
|
||||
if(extraParams.url) {
|
||||
tyShareParams.url = extraParams.url;
|
||||
delete extraParams.url;
|
||||
}
|
||||
if(extraParams.keyShareChannel) {
|
||||
tyShareParams.keyShareChannel = extraParams.keyShareChannel;
|
||||
delete extraParams.keyShareChannel;
|
||||
}
|
||||
if(extraParams.localImageUrl) {
|
||||
tyShareParams.localImageUrl = extraParams.localImageUrl;
|
||||
delete extraParams.localImageUrl;
|
||||
}
|
||||
if(extraParams.onlineImageUrl) {
|
||||
tyShareParams.onlineImageUrl = extraParams.onlineImageUrl;
|
||||
delete extraParams.onlineImageUrl;
|
||||
}
|
||||
tyShareParams.extraParams = extraParams;
|
||||
}
|
||||
tyShareParams.callback = shareCallback;
|
||||
console.log("tyShareParams: " + JSON.stringify(tyShareParams));
|
||||
GameGlobal.TuyooSdk.SetDefaultShareInfo(tyShareParams);
|
||||
} catch (e) {
|
||||
console.error("SetShareInfoToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
ShareToBridge: function (shareEventInfo) {
|
||||
try {
|
||||
var shareCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "ShareResult", callbackString);
|
||||
}
|
||||
var shareInfoFromCS = UTF8ToString(shareEventInfo);
|
||||
var shareInfo = JSON.parse(shareInfoFromCS);
|
||||
var shareInfoToJs = shareInfo.resource;
|
||||
var tyShareParams = {};
|
||||
shareInfoToJs.title && (tyShareParams.title = shareInfoToJs.title);
|
||||
shareInfoToJs.imageUrl && (tyShareParams.imageUrl = shareInfoToJs.imageUrl);
|
||||
shareInfoToJs.desc && (tyShareParams.desc = shareInfoToJs.desc);
|
||||
shareInfoToJs.type && (tyShareParams.type = shareInfoToJs.type);
|
||||
if(shareInfoToJs.extraParams) {
|
||||
var extraParams = JSON.parse(shareInfoToJs.extraParams);
|
||||
if(extraParams.channel) {
|
||||
tyShareParams.channel = extraParams.channel;
|
||||
delete extraParams.channel;
|
||||
}
|
||||
if(extraParams.url) {
|
||||
tyShareParams.url = extraParams.url;
|
||||
delete extraParams.url;
|
||||
}
|
||||
if(extraParams.keyShareChannel) {
|
||||
tyShareParams.keyShareChannel = extraParams.keyShareChannel;
|
||||
delete extraParams.keyShareChannel;
|
||||
}
|
||||
if(extraParams.localImageUrl) {
|
||||
tyShareParams.localImageUrl = extraParams.localImageUrl;
|
||||
delete extraParams.localImageUrl;
|
||||
}
|
||||
if(extraParams.onlineImageUrl) {
|
||||
tyShareParams.onlineImageUrl = extraParams.onlineImageUrl;
|
||||
delete extraParams.onlineImageUrl;
|
||||
}
|
||||
tyShareParams.extraParams = extraParams;
|
||||
}
|
||||
console.log("tyShareParams: " + JSON.stringify(tyShareParams));
|
||||
GameGlobal.TuyooSdk.Share(tyShareParams, shareCallback);
|
||||
} catch (e) {
|
||||
console.error("ShareToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAEventTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
if (!reportInfo.typeName) {
|
||||
reportInfo.typeName = "track";
|
||||
}
|
||||
GameGlobal.TuyooSdk.bi.trackWithType(reportInfo.typeName, reportInfo.eventName, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAEventTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAProfileTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
GameGlobal.TuyooSdk.bi.profileTrack(reportInfo.profileType, reportInfo.profileSubjectType, reportInfo.profileSubjectPrimary, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAProfileTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GetShareInfoBridge: function (shareEventInfo) {
|
||||
console.error("current channel not support GetShareInfo function");
|
||||
},
|
||||
|
||||
GetAdInfoBridge: function () {
|
||||
console.error("current channel not support GetAdInfo function");
|
||||
},
|
||||
|
||||
TxAdSDKReportToBridge: function (txAdReportInfo) {
|
||||
console.error("current channel not support TxAdSDKReport function");
|
||||
},
|
||||
|
||||
CheckBindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support CheckBind function");
|
||||
},
|
||||
|
||||
SendSmsCodeToBridge: function (loginEventInfo) {
|
||||
console.error("current channel not support SendSmsCode function");
|
||||
},
|
||||
|
||||
BindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support Bind function");
|
||||
},
|
||||
|
||||
SetWxUserInfoToBridge: function (type, userInfo) {
|
||||
console.error("current channel not support SetWxUserInfo function");
|
||||
},
|
||||
|
||||
GetDeviceLevelToBridge: function() {
|
||||
// try {
|
||||
// var callback = function (code, result, error) {
|
||||
// var callbackString = JSON.stringify({ code, result, error });
|
||||
// SendMessage("NativeCallBack", "GetDeviceLevelResult", callbackString);
|
||||
// }
|
||||
// GameGlobal.TuyooSdk.getDeviceBenchmarkLevel(callback, this);
|
||||
// } catch (error) {
|
||||
// console.error("GetDeviceLevelToBridge catch error: " + error);
|
||||
// }
|
||||
console.error("current channel not support GetDeviceLevelToBridge function");
|
||||
},
|
||||
|
||||
CreatGridGamePanelToBridge: function(gridGameModule) {
|
||||
console.error("current channel not support CreatGridGamePanel function");
|
||||
},
|
||||
|
||||
ShowGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support ShowGridGamePanel function");
|
||||
},
|
||||
|
||||
HideGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support HideGridGamePanel function");
|
||||
},
|
||||
|
||||
DestroyGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support DestroyGridGamePanel function");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
mergeInto(LibraryManager.library, TuyooSdkBridge);
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5c3c4c83df2cf42639069d6e1e3bf76f
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 68b516af9e39e473891535f4e764041a
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 786cf4d95c48b4dbfacc52cdd9831796
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,170 @@
|
||||
var TuyooSdkBridge = {
|
||||
|
||||
loadJsScriptToBridge: function (channelType) {
|
||||
var channelTypeFromCS = UTF8ToString(channelType);
|
||||
console.log("channelTypeFromCS:" + channelTypeFromCS);
|
||||
},
|
||||
|
||||
InitToBridge: function (initEventInfo) {
|
||||
try {
|
||||
var initCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "InitResult", callbackString);
|
||||
}
|
||||
var initInfoFromCS = UTF8ToString(initEventInfo);
|
||||
var initInfo = JSON.parse(initInfoFromCS);
|
||||
var tyInitParams = {};
|
||||
tyInitParams.appId = initInfo.tuyooParam.appId;
|
||||
tyInitParams.gameId = initInfo.tuyooParam.gameId;
|
||||
tyInitParams.pay_version = "hall37";
|
||||
tyInitParams.baseurl = initInfo.tuyooParam.serverUrl.endsWith("/") ? initInfo.tuyooParam.serverUrl : initInfo.tuyooParam.serverUrl + "/";
|
||||
tyInitParams.bi_base_url = "https://cbi.tuyoo.com/";
|
||||
tyInitParams.cloudId = initInfo.tuyooParam.cloudId;
|
||||
tyInitParams.packageName = initInfo.package;
|
||||
tyInitParams.clientId = initInfo.tuyooParam.clientId;
|
||||
tyInitParams.kuaishou_appId = initInfo.login.kuaishouminigame.kuaishouAppId;
|
||||
console.log("initInfo: " + JSON.stringify(initInfo));
|
||||
GameGlobal.TuyooSdk.OnInit(initInfo.tuyooParam.channelType, tyInitParams, initCallback, this);
|
||||
} catch (e) {
|
||||
console.error("InitToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
// 切换SDK域名
|
||||
UpdateServerUrlToBridge: function (serverUrl) {
|
||||
try {
|
||||
var serverUrlFromCS = UTF8ToString(serverUrl);
|
||||
GameGlobal.TuyooSdk.baseuri = (serverUrlFromCS.substring(serverUrlFromCS.length - 1) === '/') ? serverUrlFromCS.substring(0, serverUrlFromCS.length - 1) : serverUrlFromCS;
|
||||
console.log("update serverUrl to: " + window.TuyooSdk.baseuri);
|
||||
} catch (e) {
|
||||
console.error("UpdateServerUrlToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
LoginToBridge: function (loginEventInfo) {
|
||||
try {
|
||||
var loginCallback = function (code, result, error) {
|
||||
var callbackResult = {
|
||||
code: code,
|
||||
result: result && result.logindata ? result.logindata : result,
|
||||
error: error
|
||||
};
|
||||
var callbackString = JSON.stringify(callbackResult);
|
||||
SendMessage("NativeCallBack", "LoginResult", callbackString);
|
||||
}
|
||||
var loginInfoFromCS = UTF8ToString(loginEventInfo);
|
||||
var loginInfo = JSON.parse(loginInfoFromCS);
|
||||
var tyLoginParams = {};
|
||||
if (loginInfo.loginType) {
|
||||
tyLoginParams.ChannelType = loginInfo.loginType;
|
||||
}
|
||||
if (loginInfo.extraParams) {
|
||||
var extraParams = JSON.parse(loginInfo.extraParams);
|
||||
tyLoginParams.extraParams = extraParams;
|
||||
}
|
||||
console.log("tyLoginParams: " + JSON.stringify(tyLoginParams));
|
||||
GameGlobal.TuyooSdk.Login(tyLoginParams, loginCallback, this);
|
||||
} catch (e) {
|
||||
console.error("LoginToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
PayToBridge: function (payEventInfo) {
|
||||
try {
|
||||
var payCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "PayResult", callbackString);
|
||||
}
|
||||
var payInfoFromCS = UTF8ToString(payEventInfo);
|
||||
var payInfo = JSON.parse(payInfoFromCS);
|
||||
var tyPayParams = {};
|
||||
tyPayParams.prodCount = 1;
|
||||
tyPayParams.appInfo = "";
|
||||
if (payInfo.chargeService) {
|
||||
tyPayParams.ChargeType = payInfo.chargeService;
|
||||
}
|
||||
if (payInfo.productCount) {
|
||||
tyPayParams.prodCount = payInfo.productCount;
|
||||
}
|
||||
if (payInfo.serverAppInfo) {
|
||||
tyPayParams.appInfo = payInfo.serverAppInfo;
|
||||
}
|
||||
if (payInfo.gameOrderId) {
|
||||
tyPayParams.prodOrderId = payInfo.gameOrderId;
|
||||
}
|
||||
if (payInfo.extraParams) {
|
||||
var extraParams = JSON.parse(payInfo.extraParams);
|
||||
tyPayParams.extraParams = extraParams;
|
||||
}
|
||||
tyPayParams.prodId = payInfo.productId;
|
||||
tyPayParams.prodName = payInfo.productName;
|
||||
tyPayParams.prodPrice = payInfo.productPrice;
|
||||
console.log("tyPayParams: " + JSON.stringify(tyPayParams));
|
||||
GameGlobal.TuyooSdk.Pay(tyPayParams, payCallback, this);
|
||||
} catch (e) {
|
||||
console.error("PayToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
SetShareInfoToBridge: function (shareEventInfo) {
|
||||
console.error("current channel not support SetShareInfo function");
|
||||
},
|
||||
|
||||
ShareToBridge: function (shareEventInfo) {
|
||||
console.error("current channel not support Share function");
|
||||
},
|
||||
|
||||
GAEventTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
if (!reportInfo.typeName) {
|
||||
reportInfo.typeName = "track";
|
||||
}
|
||||
GameGlobal.TuyooSdk.bi.trackWithType(reportInfo.typeName, reportInfo.eventName, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAEventTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAProfileTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
GameGlobal.TuyooSdk.bi.profileTrack(reportInfo.profileType, reportInfo.profileSubjectType, reportInfo.profileSubjectPrimary, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAProfileTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GetShareInfoBridge: function () {
|
||||
console.error("current channel not support GetShareInfo function");
|
||||
},
|
||||
|
||||
GetAdInfoBridge: function () {
|
||||
console.error("current channel not support GetAdInfo function");
|
||||
},
|
||||
|
||||
TxAdSDKReportToBridge: function (txAdReportInfo) {
|
||||
console.error("current channel not support TxAdSDKReport function");
|
||||
},
|
||||
|
||||
CheckBindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support CheckBind function");
|
||||
},
|
||||
|
||||
SendSmsCodeToBridge: function (loginEventInfo) {
|
||||
console.error("current channel not support SendSmsCode function");
|
||||
},
|
||||
|
||||
BindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support Bind function");
|
||||
},
|
||||
|
||||
SetWxUserInfoToBridge: function (type, userInfo) {
|
||||
console.error("current channel not support SetWxUserInfo function");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
mergeInto(LibraryManager.library, TuyooSdkBridge);
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1bdda16891c2c4b19a48cb96f19c4a6f
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
<linker>
|
||||
<assembly fullname="com.tuyoo.unitysdk.plugin">
|
||||
<type fullname="EngineSdkConverter.Unity.Plugins.WebGL.ConfigData" preserve="all"/>
|
||||
<type fullname="EngineSdkConverter.Unity.Plugins.WebGL.TuyooParam" preserve="all"/>
|
||||
<type fullname="EngineSdkConverter.Unity.Plugins.WebGL.Login" preserve="all"/>
|
||||
<type fullname="EngineSdkConverter.Unity.Plugins.WebGL.KuaishouMinigame" preserve="all"/>
|
||||
</assembly>
|
||||
</linker>
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3c56e51a2563d47bb9e7e1fb87018692
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e0a150155a395461ca774ce51de60925
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 558202106df2546b6ae11a5ae152cef2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,224 @@
|
||||
var TuyooSdkBridge = {
|
||||
|
||||
loadJsScriptToBridge: function (channelType) {
|
||||
var channelTypeFromCS = UTF8ToString(channelType);
|
||||
console.log("channelTypeFromCS:" + channelTypeFromCS);
|
||||
},
|
||||
|
||||
InitToBridge: function (initEventInfo) {
|
||||
try {
|
||||
var initCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "InitResult", callbackString);
|
||||
}
|
||||
var initInfoFromCS = UTF8ToString(initEventInfo);
|
||||
var initInfo = JSON.parse(initInfoFromCS);
|
||||
var tyInitParams = {};
|
||||
tyInitParams.appId = initInfo.tuyooParam.appId;
|
||||
tyInitParams.gameId = initInfo.tuyooParam.gameId;
|
||||
tyInitParams.pay_version = "hall37";
|
||||
tyInitParams.baseurl = initInfo.tuyooParam.serverUrl.endsWith("/") ? initInfo.tuyooParam.serverUrl : initInfo.tuyooParam.serverUrl + "/";
|
||||
tyInitParams.bi_base_url = "https://cbi.tuyoo.com/";
|
||||
tyInitParams.cloudId = initInfo.tuyooParam.cloudId;
|
||||
tyInitParams.packageName = initInfo.package;
|
||||
tyInitParams.clientId = initInfo.tuyooParam.clientId;
|
||||
tyInitParams.meituan_appId = initInfo.login.meituanminigame.meituanAppId;
|
||||
console.log("initInfo: " + JSON.stringify(initInfo));
|
||||
window.TuyooSdk.OnInit(initInfo.tuyooParam.channelType, tyInitParams, initCallback, this);
|
||||
} catch (e) {
|
||||
console.error("InitToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
// 切换SDK域名
|
||||
UpdateServerUrlToBridge: function (serverUrl) {
|
||||
try {
|
||||
var serverUrlFromCS = UTF8ToString(serverUrl);
|
||||
window.TuyooSdk.baseuri = (serverUrlFromCS.substring(serverUrlFromCS.length - 1) === '/') ? serverUrlFromCS.substring(0, serverUrlFromCS.length - 1) : serverUrlFromCS;
|
||||
console.log("update serverUrl to: " + window.TuyooSdk.baseuri);
|
||||
} catch (e) {
|
||||
console.error("UpdateServerUrlToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
LoginToBridge: function (loginEventInfo) {
|
||||
try {
|
||||
var loginCallback = function (code, result, error) {
|
||||
var callbackResult = {
|
||||
code: code,
|
||||
result: result && result.logindata ? result.logindata : result,
|
||||
error: error
|
||||
};
|
||||
var callbackString = JSON.stringify(callbackResult);
|
||||
SendMessage("NativeCallBack", "LoginResult", callbackString);
|
||||
}
|
||||
var loginInfoFromCS = UTF8ToString(loginEventInfo);
|
||||
var loginInfo = JSON.parse(loginInfoFromCS);
|
||||
var tyLoginParams = {};
|
||||
if (loginInfo.loginType) {
|
||||
tyLoginParams.ChannelType = loginInfo.loginType;
|
||||
}
|
||||
if (loginInfo.extraParams) {
|
||||
var extraParams = JSON.parse(loginInfo.extraParams);
|
||||
tyLoginParams.extraParams = extraParams;
|
||||
}
|
||||
console.log("tyLoginParams: " + JSON.stringify(tyLoginParams));
|
||||
window.TuyooSdk.Login(tyLoginParams, loginCallback, this);
|
||||
} catch (e) {
|
||||
console.error("LoginToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
PayToBridge: function (payEventInfo) {
|
||||
try {
|
||||
var payCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "PayResult", callbackString);
|
||||
}
|
||||
var payInfoFromCS = UTF8ToString(payEventInfo);
|
||||
var payInfo = JSON.parse(payInfoFromCS);
|
||||
var tyPayParams = {};
|
||||
tyPayParams.prodCount = 1;
|
||||
tyPayParams.appInfo = "";
|
||||
if (payInfo.chargeService) {
|
||||
tyPayParams.ChargeType = payInfo.chargeService;
|
||||
}
|
||||
if (payInfo.productCount) {
|
||||
tyPayParams.prodCount = payInfo.productCount;
|
||||
}
|
||||
if (payInfo.serverAppInfo) {
|
||||
tyPayParams.appInfo = payInfo.serverAppInfo;
|
||||
}
|
||||
if (payInfo.gameOrderId) {
|
||||
tyPayParams.prodOrderId = payInfo.gameOrderId;
|
||||
}
|
||||
if (payInfo.extraParams) {
|
||||
var extraParams = JSON.parse(payInfo.extraParams);
|
||||
tyPayParams.extraParams = extraParams;
|
||||
}
|
||||
tyPayParams.prodId = payInfo.productId;
|
||||
tyPayParams.prodName = payInfo.productName;
|
||||
tyPayParams.prodPrice = payInfo.productPrice;
|
||||
console.log("tyPayParams: " + JSON.stringify(tyPayParams));
|
||||
window.TuyooSdk.Pay(tyPayParams, payCallback, this);
|
||||
} catch (e) {
|
||||
console.error("PayToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
SetShareInfoToBridge: function (shareEventInfo) {
|
||||
try {
|
||||
var shareCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "ShareResult", callbackString);
|
||||
}
|
||||
var shareInfoFromCS = UTF8ToString(shareEventInfo);
|
||||
var shareInfo = JSON.parse(shareInfoFromCS);
|
||||
var shareInfoToJs = shareInfo.resource;
|
||||
shareInfoToJs.callback = shareCallback;
|
||||
console.log("shareInfoToJs: " + JSON.stringify(shareInfoToJs));
|
||||
window.TuyooSdk.SetDefaultShareInfo(shareInfoToJs);
|
||||
} catch (e) {
|
||||
console.error("SetShareInfoToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
ShareToBridge: function (shareEventInfo) {
|
||||
try {
|
||||
var shareCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "ShareResult", callbackString);
|
||||
}
|
||||
var shareInfoFromCS = UTF8ToString(shareEventInfo);
|
||||
var shareInfo = JSON.parse(shareInfoFromCS);
|
||||
var shareInfoToJs = shareInfo.resource;
|
||||
console.log("shareInfoToJs: " + JSON.stringify(shareInfoToJs));
|
||||
window.TuyooSdk.Share(shareInfoToJs, shareCallback);
|
||||
} catch (e) {
|
||||
console.error("ShareToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAEventTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
if (!reportInfo.typeName) {
|
||||
reportInfo.typeName = "track";
|
||||
}
|
||||
window.TuyooSdk.bi.trackWithType(reportInfo.typeName, reportInfo.eventName, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAEventTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAProfileTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
window.TuyooSdk.bi.profileTrack(reportInfo.profileType, reportInfo.profileSubjectType, reportInfo.profileSubjectPrimary, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAProfileTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GetShareInfoBridge: function (shareEventInfo) {
|
||||
console.error("current channel not support GetShareInfo function");
|
||||
},
|
||||
|
||||
GetAdInfoBridge: function () {
|
||||
console.error("current channel not support GetAdInfo function");
|
||||
},
|
||||
|
||||
TxAdSDKReportToBridge: function (txAdReportInfo) {
|
||||
console.error("current channel not support TxAdSDKReport function");
|
||||
},
|
||||
|
||||
CheckBindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support CheckBind function");
|
||||
},
|
||||
|
||||
SendSmsCodeToBridge: function (loginEventInfo) {
|
||||
console.error("current channel not support SendSmsCode function");
|
||||
},
|
||||
|
||||
BindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support Bind function");
|
||||
},
|
||||
|
||||
SetWxUserInfoToBridge: function (type, userInfo) {
|
||||
console.error("current channel not support SetWxUserInfo function");
|
||||
},
|
||||
|
||||
GetDeviceLevelToBridge: function() {
|
||||
// try {
|
||||
// var callback = function (code, result, error) {
|
||||
// var callbackString = JSON.stringify({ code, result, error });
|
||||
// SendMessage("NativeCallBack", "GetDeviceLevelResult", callbackString);
|
||||
// }
|
||||
// window.TuyooSdk.getDeviceBenchmarkLevel(callback, this);
|
||||
// } catch (error) {
|
||||
// console.error("GetDeviceLevelToBridge catch error: " + error);
|
||||
// }
|
||||
console.error("current channel not support GetDeviceLevelToBridge function");
|
||||
},
|
||||
|
||||
CreatGridGamePanelToBridge: function(gridGameModule) {
|
||||
console.error("current channel not support CreatGridGamePanel function");
|
||||
},
|
||||
|
||||
ShowGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support ShowGridGamePanel function");
|
||||
},
|
||||
|
||||
HideGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support HideGridGamePanel function");
|
||||
},
|
||||
|
||||
DestroyGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support DestroyGridGamePanel function");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
mergeInto(LibraryManager.library, TuyooSdkBridge);
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 271e924d713444a5c870cb92ec5f7e4c
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c5ae2508677d34e3a8905d1f385f0ec3
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a5423a6658141421e99e082908eb26d6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,213 @@
|
||||
var TuyooSdkBridge = {
|
||||
|
||||
loadJsScriptToBridge: function (channelType) {
|
||||
var channelTypeFromCS = UTF8ToString(channelType);
|
||||
console.log("channelTypeFromCS:" + channelTypeFromCS);
|
||||
},
|
||||
|
||||
InitToBridge: function (initEventInfo) {
|
||||
try {
|
||||
var initCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "InitResult", callbackString);
|
||||
}
|
||||
var initInfoFromCS = UTF8ToString(initEventInfo);
|
||||
var initInfo = JSON.parse(initInfoFromCS);
|
||||
var tyInitParams = {};
|
||||
tyInitParams.appId = initInfo.tuyooParam.appId;
|
||||
tyInitParams.gameId = initInfo.tuyooParam.gameId;
|
||||
tyInitParams.pay_version = "hall37";
|
||||
tyInitParams.baseurl = initInfo.tuyooParam.serverUrl.endsWith("/") ? initInfo.tuyooParam.serverUrl : initInfo.tuyooParam.serverUrl + "/";
|
||||
tyInitParams.bi_base_url = "https://cbi.tuyoo.com/";
|
||||
tyInitParams.cloudId = initInfo.tuyooParam.cloudId;
|
||||
tyInitParams.packageName = initInfo.package;
|
||||
tyInitParams.clientId = initInfo.tuyooParam.clientId;
|
||||
tyInitParams.oppo_appId = initInfo.login.oppominigame.oppoAppId;
|
||||
console.log("initInfo: " + JSON.stringify(initInfo));
|
||||
if (initInfo.login.oppominigame.packageType === "wasmsplit" && GameGlobal.tywx) {
|
||||
GameGlobal.tywx.StateInfo.debugMode = initInfo.debug.toLowerCase() === "true";
|
||||
GameGlobal.tywx.SystemInfo.loginUrl = initInfo.tuyooParam.serverUrl.endsWith("/") ? initInfo.tuyooParam.serverUrl : initInfo.tuyooParam.serverUrl + "/";
|
||||
GameGlobal.tywx.SystemInfo.clientId = initInfo.tuyooParam.clientId;
|
||||
GameGlobal.tywx.SystemInfo.cloudId = initInfo.tuyooParam.cloudId;
|
||||
GameGlobal.tywx.SystemInfo.appId = initInfo.tuyooParam.appId;
|
||||
GameGlobal.tywx.SystemInfo.gameId = initInfo.tuyooParam.gameId;
|
||||
GameGlobal.tywx.SystemInfo.wxAppId = initInfo.login.tywx.wx_appId;
|
||||
GameGlobal.tywx.SystemInfo.packageName = initInfo.package;
|
||||
}
|
||||
GameGlobal.TuyooSdk.OnInit(initInfo.tuyooParam.channelType, tyInitParams, initCallback, this);
|
||||
} catch (e) {
|
||||
console.error("InitToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
// 切换SDK域名
|
||||
UpdateServerUrlToBridge: function (serverUrl) {
|
||||
try {
|
||||
var serverUrlFromCS = UTF8ToString(serverUrl);
|
||||
window.TuyooSdk.baseuri = (serverUrlFromCS.substring(serverUrlFromCS.length - 1) === '/') ? serverUrlFromCS.substring(0, serverUrlFromCS.length - 1) : serverUrlFromCS;
|
||||
console.log("update serverUrl to: " + window.TuyooSdk.baseuri);
|
||||
} catch (e) {
|
||||
console.error("UpdateServerUrlToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
LoginToBridge: function (loginEventInfo) {
|
||||
try {
|
||||
var loginCallback = function (code, result, error) {
|
||||
var callbackResult = {
|
||||
code: code,
|
||||
result: result && result.logindata ? result.logindata : result,
|
||||
error: error
|
||||
};
|
||||
var callbackString = JSON.stringify(callbackResult);
|
||||
SendMessage("NativeCallBack", "LoginResult", callbackString);
|
||||
}
|
||||
var loginInfoFromCS = UTF8ToString(loginEventInfo);
|
||||
var loginInfo = JSON.parse(loginInfoFromCS);
|
||||
if (loginInfo.loginType === "wx.cn.minigame" && GameGlobal.tywx) {
|
||||
GameGlobal.tywx.TuyooSDK.login(loginCallback);
|
||||
return;
|
||||
}
|
||||
var tyLoginParams = {};
|
||||
if (loginInfo.loginType) {
|
||||
tyLoginParams.ChannelType = loginInfo.loginType;
|
||||
}
|
||||
if (loginInfo.extraParams) {
|
||||
var extraParams = JSON.parse(loginInfo.extraParams);
|
||||
tyLoginParams.extraParams = extraParams;
|
||||
}
|
||||
console.log("tyLoginParams: " + JSON.stringify(tyLoginParams));
|
||||
GameGlobal.TuyooSdk.Login(tyLoginParams, loginCallback, this);
|
||||
} catch (e) {
|
||||
console.error("LoginToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
PayToBridge: function (payEventInfo) {
|
||||
try {
|
||||
var payCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "PayResult", callbackString);
|
||||
}
|
||||
var payInfoFromCS = UTF8ToString(payEventInfo);
|
||||
var payInfo = JSON.parse(payInfoFromCS);
|
||||
var tyPayParams = {};
|
||||
tyPayParams.prodCount = 1;
|
||||
tyPayParams.appInfo = "";
|
||||
if (payInfo.chargeService) {
|
||||
tyPayParams.ChargeType = payInfo.chargeService;
|
||||
}
|
||||
if (payInfo.productCount) {
|
||||
tyPayParams.prodCount = payInfo.productCount;
|
||||
}
|
||||
if (payInfo.serverAppInfo) {
|
||||
tyPayParams.appInfo = payInfo.serverAppInfo;
|
||||
}
|
||||
if (payInfo.gameOrderId) {
|
||||
tyPayParams.prodOrderId = payInfo.gameOrderId;
|
||||
}
|
||||
if (payInfo.extraParams) {
|
||||
var extraParams = JSON.parse(payInfo.extraParams);
|
||||
tyPayParams.extraParams = extraParams;
|
||||
}
|
||||
tyPayParams.prodId = payInfo.productId;
|
||||
tyPayParams.prodName = payInfo.productName;
|
||||
tyPayParams.prodPrice = payInfo.productPrice;
|
||||
console.log("tyPayParams: " + JSON.stringify(tyPayParams));
|
||||
GameGlobal.TuyooSdk.Pay(tyPayParams, payCallback, this);
|
||||
} catch (e) {
|
||||
console.error("PayToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
SetShareInfoToBridge: function (shareEventInfo) {
|
||||
console.error("current channel not support SetShareInfo function");
|
||||
},
|
||||
|
||||
ShareToBridge: function (shareEventInfo) {
|
||||
console.error("current channel not support Share function");
|
||||
},
|
||||
|
||||
GAEventTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
if (!reportInfo.typeName) {
|
||||
reportInfo.typeName = "track";
|
||||
}
|
||||
GameGlobal.TuyooSdk.bi.trackWithType(reportInfo.typeName, reportInfo.eventName, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAEventTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAProfileTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
GameGlobal.TuyooSdk.bi.profileTrack(reportInfo.profileType, reportInfo.profileSubjectType, reportInfo.profileSubjectPrimary, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAProfileTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GetShareInfoBridge: function (shareEventInfo) {
|
||||
console.error("current channel not support GetShareInfo function");
|
||||
},
|
||||
|
||||
GetAdInfoBridge: function () {
|
||||
console.error("current channel not support GetAdInfo function");
|
||||
},
|
||||
|
||||
TxAdSDKReportToBridge: function (txAdReportInfo) {
|
||||
console.error("current channel not support TxAdSDKReport function");
|
||||
},
|
||||
|
||||
CheckBindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support CheckBind function");
|
||||
},
|
||||
|
||||
SendSmsCodeToBridge: function (loginEventInfo) {
|
||||
console.error("current channel not support SendSmsCode function");
|
||||
},
|
||||
|
||||
BindToBridge: function (bindEventInfo) {
|
||||
console.error("current channel not support Bind function");
|
||||
},
|
||||
|
||||
SetWxUserInfoToBridge: function (type, userInfo) {
|
||||
console.error("current channel not support SetWxUserInfo function");
|
||||
},
|
||||
|
||||
GetDeviceLevelToBridge: function() {
|
||||
// try {
|
||||
// var callback = function (code, result, error) {
|
||||
// var callbackString = JSON.stringify({ code, result, error });
|
||||
// SendMessage("NativeCallBack", "GetDeviceLevelResult", callbackString);
|
||||
// }
|
||||
// GameGlobal.TuyooSdk.getDeviceBenchmarkLevel(callback, this);
|
||||
// } catch (error) {
|
||||
// console.error("GetDeviceLevelToBridge catch error: " + error);
|
||||
// }
|
||||
console.error("current channel not support GetDeviceLevelToBridge function");
|
||||
},
|
||||
|
||||
CreatGridGamePanelToBridge: function(gridGameModule) {
|
||||
console.error("current channel not support CreatGridGamePanel function");
|
||||
},
|
||||
|
||||
ShowGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support ShowGridGamePanel function");
|
||||
},
|
||||
|
||||
HideGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support HideGridGamePanel function");
|
||||
},
|
||||
|
||||
DestroyGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support DestroyGridGamePanel function");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
mergeInto(LibraryManager.library, TuyooSdkBridge);
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 49f6a69fc2dc245aeacaeab1ac4a1d78
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 39fc15a1494854837b768d65550fb7ec
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: db431760cfd904f22b2a9edf0780c4de
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,435 @@
|
||||
|
||||
var TuyooSdkBridge = {
|
||||
|
||||
loadJsScriptToBridge: function (channelType) {
|
||||
var channelTypeFromCS = UTF8ToString(channelType);
|
||||
console.log("channelTypeFromCS:" + channelTypeFromCS);
|
||||
},
|
||||
|
||||
InitToBridge: function (initEventInfo) {
|
||||
try {
|
||||
var initInfoFromCS = UTF8ToString(initEventInfo);
|
||||
var initInfo = JSON.parse(initInfoFromCS);
|
||||
GameGlobal.tywx.StateInfo.debugMode = initInfo.debug.toLowerCase() === "true";
|
||||
GameGlobal.tywx.SystemInfo.loginUrl = initInfo.tuyooParam.serverUrl.endsWith("/") ? initInfo.tuyooParam.serverUrl : initInfo.tuyooParam.serverUrl + "/";
|
||||
GameGlobal.tywx.SystemInfo.wxPayVersion = "2.0";
|
||||
GameGlobal.tywx.SystemInfo.clientId = initInfo.tuyooParam.clientId;
|
||||
GameGlobal.tywx.SystemInfo.cloudId = initInfo.tuyooParam.cloudId;
|
||||
GameGlobal.tywx.SystemInfo.appId = initInfo.tuyooParam.appId;
|
||||
GameGlobal.tywx.SystemInfo.gameId = initInfo.tuyooParam.gameId;
|
||||
GameGlobal.tywx.SystemInfo.wxAppId = initInfo.login.tywx.wx_appId;
|
||||
GameGlobal.tywx.SystemInfo.packageName = initInfo.package;
|
||||
if (initInfo.login.tywx.wxShareEnable === false) {
|
||||
GameGlobal.tywx.StateInfo.wxShareEnable = false;
|
||||
wx.hideShareMenu({
|
||||
menus: ['shareAppMessage', 'shareTimeline']
|
||||
});
|
||||
}
|
||||
// 默认关闭拉取营销系统分享配置开关
|
||||
GameGlobal.tywx.StateInfo.pullShareConfig = false;
|
||||
if (initInfo.login.tywx.pullShareConfig === true) {
|
||||
GameGlobal.tywx.StateInfo.pullShareConfig = true;
|
||||
}
|
||||
// 默认关闭交叉导流功能
|
||||
GameGlobal.tywx.StateInfo.adManagerMode = false;
|
||||
if (initInfo.login.tywx.adManagerMode === true) {
|
||||
GameGlobal.tywx.StateInfo.adManagerMode = true;
|
||||
}
|
||||
// 广点通上报,默认开启
|
||||
if (initInfo.login.tywx.txAdEventReportMode === false) {
|
||||
GameGlobal.tywx.StateInfo.txAdEventReportMode = false;
|
||||
}
|
||||
// 错误日志上报,默认关闭
|
||||
if (initInfo.login.tywx.errorLogMode === true) {
|
||||
GameGlobal.tywx.StateInfo.errorLogMode = false;
|
||||
}
|
||||
|
||||
if (initInfo.login.tywx.shareManagerUrl) {
|
||||
GameGlobal.tywx.SystemInfo.shareManagerUrl = initInfo.login.tywx.shareManagerUrl.endsWith("/") ? initInfo.login.tywx.shareManagerUrl : initInfo.login.tywx.shareManagerUrl + "/";
|
||||
}
|
||||
if (initInfo.login.tywx.txAdSetId) {
|
||||
GameGlobal.tywx.SystemInfo.txAdSetId = initInfo.login.tywx.txAdSetId;
|
||||
}
|
||||
if (initInfo.login.tywx.txAdSetKey) {
|
||||
GameGlobal.tywx.SystemInfo.txAdSetKey = initInfo.login.tywx.txAdSetKey;
|
||||
}
|
||||
if (initInfo.login.tywx.openFeatureFilter === true) {
|
||||
GameGlobal.tywx.SystemInfo.openFeatureFilter = true;
|
||||
}
|
||||
|
||||
var launchInfo = wx.getLaunchOptionsSync();
|
||||
GameGlobal.tywx && GameGlobal.tywx.wxOnshowAction && GameGlobal.tywx.wxOnshowAction(launchInfo);
|
||||
wx.onShow(function (result) {
|
||||
GameGlobal.tywx && GameGlobal.tywx.wxOnshowAction && GameGlobal.tywx.wxOnshowAction(result);
|
||||
})
|
||||
var callbackResult = {
|
||||
code: 0,
|
||||
result: "wx init completed!",
|
||||
error: ""
|
||||
};
|
||||
var callbackString = JSON.stringify(callbackResult);
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "InitResult", callbackString);
|
||||
}
|
||||
catch (e) {
|
||||
console.error("InitToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
// 切换SDK域名
|
||||
UpdateServerUrlToBridge: function (serverUrl) {
|
||||
try {
|
||||
var serverUrlFromCS = UTF8ToString(serverUrl);
|
||||
GameGlobal.tywx.SystemInfo.loginUrl = serverUrlFromCS.endsWith("/") ? serverUrlFromCS : serverUrlFromCS + "/";
|
||||
console.log("update serverUrl to: " + GameGlobal.tywx.SystemInfo.loginUrl);
|
||||
} catch (e) {
|
||||
console.error("UpdateServerUrlToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
// 登录
|
||||
LoginToBridge: function (loginEventInfo) {
|
||||
try {
|
||||
var loginCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "LoginResult", callbackString);
|
||||
}
|
||||
GameGlobal.tywx.TuyooSDK.login(loginCallback);
|
||||
} catch (e) {
|
||||
console.error("LoginToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
// 支付
|
||||
PayToBridge: function (payEventInfo) {
|
||||
try {
|
||||
var payCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "PayResult", callbackString);
|
||||
}
|
||||
var payInfoFromCS = UTF8ToString(payEventInfo);
|
||||
var payInfo = JSON.parse(payInfoFromCS);
|
||||
var tyPayParams = {};
|
||||
tyPayParams.prodCount = 1;
|
||||
tyPayParams.appInfo = "";
|
||||
if (payInfo.chargeService) {
|
||||
tyPayParams.chargeType = payInfo.chargeService;
|
||||
}
|
||||
if (payInfo.productCount) {
|
||||
tyPayParams.prodCount = payInfo.productCount;
|
||||
}
|
||||
if (payInfo.serverAppInfo) {
|
||||
tyPayParams.appInfo = payInfo.serverAppInfo;
|
||||
}
|
||||
if (payInfo.gameOrderId) {
|
||||
tyPayParams.prodOrderId = payInfo.gameOrderId;
|
||||
}
|
||||
tyPayParams.prodId = payInfo.productId;
|
||||
tyPayParams.prodName = payInfo.productName;
|
||||
tyPayParams.prodPrice = payInfo.productPrice;
|
||||
tyPayParams.sdk_game_role_id = payInfo.gameRoleId;
|
||||
tyPayParams.sdk_game_zone_id = payInfo.gameZoneId;
|
||||
if (payInfo.extraParams) {
|
||||
var extraParams = JSON.parse(payInfo.extraParams);
|
||||
if (extraParams.actId) {
|
||||
tyPayParams.actId = extraParams.actId;
|
||||
delete extraParams.actId;
|
||||
}
|
||||
if (extraParams.levelList) {
|
||||
tyPayParams.levelList = JSON.parse(extraParams.levelList);
|
||||
delete extraParams.levelList;
|
||||
}
|
||||
if (extraParams.sendMessageTitle) {
|
||||
tyPayParams.sendMessageTitle = extraParams.sendMessageTitle;
|
||||
delete extraParams.sendMessageTitle;
|
||||
}
|
||||
if (extraParams.sendMessagePath) {
|
||||
tyPayParams.sendMessagePath = extraParams.sendMessagePath;
|
||||
delete extraParams.sendMessagePath;
|
||||
}
|
||||
if (extraParams.sendMessageImg) {
|
||||
tyPayParams.sendMessageImg = extraParams.sendMessageImg;
|
||||
delete extraParams.sendMessageImg;
|
||||
}
|
||||
tyPayParams.extraParams = extraParams;
|
||||
}
|
||||
console.log("tyPayParams: " + JSON.stringify(tyPayParams));
|
||||
GameGlobal.tywx.TYPayInterface.pay(tyPayParams, payCallback);
|
||||
} catch (e) {
|
||||
console.error("PayToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAEventTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
if (!reportInfo.typeName) {
|
||||
reportInfo.typeName = "track";
|
||||
}
|
||||
GameGlobal.tywx.GALog.trackWithType(reportInfo.typeName, reportInfo.eventName, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAEventTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GAProfileTrackToBridge: function (reportEventInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(reportEventInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
GameGlobal.tywx.GALog.profileTrack(reportInfo.profileType, reportInfo.profileSubjectType, reportInfo.profileSubjectPrimary, reportInfo.reportEvent);
|
||||
} catch (e) {
|
||||
console.error("GAProfileTrackToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GetShareInfoBridge: function (shareEventInfo) {
|
||||
try {
|
||||
var shareInfoFromCS = UTF8ToString(shareEventInfo);
|
||||
var shareInfo = JSON.parse(shareInfoFromCS);
|
||||
var resource = shareInfo.resource;
|
||||
var shareCallback = function (code, result, error) {
|
||||
if(code == 0 && result){
|
||||
result.sharePoint = resource.sharePointId;
|
||||
}
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "GetShareInfoResult", callbackString);
|
||||
}
|
||||
GameGlobal.tywx.ShareInterface.GetServerShareConfig(resource.type || 'wx_normal', resource.sharePointId, shareCallback);
|
||||
} catch (error) {
|
||||
console.error("GetShareInfoBridge catch error: " + error);
|
||||
}
|
||||
},
|
||||
|
||||
SetShareInfoToBridge: function (shareEventInfo) {
|
||||
try {
|
||||
var shareCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
SendMessage("NativeCallBack", "ShareResult", callbackString);
|
||||
}
|
||||
var shareInfoFromCS = UTF8ToString(shareEventInfo);
|
||||
var shareInfo = JSON.parse(shareInfoFromCS);
|
||||
var resource = shareInfo.resource;
|
||||
var extraData = shareInfo.extra;
|
||||
var shareInfoToJs = {};
|
||||
resource.title && (shareInfoToJs.shareContent = resource.title);
|
||||
resource.imageUrl && (shareInfoToJs.sharePicUrl = resource.imageUrl);
|
||||
resource.shareSchemeId && (shareInfoToJs.shareSchemeId = resource.shareSchemeId);
|
||||
resource.extraParams && (shareInfoToJs.extraInfo = resource.extraParams);
|
||||
resource.sharePointId && (shareInfoToJs.sharePoint = resource.sharePointId);
|
||||
if(extraData){
|
||||
Object.assign(shareInfoToJs, extraData);
|
||||
}
|
||||
console.log("shareInfoToJs: " + JSON.stringify(shareInfoToJs));
|
||||
GameGlobal.tywx.ShareInterface.setOnShareAppMessageInfo(shareInfoToJs.sharePoint, shareInfoToJs, shareCallback);
|
||||
} catch (e) {
|
||||
console.error("SetShareInfoToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
ShareToBridge: function (shareEventInfo) {
|
||||
try {
|
||||
var shareCallback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "ShareResult", callbackString);
|
||||
}
|
||||
var shareInfoFromCS = UTF8ToString(shareEventInfo);
|
||||
var shareInfo = JSON.parse(shareInfoFromCS);
|
||||
var resource = shareInfo.resource;
|
||||
var extraData = resource.extra;
|
||||
var shareInfoToJs = {};
|
||||
resource.title && (shareInfoToJs.shareContent = resource.title);
|
||||
resource.imageUrl && (shareInfoToJs.sharePicUrl = resource.imageUrl);
|
||||
resource.shareSchemeId && (shareInfoToJs.shareSchemeId = resource.shareSchemeId);
|
||||
resource.extraParams && (shareInfoToJs.extraInfo = resource.extraParams);
|
||||
resource.sharePointId && (shareInfoToJs.sharePoint = resource.sharePointId);
|
||||
if(extraData){
|
||||
Object.assign(shareInfoToJs, extraData);
|
||||
}
|
||||
console.log("shareInfoToJs: " + JSON.stringify(shareInfoToJs));
|
||||
if(resource.type == 'wx_activity_not_chat'){
|
||||
GameGlobal.tywx.ShareInterface.activityShare(shareInfoToJs.sharePoint, shareInfoToJs, shareCallback);
|
||||
}else if(resource.type == 'wx_poster'){
|
||||
GameGlobal.tywx.ShareInterface.posterShare(shareInfoToJs.sharePoint, shareInfoToJs, shareCallback);
|
||||
}else{
|
||||
GameGlobal.tywx.ShareInterface.share(shareInfoToJs.sharePoint, shareInfoToJs, shareCallback);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("ShareToBridge catch error: " + e);
|
||||
}
|
||||
},
|
||||
|
||||
GetAdInfoBridge: function () {
|
||||
try {
|
||||
var iconCallback = function (result) {
|
||||
var callbackResult = {
|
||||
code: 0,
|
||||
result: result,
|
||||
};
|
||||
var callbackString = JSON.stringify(callbackResult);
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "GetIconInfoResult", callbackString);
|
||||
}
|
||||
var newIconCallback = function (result) {
|
||||
var callbackResult = {
|
||||
code: 0,
|
||||
result: result,
|
||||
};
|
||||
var callbackString = JSON.stringify(callbackResult);
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "GetNewIconInfoResult", callbackString);
|
||||
}
|
||||
GameGlobal.tywx.NotificationCenter.listen(tywx.EventType.GET_ADMANAGER_ICON_INFO_SUCCESS, iconCallback);
|
||||
GameGlobal.tywx.NotificationCenter.listen(tywx.EventType.GET_ADMANAGER_NEWICON_INFO_SUCCESS, newIconCallback);
|
||||
GameGlobal.tywx.AdManager.init();
|
||||
} catch (error) {
|
||||
console.error("ShareToBridge catch error: " + error);
|
||||
}
|
||||
},
|
||||
|
||||
TxAdSDKReportToBridge: function (txAdReportInfo) {
|
||||
try {
|
||||
var reportInfoFromCS = UTF8ToString(txAdReportInfo);
|
||||
var reportInfo = JSON.parse(reportInfoFromCS);
|
||||
console.log("reportInfoToJs: " + JSON.stringify(reportInfo.actionParams));
|
||||
GameGlobal.tywx.TxAdSDKReportInterface.track(reportInfo.actionType, JSON.parse(reportInfo.actionParams));
|
||||
} catch (error) {
|
||||
console.error("TxAdSDKReportToBridge catch error: " + error);
|
||||
}
|
||||
},
|
||||
|
||||
CheckBindToBridge: function (bindEventInfo) {
|
||||
try {
|
||||
var bindInfoFromCS = UTF8ToString(bindEventInfo);
|
||||
var bindInfo = JSON.parse(bindInfoFromCS);
|
||||
var checkBindCallback = function (code, result) {
|
||||
var finnalResult = {
|
||||
code: code,
|
||||
};
|
||||
if (code == -1) {
|
||||
finnalResult.error = result;
|
||||
} else {
|
||||
finnalResult.result = result;
|
||||
}
|
||||
var callbackString = JSON.stringify(finnalResult);
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "CheckResult", callbackString);
|
||||
}
|
||||
GameGlobal.tywx.TuyooSDK.CheckBind(bindInfo.userId, checkBindCallback);
|
||||
} catch (error) {
|
||||
console.error("checkBindToBridge catch error: " + error);
|
||||
}
|
||||
},
|
||||
|
||||
SendSmsCodeToBridge: function (loginEventInfo) {
|
||||
try {
|
||||
var loginInfoFromCS = UTF8ToString(loginEventInfo);
|
||||
var phoneInfo = JSON.parse(loginInfoFromCS);
|
||||
var sendSmsCodeCallback = function (code, result) {
|
||||
var finnalResult = {
|
||||
code: code,
|
||||
};
|
||||
if (code == 0) {
|
||||
finnalResult.result = result;
|
||||
} else {
|
||||
finnalResult.error = result;
|
||||
}
|
||||
var callbackString = JSON.stringify(finnalResult);
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "SendCodeResult", callbackString);
|
||||
}
|
||||
GameGlobal.tywx.TuyooSDK.ThirdSmsSend(phoneInfo.phoneNumber, sendSmsCodeCallback);
|
||||
} catch (error) {
|
||||
console.error("SendSmsCodeToBridge catch error: " + error);
|
||||
}
|
||||
},
|
||||
|
||||
BindToBridge: function (bindEventInfo) {
|
||||
try {
|
||||
var bindInfoFromCS = UTF8ToString(bindEventInfo);
|
||||
var bindInfo = JSON.parse(bindInfoFromCS);
|
||||
var doBindCallback = function (code, result) {
|
||||
var finnalResult = {
|
||||
code: code,
|
||||
};
|
||||
if (code == 0) {
|
||||
finnalResult.result = result;
|
||||
} else {
|
||||
finnalResult.error = result;
|
||||
}
|
||||
var callbackString = JSON.stringify(finnalResult);
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "onBindSucc", callbackString);
|
||||
}
|
||||
GameGlobal.tywx.TuyooSDK.ThirdBindSns(bindInfo.phoneNumber, bindInfo.phoneCode, bindInfo.userId, bindInfo.password, doBindCallback);
|
||||
} catch (error) {
|
||||
console.error("BindToBridge catch error: " + error);
|
||||
}
|
||||
},
|
||||
|
||||
SetWxUserInfoToBridge: function (type, userInfo) {
|
||||
try {
|
||||
var userInfoFromCS = UTF8ToString(userInfo);
|
||||
var currentUserInfo = JSON.parse(userInfoFromCS);
|
||||
var reportInfo = currentUserInfo.wxUserInfo;
|
||||
var currentType = UTF8ToString(type);
|
||||
var succCb = function () {
|
||||
var finnalResult = {
|
||||
code: 0,
|
||||
result: "success!"
|
||||
};
|
||||
var callbackString = JSON.stringify(finnalResult);
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "SetWxInfoResult", callbackString);
|
||||
}
|
||||
var failCb = function () {
|
||||
var finnalResult = {
|
||||
code: -1,
|
||||
error: "fail!"
|
||||
};
|
||||
var callbackString = JSON.stringify(finnalResult);
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "SetWxInfoResult", callbackString);
|
||||
}
|
||||
if (currentType == "1") {
|
||||
GameGlobal.tywx.NotificationCenter.listen(tywx.EventType.SET_WX_USER_INFO_SUCCESS, succCb);
|
||||
GameGlobal.tywx.NotificationCenter.listen(tywx.EventType.SET_WX_USER_INFO_FAIL, failCb);
|
||||
GameGlobal.tywx.TuyooSDK.setWxUserInfo(reportInfo);
|
||||
} else if (currentType == "2") {
|
||||
GameGlobal.tywx.NotificationCenter.listen(tywx.EventType.SET_WX_SENSITIVE_DATA_SUCCESS, succCb);
|
||||
GameGlobal.tywx.NotificationCenter.listen(tywx.EventType.SET_WX_SENSITIVE_DATA_FAIL, failCb);
|
||||
GameGlobal.tywx.TuyooSDK.setWxEncryptedData(reportInfo.encryptedData, reportInfo.iv);
|
||||
} else if (currentType == "3") {
|
||||
GameGlobal.tywx.NotificationCenter.listen(tywx.EventType.SET_WX_SENSITIVE_DATA_SUCCESS, succCb);
|
||||
GameGlobal.tywx.NotificationCenter.listen(tywx.EventType.SET_WX_SENSITIVE_DATA_SUCCESS, failCb);
|
||||
GameGlobal.tywx.TuyooSDK.setThreeWxEncryptedData(reportInfo.wxOpenId, reportInfo.unionId, reportInfo.session_key);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("SetWxUserInfoToBridge catch error: " + error);
|
||||
}
|
||||
},
|
||||
|
||||
GetDeviceLevelToBridge: function() {
|
||||
try {
|
||||
var callback = function (code, result, error) {
|
||||
var callbackString = JSON.stringify({ code, result, error });
|
||||
GameGlobal.Module.SendMessage("NativeCallBack", "GetDeviceLevelResult", callbackString);
|
||||
}
|
||||
GameGlobal.tywx.TuyooSDK.getDeviceBenchmarkLevel(callback);
|
||||
} catch (error) {
|
||||
console.error("GetDeviceLevelToBridge catch error: " + error);
|
||||
}
|
||||
},
|
||||
|
||||
CreatGridGamePanelToBridge: function(gridGameModule) {
|
||||
console.error("current channel not support CreatGridGamePanel function");
|
||||
},
|
||||
|
||||
ShowGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support ShowGridGamePanel function");
|
||||
},
|
||||
|
||||
HideGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support HideGridGamePanel function");
|
||||
},
|
||||
|
||||
DestroyGridGamePanelToBridge: function(panelId) {
|
||||
console.error("current channel not support DestroyGridGamePanel function");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
mergeInto(LibraryManager.library, TuyooSdkBridge);
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2ca65f180cf9f414aa2630d83f81f306
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1e71e06e22de84bab9c7114861753f3d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,491 @@
|
||||
/**
|
||||
* SDK 初始化参数
|
||||
*/
|
||||
interface SdkConfig {
|
||||
/**
|
||||
* 数据源ID,必填
|
||||
*/
|
||||
user_action_set_id: number;
|
||||
/**
|
||||
* 加密key,必填
|
||||
*/
|
||||
secret_key: string;
|
||||
/**
|
||||
* 微信小程序/小游戏APPID,wx开头,必填
|
||||
*/
|
||||
appid: string;
|
||||
/**
|
||||
* 微信 openid,openid 和 unionid 至少填一个, 可以调用 setOpenId 设置
|
||||
*/
|
||||
openid?: string;
|
||||
/**
|
||||
* 微信 unionid,openid 和 unionid 至少填一个, 可以调用 setUnionId 设置
|
||||
*/
|
||||
unionid?: string;
|
||||
/**
|
||||
* 自定义用户ID,选填
|
||||
*/
|
||||
user_unique_id?: string;
|
||||
/**
|
||||
* 是否自动采集事件
|
||||
*/
|
||||
auto_track?: boolean;
|
||||
/**
|
||||
* 是否自动采集属性
|
||||
*/
|
||||
auto_attr?: boolean;
|
||||
}
|
||||
/**
|
||||
* 小程序/小游戏信息
|
||||
*/
|
||||
interface GameInfo {
|
||||
/**
|
||||
* 广告点击id、曝光id
|
||||
*/
|
||||
ad_trace_id?: string;
|
||||
/**
|
||||
* 页面路径,小游戏没有
|
||||
*/
|
||||
page_url?: string;
|
||||
/**
|
||||
* 页面名称,小游戏没有
|
||||
*/
|
||||
page_title?: string;
|
||||
/**
|
||||
* 组件名称
|
||||
*/
|
||||
component_name?: string;
|
||||
/**
|
||||
* 场景来源
|
||||
*/
|
||||
source_scene?: number;
|
||||
/**
|
||||
* 渠道号
|
||||
*/
|
||||
pkg_channel_id?: string;
|
||||
/**
|
||||
* 框架信息,小游戏没有
|
||||
*/
|
||||
framework?: string;
|
||||
/**
|
||||
* 渠道来源
|
||||
*/
|
||||
channel: string;
|
||||
/**
|
||||
* 启动参数
|
||||
*/
|
||||
launch_options: string;
|
||||
}
|
||||
/**
|
||||
* 设备信息
|
||||
*/
|
||||
interface DeviceInfo {
|
||||
/**
|
||||
* 设备品牌
|
||||
*/
|
||||
device_brand: string;
|
||||
/**
|
||||
* 设备型号
|
||||
*/
|
||||
device_model: string;
|
||||
/**
|
||||
* 微信App版本
|
||||
*/
|
||||
wx_version: string;
|
||||
/**
|
||||
* 微信基础库版本
|
||||
*/
|
||||
wx_lib_version: string;
|
||||
/**
|
||||
* 微信客户端平台
|
||||
*/
|
||||
wx_platform: string;
|
||||
/**
|
||||
* 操作系统
|
||||
*/
|
||||
os: string;
|
||||
/**
|
||||
* 操作系统版本
|
||||
*/
|
||||
os_version: string;
|
||||
/**
|
||||
* 设备性能等级
|
||||
*/
|
||||
benchmark_level: number;
|
||||
/**
|
||||
* 屏幕高度
|
||||
*/
|
||||
screen_height: number;
|
||||
/**
|
||||
* 屏幕宽度
|
||||
*/
|
||||
screen_width: number;
|
||||
}
|
||||
interface TrackBaseInfo extends SdkConfig, DeviceInfo {
|
||||
local_id: string;
|
||||
sdk_name: string;
|
||||
sdk_version: string;
|
||||
inner_param: {
|
||||
app_version: string;
|
||||
app_env_version: string;
|
||||
};
|
||||
}
|
||||
/**
|
||||
* 行为信息
|
||||
*/
|
||||
interface ActionInfo {
|
||||
action_type: string;
|
||||
action_param?: Record<string | number | symbol, unknown>;
|
||||
is_sdk_auto_track: boolean;
|
||||
session_id: string;
|
||||
log_id: number;
|
||||
action_id: string;
|
||||
action_time: number;
|
||||
revised_action_time: number;
|
||||
is_retry: boolean;
|
||||
retry_count: number;
|
||||
ad_trace_id?: string;
|
||||
page_url?: string;
|
||||
page_title?: string;
|
||||
component_name?: string;
|
||||
source_scene?: number;
|
||||
pkg_channel_id?: string;
|
||||
/**
|
||||
* 网络类型
|
||||
*/
|
||||
network_type?: string;
|
||||
inner_param?: Record<string | number | symbol, unknown>;
|
||||
channel?: string;
|
||||
}
|
||||
interface LogParams {
|
||||
log_type: string;
|
||||
code?: number;
|
||||
message?: string;
|
||||
err_stack?: string;
|
||||
user_action_set_id?: number;
|
||||
appid?: string;
|
||||
local_id?: string;
|
||||
session_id?: string;
|
||||
sdk_name?: string;
|
||||
sdk_version?: string;
|
||||
page_url?: string;
|
||||
framework?: string;
|
||||
device_brand?: string;
|
||||
device_model?: string;
|
||||
wx_version?: string;
|
||||
wx_lib_version?: string;
|
||||
wx_platform?: string;
|
||||
os?: string;
|
||||
os_version?: string;
|
||||
}
|
||||
|
||||
interface QueueProps {
|
||||
/**
|
||||
* 数据源ID,用于本地存储队列key
|
||||
*/
|
||||
userActionSetId: number;
|
||||
/**
|
||||
* 队列长度
|
||||
*/
|
||||
maxLength: number;
|
||||
}
|
||||
interface QueueManagerProps extends QueueProps {
|
||||
/**
|
||||
* OG事件列表
|
||||
*/
|
||||
ogEvents: string[];
|
||||
}
|
||||
interface IEvent extends ActionInfo {
|
||||
inner_status?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 队列原子操作
|
||||
*/
|
||||
|
||||
declare class Queue {
|
||||
protected maxLength: any;
|
||||
protected userActionSetId: any;
|
||||
protected lostActionMaps: Record<string, number>;
|
||||
private stack;
|
||||
private localStorageKey;
|
||||
private timeStamp;
|
||||
constructor({ userActionSetId, maxLength }: QueueProps);
|
||||
getItems(): IEvent[];
|
||||
getStorage(): IEvent[];
|
||||
/**
|
||||
* 上报丢失条数到日志系统
|
||||
*/
|
||||
reportLostNum(): void;
|
||||
/**
|
||||
* 获取丢失条数map
|
||||
* @returns 丢失条数map
|
||||
*/
|
||||
getLostMaps(): Record<string, number>;
|
||||
protected init(): void;
|
||||
protected addItem(eventData: IEvent): void;
|
||||
protected removeItems(actionIds: string[]): void;
|
||||
protected updateForReportFail(actionIds: string[]): void;
|
||||
protected updateForReporting(actionIds: string[]): void;
|
||||
protected updateAllStack(stack: IEvent[]): void;
|
||||
protected updateToStorage(): void;
|
||||
/**
|
||||
* 更新丢失条数
|
||||
* @param sessionId 当前被丢弃行为的会话id
|
||||
*/
|
||||
protected updateLostAction(sessionId: string): void;
|
||||
/**
|
||||
* 设置时间戳
|
||||
*/
|
||||
protected setTimeStamp(): void;
|
||||
}
|
||||
|
||||
declare class QueueManage extends Queue {
|
||||
protected ogEvents: string[];
|
||||
constructor({ userActionSetId, maxLength, ogEvents }: QueueManagerProps);
|
||||
/**
|
||||
* 获取可上报的队列
|
||||
* @param reportMaxLength 需要上报的队列最大长度
|
||||
*/
|
||||
getReportableActions(reportMaxLength?: number): IEvent[];
|
||||
/**
|
||||
* 添加行为到队列
|
||||
* @param eventData 单条行为数据
|
||||
*/
|
||||
addAction(eventData: IEvent): void;
|
||||
/**
|
||||
* 根据acition_id删除行为
|
||||
* @param actionIds 行为id列表
|
||||
*/
|
||||
removeActions(actionIds: string[]): void;
|
||||
/**
|
||||
* 上报失败时更新队列状态
|
||||
* @param actionIds
|
||||
*/
|
||||
updateActionsForReportFail(actionIds: string[]): void;
|
||||
/**
|
||||
* 上报时更新队列状态为reporting
|
||||
* @param actionIds 需要更新的行为id数组
|
||||
*/
|
||||
updateActionsForReporting(actionIds: string[]): void;
|
||||
/**
|
||||
* 获取可上报队列长度
|
||||
* @returns 可上报队列长度
|
||||
*/
|
||||
getReportableActionsLength(): number;
|
||||
/**
|
||||
* 按照优先级从大到小给队列排序
|
||||
* @param currEvent 当前事件
|
||||
* @param stack 当前队列
|
||||
*/
|
||||
sortQueue(currEvent: IEvent, stack: IEvent[]): IEvent[];
|
||||
/**
|
||||
* 计算优先级
|
||||
* @param currTime 当前时间
|
||||
* @param event 行为事件
|
||||
* @returns 权重值
|
||||
*/
|
||||
private caculateWeight;
|
||||
/**
|
||||
*
|
||||
* @param currTime 当前时间
|
||||
* @param actionTime 队列行为时间
|
||||
* @returns 权重值
|
||||
*/
|
||||
private formatWeight;
|
||||
}
|
||||
|
||||
interface ConfigManager {
|
||||
getRealTimeActionList: () => Array<string>;
|
||||
getRequestTimeout: () => number;
|
||||
}
|
||||
interface ActionReporterProps {
|
||||
getBaseInfo: () => TrackBaseInfo;
|
||||
reportLog: (param: LogParams) => void;
|
||||
queueManager: QueueManage;
|
||||
configManager?: ConfigManager;
|
||||
}
|
||||
/**
|
||||
* 行为上报类
|
||||
*/
|
||||
declare class ActionReporter {
|
||||
private static currentRequestCount;
|
||||
private static requestConcurrency;
|
||||
static setRequestConcurrency(n: number): void;
|
||||
private getBaseInfo;
|
||||
private reportLog;
|
||||
private queueManager;
|
||||
private configManager;
|
||||
private cgiBatchSize;
|
||||
private reportThreshold;
|
||||
private reportDelay;
|
||||
private triggerExecuteSend;
|
||||
private inspectDelay;
|
||||
private inspectTimer;
|
||||
private isNeedContinueSend;
|
||||
constructor(props: ActionReporterProps);
|
||||
/**
|
||||
* 批量上报行为,track的时候触发
|
||||
*/
|
||||
batchSend(): void;
|
||||
/**
|
||||
* 全量上报, flush的时候触发
|
||||
*/
|
||||
flushSend(): void;
|
||||
/**
|
||||
* 执行指定数量的行为上报逻辑,超过接口batch上限则并行发送请求
|
||||
*/
|
||||
private executeSend;
|
||||
/**
|
||||
* 组装上报用的行为数据
|
||||
*/
|
||||
private generateActionReportParams;
|
||||
/**
|
||||
* 上报接口请求成功逻辑处理
|
||||
* @param resData
|
||||
* @param actionIdList
|
||||
*/
|
||||
private dealSuccessData;
|
||||
/**
|
||||
* 上报接口请求失败逻辑处理
|
||||
* @param errData
|
||||
* @param actionIdList
|
||||
*/
|
||||
private dealFailData;
|
||||
/**
|
||||
* wx.request文档:https://developers.weixin.qq.com/minigame/dev/api/network/request/wx.request.html
|
||||
* @param param.data:接口请求参数、param.actionIdList:行为id列表
|
||||
* @returns
|
||||
*/
|
||||
private report;
|
||||
/**
|
||||
* 启动上报定时器
|
||||
*/
|
||||
private startInspectTimer;
|
||||
}
|
||||
|
||||
declare abstract class SdkExtCommon {
|
||||
protected special_method_symbol: symbol;
|
||||
/**
|
||||
* 付费
|
||||
*/
|
||||
onPurchase(value: number): void;
|
||||
/**
|
||||
* 进入前台
|
||||
*/
|
||||
onEnterForeground(): void;
|
||||
/**
|
||||
* 进入后台
|
||||
*/
|
||||
onEnterBackground(): void;
|
||||
/**
|
||||
* 启动
|
||||
*/
|
||||
onAppStart(): void;
|
||||
/**
|
||||
* 退出
|
||||
*/
|
||||
onAppQuit(): void;
|
||||
/**
|
||||
* 收藏
|
||||
*/
|
||||
onAddToWishlist(): void;
|
||||
protected wrapTrack(action_type: ActionInfo["action_type"], action_param?: ActionInfo["action_param"]): void;
|
||||
abstract track(action_type: ActionInfo["action_type"], action_param?: ActionInfo["action_param"]): void;
|
||||
}
|
||||
|
||||
declare abstract class sdkExt extends SdkExtCommon {
|
||||
/**
|
||||
* 注册
|
||||
*/
|
||||
onRegister(): void;
|
||||
/**
|
||||
* 创角
|
||||
*/
|
||||
onCreateRole(name?: string): void;
|
||||
/**
|
||||
* 完成新手教程
|
||||
*/
|
||||
onTutorialFinish(): void;
|
||||
}
|
||||
|
||||
declare const initializedInstanceSymbol: unique symbol;
|
||||
declare class SDK extends sdkExt {
|
||||
private static [initializedInstanceSymbol];
|
||||
static setRequestConcurrency(n: number): void;
|
||||
static setDebug(debug: boolean): void;
|
||||
protected env: string;
|
||||
protected sdk_version: string;
|
||||
protected sdk_name: string;
|
||||
protected config?: SdkConfig;
|
||||
protected deviceInfo: Partial<DeviceInfo>;
|
||||
protected gameInfo: Partial<GameInfo>;
|
||||
protected session_id: string;
|
||||
protected log_id: number;
|
||||
protected queueManage?: QueueManage;
|
||||
protected actionReporter?: ActionReporter;
|
||||
protected openid?: string;
|
||||
protected unionid?: string;
|
||||
protected user_unique_id?: string;
|
||||
protected inited: boolean;
|
||||
constructor(sdkConfig: SdkConfig);
|
||||
/**
|
||||
* 数据上报方法
|
||||
*/
|
||||
track(action_type: ActionInfo['action_type'], action_param?: ActionInfo['action_param']): void;
|
||||
/**
|
||||
* 立即上报数据
|
||||
*/
|
||||
flush(): void;
|
||||
/**
|
||||
* 设置 openId
|
||||
*/
|
||||
setOpenId(openid: string): void;
|
||||
/**
|
||||
* 设置 unionid
|
||||
*/
|
||||
setUnionId(unionid: string): void;
|
||||
/**
|
||||
* 设置 user_unique_id
|
||||
* @param user_unique_id
|
||||
*/
|
||||
setUserUniqueId(user_unique_id: string): void;
|
||||
protected doReportOnEnterBackground(): void;
|
||||
/**
|
||||
* 获取数据上报时所需要的 info 参数
|
||||
*/
|
||||
private getTrackBaseInfo;
|
||||
/**
|
||||
* 生成上报队列需要的行为数据
|
||||
* @param actionParams 行为参数
|
||||
* @param is_sdk_auto_track 是否自动采集
|
||||
* @returns
|
||||
*/
|
||||
private createAction;
|
||||
/**
|
||||
* 给指定行为的inner_param字段追加字段
|
||||
* @param action 待追加字段的行为
|
||||
* @param key 待添加到inner_param字段的key
|
||||
* @param value key对应的value
|
||||
*/
|
||||
private addActionInnerParam;
|
||||
/**
|
||||
* 不同行为携带的渠道来源判断逻辑
|
||||
* @param actionType
|
||||
* @returns
|
||||
*/
|
||||
private getChannelByActionType;
|
||||
/**
|
||||
* 上报日志
|
||||
* @param params 日志参数
|
||||
*/
|
||||
private reportLog;
|
||||
private useAutoTrack;
|
||||
private getAutoProxyRemoteConfig;
|
||||
/**
|
||||
* 设置openid时,如果值合法缓存到Storage
|
||||
*/
|
||||
private saveValidOpenidToStorage;
|
||||
}
|
||||
|
||||
export { SDK };
|
||||
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4281eb15fbaf94140ac04656d0b06e85
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 208b4345ee65d4f66968164f0c71bb91
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user