Unity-iOS接入微信SDK-微信登录

前言

默认熟悉Unity 和 Xcode 开发工具的基本使用方法,并且具有一定的编程知识基础.
Unity版本:unity 2018.1.7f1
Xcode版本:Xcode 10.0

下载微信SDK

微信SDK下载地址:微信开放平台.

导出Unity Xcode项目

导出Unity Xcode项目,并打开选择你的调试证书。

Xcode导入微信SDK

将微信SDK文件中包含的libWeChatSDK.a, WXApi.h, WXApiObject.h, WechatAuthSDK.h 这四个文件添加到你刚才打开的xcode工程中 (如下图所示,在Unity-iPhone工程目录下创建/wecaht)。
Unity-iOS接入微信SDK-微信登录

Xcode相关属性配置

1.微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在工程中链接上(这边有几个库跟微信官方平台上说的有点不一样,就是这三个libz.dylib, libsqlite3.0.dylib, libc++.dylib 在这里后缀都是tbd):

  • SystemConfiguration.framework
  • libz.tbd
  • libsqlite3.0.tbd
  • libc++.tbd
  • Security.framework
  • CoreTelephony.framework
  • CFNetwork.framework
    Unity-iOS接入微信SDK-微信登录

2.在你的工程文件中选择 Build Setting下的Linking项中"Other Linker Flags"中加入 “-Objc -all_load”
Unity-iOS接入微信SDK-微信登录

特别说明:如果你导出的Xcode项目中包含其他静态库而导致报错的话,需要将 -Objc -all_load 修改成 -Objc _force_load $(SRCROOT)/wechat/libWeChatSdk.a

3.在你的工程文件中选择Info下的URL Types 点击增加一个选项,然后在Identifier 填入包名,在URL Schemes 填入你在微信后台注册的appid。
Unity-iOS接入微信SDK-微信登录

温馨提示:认真看文档 这里URL Schemes 容易搞错,这里填的是在微信后台注册的appid。这里出错会出现跳转到维信后点击无反应。

添加一个新的项 LSApplicationQueriesSchemes 将类型修改为 Array , 并添加两个子项:wechat, weixin
Unity-iOS接入微信SDK-微信登录

脚本修改

在Libraries 下新建文件夹WXApiManager 在里面添加必要的代码 (位置个人喜好,后面引用需要用到自己注意就好了)
1.新建WXApiManager.h, 增加 WXApiDelegate协议

//
//  WXApiManager.h
//  Unity-iPhone
//  bowenk
//  Created by bowenk on 2018/9/27.
//

#import <Foundation/Foundation.h>
#import "wechat/WXApi.h"


NS_ASSUME_NONNULL_BEGIN

@interface WXApiManager : UIResponder<UIApplicationDelegate, WXApiDelegate>

+ (instancetype)shareManager;

@end

NS_ASSUME_NONNULL_END

2.新建WXApiManager.mm 重写接收微信回调信息

//
//  WXApiManager.m
//  Unity-iPhone
//  bowenk
//  Created by bowenk on 2018/9/27.
//

#import "WXApiManager.h"

@implementation WXApiManager

+(instancetype) shareManager
{
    static dispatch_once_t onceToken;
    static WXApiManager *instance;
    dispatch_once(&onceToken, ^{
        instance = [[WXApiManager alloc] init];
    });
    return instance;
}

-(void) onReq:(BaseReq *)req {}

-(void) onResp:(BaseResp *)resp
{
    if([resp isKindOfClass:[SendAuthResp class]])
    {
        SendAuthResp *temp = (SendAuthResp*)resp;
        int errorCode = temp.errCode;
        switch (errorCode) {
            case 0:
                {
                    printf("登录成功-xcode");
                    UnitySendMessage("[_WechatHelper]", "LoginSuccess", [NSUTF8StringEncoding temp.code]);
                    break;
                }
            case -2:
                printf("用户取消");
                UnitySendMessage("[_WechatHelper]", "LoginFail", "用户取消");
                break;
            case -4:
                printf("用户拒绝授权");
                UnitySendMessage("[_WechatHelper]", "LoginFail", "用户拒绝授权");
                break;
            default:
                printf("登录失败");
                UnitySendMessage("[_WechatHelper]", "LoginFail", "登录失败");
                break;
        }
    }
}

@end

3.新建接口文件 PluginSystem.m 这是Unity跟iOS的接口文件,Unity调用这些接口来操作的。

//
//  PluginSystem.m
//  Unity-iPhone
//  bowenk
//  Created by bowenk on 2018/9/27.
//

#import <Foundation/Foundation.h>
#import "wechat/WXApi.h"

//这是向微信终端注册你的appid
void _registerApp(char* appid)
{
    NSString *weichatId = [NSString stringWithFormat:@"%s", appid];
    [WXApi registerApp:weichatId];
}

//登录
void _wechatLogin(char* message)
{
    SendAuthReq* req = [[SendAuthReq alloc] init];
    req.scope = @"snsapi_userinfo";
    req.state = [NSString stringWithFormat:@"%s", message];
    [WXApi sendReq:req];
}

//判断是否安装微信
bool _isWechatInstalled()
{
    return [WXApi isWXAppInstalled];
}

4.在Classes 目录下找到 UnityAppController.mm文件,导入刚才的微信SDK中的WXApi.h 和 WXApiManager.h
Unity-iOS接入微信SDK-微信登录
重写 handleOpenURL 和修改 openURL 方法
Unity-iOS接入微信SDK-微信登录

踩过的坑

1、所有方法都没问题了,点击登录也跳转到微信了,但是点击微信端的登录按钮没有一点反应,一度怀疑是不是注册的包名有问题,就是如图情况:
Unity-iOS接入微信SDK-微信登录
就是点击这个确认登录,死活没有反应,一点反馈也没有,也不会报错。
最后发现就是前面特别强调的URL Schemes填错了。这里在强调一遍URL Schemes 填的是在微信上注册的appid

参考文章

1.微信 开放平台 iOS接入指南

2.Unity接入微信SDK——iOS(接入微信SDK)