移动端微信接入

This commit is contained in:
CaiYanPeng 2021-08-23 09:28:14 +08:00
parent ca91f45ef3
commit 31e8e3bebb
32 changed files with 17241 additions and 9 deletions

View File

@ -0,0 +1,92 @@

using UnityEditor;
using System.IO;
using UnityEngine;
#if UNITY_IOS && UNITY_EDITOR
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
#endif
public static class XCodePostProcessBuild
{
#if UNITY_IOS && UNITY_EDITOR
private static readonly string[] csAddFrameworks = new string[]{
"Security.framework","WebKit.framework", "CoreGraphics.framework"
};
[PostProcessBuild(1)]
public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
{
if (BuildTarget.iOS != buildTarget)
{
return;
}
string projectPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
SetFrameworksAndBuildSettings(projectPath);
SetInfoList(pathToBuiltProject, "com.ZhiXingPai.PowerFun", "wx9146e6697a6aef2d");
SetAssociatedDomains(projectPath, "wx.powerfun.com.cn");
}
private static void SetFrameworksAndBuildSettings(string path)
{
PBXProject proj = new PBXProject();
proj.ReadFromString(File.ReadAllText(path));
string target = proj.GetUnityMainTargetGuid();
Debug.Log("Target Name is " + target);
// 设置 BuildSettings
proj.AddBuildProperty(target, "Other Linker Flags", "-Objc -all_load");
proj.SetBuildProperty(target, "ENABLE_BITCODE", "NO");
//根据微信SDK文档的要求加入相关的Frameworks
for (int i = 0; i < csAddFrameworks.Length; ++i)
{
if (!proj.ContainsFramework(target, csAddFrameworks[i]))
proj.AddFrameworkToProject(target, csAddFrameworks[i], false);
}
File.WriteAllText(path, proj.WriteToString());
}
public static void SetInfoList(string buildPath, string wxUrlName, string wxScheme)
{
string listPath = buildPath + "/Info.plist";
PlistDocument plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(listPath));
// 在“info”标签栏的“URL type“添加“URL scheme”,值为你在微信后台注册的应用程序的 AppID
PlistElementArray urlArray = plist.root.CreateArray("CFBundleURLTypes");
PlistElementDict dict = urlArray.AddDict();
dict.SetString("CFBundleTypeRole", "Editor");
dict.SetString("CFBundleURLName", wxUrlName);
PlistElementArray urlSchemes = dict.CreateArray("CFBundleURLSchemes");
urlSchemes.AddString(wxScheme);
// 在 “info”标签栏的“LSApplicationQueriesSchemes“添加weixin wechat和weixinULAPI
PlistElementArray wxArray = plist.root.CreateArray("LSApplicationQueriesSchemes");
wxArray.AddString("weixin");
wxArray.AddString("wechat");
wxArray.AddString("weixinULAPI");
PlistElementDict qxLoc = plist.root.CreateDict("NSLocationWhenInUseUsageDescription");
qxLoc.SetBoolean("NSLocationWhenInUseUsageDescription", true);
File.WriteAllText(listPath, plist.WriteToString());
}
// 设置Associated Domains
public static void SetAssociatedDomains(string pbxProjectPath, string domainUrl)
{
//默认 Target Name, 你自己的可能不一样
string targetName = "Unity-iPhone";
//Set the entitlements file name to what you want but make sure it has this extension
string entitlementsFileName = "my_app.entitlements";
var entitlements = new ProjectCapabilityManager(pbxProjectPath, entitlementsFileName, targetName);
entitlements.AddAssociatedDomains(new string[] { "applinks:" + domainUrl });
entitlements.WriteToFile();
}
#endif
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 84ef3790c38d9564cb7770687283c42d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,32 @@
fileFormatVersion: 2
guid: 53d84661e0b3c5349a17e6043175d0d9
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Android: Android
second:
enabled: 1
settings: {}
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 306a0c395439baa468b3bcd3fe5983ae
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
Assets/Plugins/iOS.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7cce98d172bfd2f4fa235200a8c37ffd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,69 @@
//
// IOSWechatController.m
// Unity-iPhone
//
// Created by Jooki Tsui on 2020/11/13.
//
#import "WXApi.h"
#import "UnityAppController.h"
#import <Foundation/Foundation.h>
extern void UnitySendMessage(const char *,const char *,const char *);
@interface IOSWechatController : UnityAppController<WXApiDelegate>
@end
IMPL_APP_CONTROLLER_SUBCLASS (IOSWechatController)
@implementation IOSWechatController
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
#if defined(__IPHONE_12_0) || defined(__TVOS_12_0)
restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring> > * _Nullable restorableObjects))restorationHandler
#else
restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
#endif
{
return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
return [WXApi handleOpenURL:url delegate:self];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [WXApi handleOpenURL:url delegate:self];
}
- (void)onResp:(BaseResp *)resp
{
NSLog(@"47");
if([resp isKindOfClass:[SendAuthResp class]])
{
SendAuthResp *temp = (SendAuthResp*)resp;
int errorCode = temp.errCode;
switch (errorCode) {
case 0:
UnitySendMessage("LoginPanel", "OnMobileWxLoginResp",[NSString stringWithFormat:@"true;%@",temp.code ].UTF8String);
break;
case -2:
UnitySendMessage("LoginPanel", "OnMobileWxLoginResp", "false;用户取消");
break;
case -4:
UnitySendMessage("LoginPanel", "OnMobileWxLoginResp", "false;用户拒绝授权");
break;
default:
UnitySendMessage("LoginPanel", "OnMobileWxLoginResp", "false;登录失败");
break;
}
}
}
- (void)onReq:(BaseReq *)req
{
// do something
}
@end

View File

@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 0cbd70da63d86a34ab0eca9767c1289b
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:

205
Assets/Plugins/iOS/WXApi.h Normal file
View File

@ -0,0 +1,205 @@
//
// WXApi.h
// 所有Api接口
//
// Created by Wechat on 12-2-28.
// Copyright (c) 2012年 Tencent. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "WXApiObject.h"
NS_ASSUME_NONNULL_BEGIN
#pragma mark - WXApiDelegate
/*! @brief 接收并处理来自微信终端程序的事件消息
*
*
* WXApiDelegate handleOpenURL:delegate:使
*/
@protocol WXApiDelegate <NSObject>
@optional
/*! @brief 收到一个来自微信的请求第三方应用程序处理完后调用sendResp向微信发送结果
*
* sendResp发送处理结果给微信
* GetMessageFromWXReqShowMessageFromWXReq等
* @param req
*/
- (void)onReq:(BaseReq*)req;
/*! @brief 发送一个sendReq后收到微信的回应
*
* sendReq后会收到onResp
* SendMessageToWXRespSendAuthResp等
* @param resp具体的回应内容
*/
- (void)onResp:(BaseResp*)resp;
@end
#pragma mark - WXApiLogDelegate
@protocol WXApiLogDelegate <NSObject>
- (void)onLog:(NSString*)log logLevel:(WXLogLevel)level;
@end
#pragma mark - WXApi
/*! @brief 微信Api接口函数类
*
* SDK的所有接口
*/
@interface WXApi : NSObject
/*! @brief WXApi的成员函数向微信终端程序注册第三方应用。
*
*
* @attention 线
* @param appid ID
* @param universalLink Universal Link
* @return YESNO
*/
+ (BOOL)registerApp:(NSString *)appid universalLink:(NSString *)universalLink;
/*! @brief 处理旧版微信通过URL启动App时传递的数据
*
* application:openURL:sourceApplication:annotation:application:handleOpenURL中调用
* @param url URL
* @param delegate WXApiDelegate对象
* @return YESNO
*/
+ (BOOL)handleOpenURL:(NSURL *)url delegate:(nullable id<WXApiDelegate>)delegate;
/*! @brief 处理微信通过Universal Link启动App时传递的数据
*
* application:continueUserActivity:restorationHandler:
* @param userActivity API传递过来的userActivity
* @param delegate WXApiDelegate对象
* @return YESNO
*/
+ (BOOL)handleOpenUniversalLink:(NSUserActivity *)userActivity delegate:(nullable id<WXApiDelegate>)delegate;
/*! @brief 检查微信是否已被用户安装
*
* @return YESNO
*/
+ (BOOL)isWXAppInstalled;
/*! @brief 判断当前微信的版本是否支持OpenApi
*
* @return YESNO
*/
+ (BOOL)isWXAppSupportApi;
/*! @brief 判断当前微信的版本是否支持分享微信状态功能
*
* @attention LSApplicationQueriesSchemes配置中添加weixinStateAPI
* @return YESNO
*/
+ (BOOL)isWXAppSupportStateAPI;
/*! @brief 获取微信的itunes安装地址
*
* @return
*/
+ (NSString *)getWXAppInstallUrl;
/*! @brief 获取当前微信SDK的版本号
*
* @return SDK的版本号
*/
+ (NSString *)getApiVersion;
/*! @brief 打开微信
*
* @return YESNO
*/
+ (BOOL)openWXApp;
/*! @brief 发送请求到微信等待微信返回onResp
*
* onResponResp
* SendAuthReqSendMessageToWXReqPayReq等
* @param req
* @param completion block
*/
+ (void)sendReq:(BaseReq *)req completion:(void (^ __nullable)(BOOL success))completion;
/*! @brief 收到微信onReq的请求发送对应的应答给微信并切换到微信界面
*
* onReq的请求
* GetMessageFromWXRespShowMessageFromWXResp等
* @param resp
* @param completion block
*/
+ (void)sendResp:(BaseResp*)resp completion:(void (^ __nullable)(BOOL success))completion;
/*! @brief 发送Auth请求到微信支持用户没安装微信等待微信返回onResp
*
* onResponRespSendAuthReq类型
* @param req
* @param viewController
* @param delegate WXApiDelegate对象
* @param completion block
*/
+ (void)sendAuthReq:(SendAuthReq *)req viewController:(UIViewController*)viewController delegate:(nullable id<WXApiDelegate>)delegate completion:(void (^ __nullable)(BOOL success))completion;
/*! @brief 测试函数用于排查当前App通过Universal Link方式分享到微信的流程
1: registerApp:universalLink接口,
2: Log产生startLogByLevel函数Log排查问题
3: block
4: SDK时调试使用
*
* completion回调的step为WXULCheckStepFinal时Universal Link接入成功
* @param completion Block
*/
+ (void)checkUniversalLinkReady:(nonnull WXCheckULCompletion)completion;
/*! @brief WXApi的成员函数接受微信的log信息。byBlock
1:SDK会强引用这个block,,
2:startLog by block之后startLoad,logBlocklogBlock
*
* @param level log的级别
* @param logBlock log的回调block
*/
+ (void)startLogByLevel:(WXLogLevel)level logBlock:(WXLogBolock)logBlock;
/*! @brief WXApi的成员函数接受微信的log信息。byDelegate
1:sdk会弱引用这个delegateWXApiDelegate同一个对象
2:startLog by delegate之后startLoad,logDelegate对象
* @param level log的级别
* @param logDelegate log的回调代理
*/
+ (void)startLogByLevel:(WXLogLevel)level logDelegate:(id<WXApiLogDelegate>)logDelegate;
/*! @brief 停止打印log会清理block或者delegate为空释放block
* @param
*/
+ (void)stopLog;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 2ab0aef16a26f5644b74f28801dcf547
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 6e517efafdbb3fd47aa83f1733cf045e
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,68 @@
//
// WechatAuthSDK.h
// WechatAuthSDK
//
// Created by 李凯 on 13-11-29.
// Copyright (c) 2013年 Tencent. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
enum AuthErrCode {
WechatAuth_Err_Ok = 0, //Auth成功
WechatAuth_Err_NormalErr = -1, //普通错误
WechatAuth_Err_NetworkErr = -2, //网络错误
WechatAuth_Err_GetQrcodeFailed = -3, //获取二维码失败
WechatAuth_Err_Cancel = -4, //用户取消授权
WechatAuth_Err_Timeout = -5, //超时
};
@protocol WechatAuthAPIDelegate<NSObject>
@optional
- (void)onAuthGotQrcode:(UIImage *)image; //得到二维码
- (void)onQrcodeScanned; //二维码被扫描
- (void)onAuthFinish:(int)errCode AuthCode:(nullable NSString *)authCode; //成功登录
@end
@interface WechatAuthSDK : NSObject{
NSString *_sdkVersion;
__weak id<WechatAuthAPIDelegate> _delegate;
}
@property(nonatomic, weak, nullable) id<WechatAuthAPIDelegate> delegate;
@property(nonatomic, readonly) NSString *sdkVersion; //authSDK版本号
/*! @brief 发送登录请求等待WechatAuthAPIDelegate回调
*
* @param appId ID
* @param nonceStr 使signature不同
* @param timeStamp
* @param scope ,
* @param signature
* @param schemeData scheme后
* @return YESNO
:Auth在运行Auth未完成或未Stop再次调用Auth接口时会返回NO
*/
- (BOOL)Auth:(NSString *)appId
nonceStr:(NSString *)nonceStr
timeStamp:(NSString *)timeStamp
scope:(NSString *)scope
signature:(NSString *)signature
schemeData:(nullable NSString *)schemeData;
/*! @brief 暂停登录请求
*
* @return YESNO
*/
- (BOOL)StopAuth;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 5af5dbc4f818a804ebbedc9a933cd573
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,89 @@
//
// NativeBridge.m
// Unity-iPhone
//
#import <Foundation/Foundation.h>
#import "WXApi.h"
//appid
void RegisterApp(const char* appid)
{
NSString *weichatId = [NSString stringWithFormat:@"%s", appid];
BOOL installed = [WXApi isWXAppInstalled];
NSLog(@"installed result: %@", installed?@"true":@"false");
BOOL result = [WXApi registerApp:weichatId universalLink:(@"https://wx.powerfun.com.cn/pf2/")];
NSLog(@"result: %@", result?@"true":@"false");
}
//
void LaunchMiniProgram(const char* miniProgramID, const char* path){
WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object];
launchMiniProgramReq.userName = [NSString stringWithUTF8String:miniProgramID]; //username
launchMiniProgramReq.path = [NSString stringWithUTF8String:path]; //// query "?foo=bar"
launchMiniProgramReq.miniProgramType = WXMiniProgramTypeRelease; //
[WXApi sendReq:launchMiniProgramReq completion:^(BOOL success) {}];
}
//
void ShareImgToWX(int scene, UInt8 *msgByteArrayData, int arrayLength, const char* title, const char* description){
WXImageObject *imageObject = [WXImageObject object];
imageObject.imageData = [[NSData alloc] initWithBytes:msgByteArrayData length:arrayLength];
WXMediaMessage *message = [WXMediaMessage message];
message.title = [NSString stringWithUTF8String:title];
message.description = [NSString stringWithUTF8String:description];
// APPIcon
NSDictionary *infoPlist = [[NSBundle mainBundle] infoDictionary];
NSString *icon = [[infoPlist valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"] lastObject];
[message setThumbImage:[UIImage imageNamed:icon]];
message.mediaObject = imageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = scene;
[WXApi sendReq:req completion:nil];
}
//
void ShareUrlToWX(int scene, const char* url, const char* title, const char* description){
WXWebpageObject *webpageObject = [WXWebpageObject object];
webpageObject.webpageUrl = [NSString stringWithUTF8String:url];
WXMediaMessage *message = [WXMediaMessage message];
message.title = [NSString stringWithUTF8String:title];
message.description = [NSString stringWithUTF8String:description];
// APPIcon
NSDictionary *infoPlist = [[NSBundle mainBundle] infoDictionary];
NSString *icon = [[infoPlist valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"] lastObject];
[message setThumbImage:[UIImage imageNamed:icon]];
message.mediaObject = webpageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = scene;
[WXApi sendReq:req completion:nil];
}
//
bool IsWechatInstalled_iOS()
{
return [WXApi isWXAppInstalled];
}
//
void WechatLogin(const char* scope,const char* state)
{
//
SendAuthReq* req = [[SendAuthReq alloc] init];
req.scope = [NSString stringWithUTF8String:scope];
req.state = [NSString stringWithUTF8String:state];
[WXApi sendReq:req completion:nil];
}
//(appid)
void OpenWXApp()
{
[WXApi openWXApp];
}

View File

@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 9ba744e6ebf3c3048baab0a17ad58af0
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,80 @@
fileFormatVersion: 2
guid: 5fd23b9d6d5286d4fba4c1e792198a28
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 1
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 0
- first:
Android: Android
second:
enabled: 0
settings:
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: AnyOS
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: x86_64
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: x86_64
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: x86
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: x86_64
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
CPU: AnyCPU
CompileFlags:
FrameworkDependencies: Security;WebKit;
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f134d222725933a4a8aa79fee0ebc10c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4be878da00cf764499988cf403faf94d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -68,7 +68,7 @@ public static class App
} }
public static string CurrentScene { get; set; }//当前场景 public static string CurrentScene { get; set; }//当前场景
public static WeChatController weChatController = new WeChatController();
static App() static App()
{ {
#if !UNITY_EDITOR #if !UNITY_EDITOR

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f2c27d8ea9a20894180ddf2895a82fed
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,35 @@
using Assets.Scripts;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoginControllerMobile : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void ShowThirdLoginPage()
{
}
private void HideThirdLoginPage()
{
}
/// <summary>
/// 从ios或者安卓接收code在c#里不建议调用
/// </summary>
/// <param name="res"></param>
public void OnMobileWxLoginResp(string res)
{
Utils.showToast(gameObject, res, type: 1);
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d8bafb22521430b43985508b40e72fd4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,174 @@
using System.Runtime.InteropServices;
using UnityEngine;
/// <summary>
/// Create By Jooki: https://www.yuque.com/jooki
/// 使用流程:
/// WeChatController是一个单例 请自行给变量 _className 赋值
/// 使用前先调用 Init() 进行初始化,然后调用 IsWeChatAppInstalled() 检查用户设备上是否安装了微信;
/// 之后为保险起见调用 IsWeChatAppInstalled() 判断微信是否已经安装;
/// 最后就是按照需要分享的消息类型调用对应的方法
/// </summary>
public class WeChatController
{
#region iOS微信SDK
#if UNITY_IOS
[DllImport("__Internal")]
private static extern void RegisterApp(string appid);
[DllImport("__Internal")]
private static extern bool IsWechatInstalled_iOS();
[DllImport("__Internal")]
private static extern void WechatLogin(string scope,string state);
#endif
#endregion
/// <summary>
/// com.unityplugins.wechatshare是在Android Studio中创建的 Module,
/// MainActivity 是一个Activity 对外供C#调用的方法都写在这个Activity内
/// </summary>
private readonly string _className = "com.unityplugins.wechatshare.MainActivity";
private string _APP_ID = "";
private AndroidJavaClass mainActivityClass = null;
private static WeChatController _instance;
public static WeChatController Instance
{
get
{
if (_instance == null)
{
_instance = new WeChatController();
}
return _instance;
}
}
/// <summary>
/// 初始化微信SDK APPID是用户在微信开放平台注册是所分配的应用唯一标识 可在微信开放平台找到
/// </summary>
/// <param name="APPID"></param>
public void Init(string APPID)
{
_APP_ID = APPID;
#if !UNITY_EDITOR && UNITY_ANDROID
mainActivityClass = new AndroidJavaClass(_className);
// 第一个参数: MainActivity中的方法名
// 第二、三个参数: 分别是SendMessageToUnity需要接收的第一和第二个参数对比上面Java的代码
mainActivityClass.CallStatic("InitWeChat", Application.identifier, _APP_ID);
#endif
#if !UNITY_EDITOR && UNITY_IOS
RegisterApp(_APP_ID);
#endif
}
/// <summary>
/// 判断是否是否安装了微信
/// </summary>
/// <returns></returns>
public bool IsWeChatAppInstalled()
{
#if UNITY_ANDROID
return mainActivityClass.CallStatic<bool>("IsWeChatInstalled");
#elif UNITY_IOS
return IsWechatInstalled_iOS();
#endif
}
/// <summary>
/// 分享链接至微信缩略图用的是APP Icon
/// </summary>
/// <param name="scene">分享至什么场景, 0-对话、1-朋友圈、2-收藏</param>
/// <param name="url">网页链接</param>
/// <param name="title">标题</param>
/// <param name="description">描述</param>
public void ShareWebpageToWX(int scene, string url, string title, string description)
{
mainActivityClass.CallStatic("ShareWebpageToWX", scene, url, title, description);
}
/// <summary>
/// 分享文字至微信
/// </summary>
/// <param name="scene">分享至什么场景, 0-对话、1-朋友圈、2-收藏</param>
/// <param name="text">要分享的文本内容</param>
public void ShareTextToWX(int scene, string text)
{
mainActivityClass.CallStatic("ShareTextToWX", scene, text);
}
/// <summary>
/// 分享图片至微信
/// </summary>
/// <param name="scene">分享至什么场景, 0-对话、1-朋友圈、2-收藏</param>
/// <param name="image">要分享的图片</param>
public void ShareImageToWX(int scene, Texture2D image)
{
mainActivityClass.CallStatic("ShareImageToWX", scene, ImageToBytes(image));
}
/// <summary>
/// 分享音乐至微信
/// </summary>
/// <param name="scene">分享至什么场景, 0-对话、1-朋友圈、2-收藏</param>
/// <param name="musicUrl">音乐的URL</param>
/// <param name="title">标题</param>
/// <param name="description">描述</param>
public void ShareMusicToWX(int scene, string musicUrl, string title, string description)
{
mainActivityClass.CallStatic("ShareMusicToWX", scene, musicUrl, title, description);
}
/// <summary>
/// 分享视频至微信
/// </summary>
/// <param name="scene">分享至什么场景, 0-对话、1-朋友圈、2-收藏</param>
/// <param name="videoUrl">视频的URL</param>
/// <param name="title">标题</param>
/// <param name="description">描述</param>
public void ShareVideoToWX(int scene, string videoUrl, string title, string description)
{
mainActivityClass.CallStatic("ShareVideoToWX", scene, videoUrl, title, description);
}
/// <summary>
/// 分享小程序至微信
/// </summary>
/// <param name="scene">分享至什么场景, 0-对话、1-朋友圈、2-收藏</param>
/// <param name="lowVersionUrl">兼容低版本的网页链接</param>
/// <param name="miniProgramAPPID">小程序原始ID, 获取方法:登录小程序管理后台-设置-基本设置-帐号信息</param>
/// <param name="path">小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"</param>
/// <param name="title">标题</param>
/// <param name="description">描述</param>
/// <param name="coverImg">分享封面图片</param>
public void ShareMinniProgramToWX(int scene, string lowVersionUrl, string miniProgramAPPID, string path,
string title, string description, Texture2D coverImg)
{
mainActivityClass.CallStatic("ShareMinniProgramToWX", scene, lowVersionUrl, miniProgramAPPID, path, title, description, ImageToBytes(coverImg));
}
public void WxLogin(string scope, string state)
{
#if UNITY_ANDROID
mainActivityClass.CallStatic("WxLogin", scope, state);
#elif UNITY_IOS
WechatLogin(scope, state);
#endif
}
public void SendMessageToUnity(string gameObjectName, string UnityMethodName)
{
mainActivityClass.CallStatic("SendMessageToUnity",gameObjectName, UnityMethodName);
}
/// <summary>
/// 把一张Texture2D的图片信息转为Byte[]
/// </summary>
/// <param name="texture"></param>
/// <returns></returns>
private byte[] ImageToBytes(Texture2D texture)
{
var imageData = texture.EncodeToPNG();
return imageData;
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 94968fb42ad40634ab6b22df87c405cf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -454,11 +454,28 @@ public class LoginController : MonoBehaviour
{ "Days",signForm.days}, { "Days",signForm.days},
}; };
avatar = Resources.Load<Texture>("Images/New Account"); avatar = Resources.Load<Texture>("Images/New Account");
#if UNITY_ANDROID || UNITY_IOS
transform.Find("Version").GetComponent<Text>().text = $"V{App.AppVersion}";
#else
transform.Find("Panel").Find("Version").GetComponent<Text>().text = $"V{App.AppVersion}"; transform.Find("Panel").Find("Version").GetComponent<Text>().text = $"V{App.AppVersion}";
#endif
}
public void Test(string key)
{
Debug.Log(key);
} }
async void Init() async void Init()
{ {
#if !UNITY_EDITOR && (UNITY_ANDROID || UNITY_IOS)
var weChat = App.weChatController;
//WeChatController weChat = new WeChatController();
weChat.Init("wx9146e6697a6aef2d");
if (weChat.IsWeChatAppInstalled())
{
weChat.WxLogin("snsapi_userinfo", "");
}
#endif
UIManager.Instance.ModalsPanel = this.transform.Find("ModalPanel").GetComponent<PFUIPanel>(); UIManager.Instance.ModalsPanel = this.transform.Find("ModalPanel").GetComponent<PFUIPanel>();
userInfos = UIManager.Instance.userInfos; userInfos = UIManager.Instance.userInfos;
App.DefaultRotateTexture = Utils.ReadTextureFromPlayerPrefs("rotateImage"); App.DefaultRotateTexture = Utils.ReadTextureFromPlayerPrefs("rotateImage");
@ -910,10 +927,12 @@ public class LoginController : MonoBehaviour
/// </summary> /// </summary>
private void goLoginImmediately() private void goLoginImmediately()
{ {
#if !(UNITY_IOS || UNITY_ANDROID)
imagedf.localPosition = new Vector3(-580, -34, 0); imagedf.localPosition = new Vector3(-580, -34, 0);
imagexf.localPosition = new Vector3(0, -669, 0); imagexf.localPosition = new Vector3(0, -669, 0);
LoginBg.localPosition = Vector3.zero; LoginBg.localPosition = Vector3.zero;
LoginBg.GetComponent<RectTransform>().sizeDelta = new Vector2(360, 573); LoginBg.GetComponent<RectTransform>().sizeDelta = new Vector2(360, 573);
#endif
var scrollValue = 1f / (pageNums - 1); var scrollValue = 1f / (pageNums - 1);
var value = 1 * scrollValue; var value = 1 * scrollValue;
scrollPanel.horizontalNormalizedPosition = value; scrollPanel.horizontalNormalizedPosition = value;
@ -924,6 +943,7 @@ public class LoginController : MonoBehaviour
/// </summary> /// </summary>
void ReturnQuick() void ReturnQuick()
{ {
#if !(UNITY_IOS || UNITY_ANDROID)
if (imagexf != null) if (imagexf != null)
{ {
imagexf.DOLocalMoveY(-575, 0.3f); imagexf.DOLocalMoveY(-575, 0.3f);
@ -937,6 +957,7 @@ public class LoginController : MonoBehaviour
LoginBg.GetComponent<RectTransform>().DOSizeDelta(new Vector2(360, 385), 0.3f); LoginBg.GetComponent<RectTransform>().DOSizeDelta(new Vector2(360, 385), 0.3f);
LoginBg.GetComponent<RectTransform>().DOLocalMoveY(-94, 0.3f); LoginBg.GetComponent<RectTransform>().DOLocalMoveY(-94, 0.3f);
} }
#endif
this.StartScrollPanel(0); this.StartScrollPanel(0);
} }
/// <summary> /// <summary>
@ -945,6 +966,7 @@ public class LoginController : MonoBehaviour
/// <param name="noReturn"></param> /// <param name="noReturn"></param>
public void goLogin(bool noReturn = false) public void goLogin(bool noReturn = false)
{ {
#if !(UNITY_IOS || UNITY_ANDROID)
if (imagexf != null) if (imagexf != null)
{ {
imagexf.DOLocalMoveY(-669, 0.3f); imagexf.DOLocalMoveY(-669, 0.3f);
@ -958,6 +980,7 @@ public class LoginController : MonoBehaviour
LoginBg.GetComponent<RectTransform>().DOSizeDelta(new Vector2(360, 573), 0.3f); LoginBg.GetComponent<RectTransform>().DOSizeDelta(new Vector2(360, 573), 0.3f);
LoginBg.GetComponent<RectTransform>().DOLocalMoveY(0, 0.3f); LoginBg.GetComponent<RectTransform>().DOLocalMoveY(0, 0.3f);
} }
#endif
//DOTween.To(() => o, x => o = x, t, 0.3f); //DOTween.To(() => o, x => o = x, t, 0.3f);
this.StartScrollPanel(1); this.StartScrollPanel(1);
if (noReturn) if (noReturn)

View File

@ -6,8 +6,8 @@ EditorBuildSettings:
serializedVersion: 2 serializedVersion: 2
m_Scenes: m_Scenes:
- enabled: 1 - enabled: 1
path: Assets/Scenes/Login.unity path: Assets/Scenes/Login-Mobile.unity
guid: 6dce3e17997730b4492f91dd8fede429 guid: 4be878da00cf764499988cf403faf94d
- enabled: 1 - enabled: 1
path: Assets/Scenes/MainScene.unity path: Assets/Scenes/MainScene.unity
guid: ab586a3c1bacd4a48a55178eb06fe0cc guid: ab586a3c1bacd4a48a55178eb06fe0cc

View File

@ -38,7 +38,6 @@ GraphicsSettings:
- {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 16003, guid: 0000000000000000f000000000000000, type: 0}
m_PreloadedShaders: [] m_PreloadedShaders: []
m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000,
type: 0} type: 0}

View File

@ -177,7 +177,8 @@ PlayerSettings:
androidSupportedAspectRatio: 1 androidSupportedAspectRatio: 1
androidMaxAspectRatio: 2.1 androidMaxAspectRatio: 2.1
applicationIdentifier: {} applicationIdentifier: {}
buildNumber: {} buildNumber:
iPhone: 2.0.1.0
AndroidBundleVersionCode: 1 AndroidBundleVersionCode: 1
AndroidMinSdkVersion: 24 AndroidMinSdkVersion: 24
AndroidTargetSdkVersion: 0 AndroidTargetSdkVersion: 0
@ -257,15 +258,15 @@ PlayerSettings:
AndroidTargetArchitectures: 1 AndroidTargetArchitectures: 1
AndroidSplashScreenScale: 0 AndroidSplashScreenScale: 0
androidSplashScreen: {fileID: 0} androidSplashScreen: {fileID: 0}
AndroidKeystoreName: AndroidKeystoreName: '{inproject}: Assets/Plugins/Android/powerfun.keystore'
AndroidKeyaliasName: AndroidKeyaliasName: powerfun
AndroidBuildApkPerCpuArchitecture: 0 AndroidBuildApkPerCpuArchitecture: 0
AndroidTVCompatibility: 0 AndroidTVCompatibility: 0
AndroidIsGame: 1 AndroidIsGame: 1
AndroidEnableTango: 0 AndroidEnableTango: 0
androidEnableBanner: 1 androidEnableBanner: 1
androidUseLowAccuracyLocation: 0 androidUseLowAccuracyLocation: 0
androidUseCustomKeystore: 0 androidUseCustomKeystore: 1
m_AndroidBanners: m_AndroidBanners:
- width: 320 - width: 320
height: 180 height: 180