Unity iOS プラットフォームは WeChat SDK にアクセスし、WeChat ログインなどの機能を実現します

記事ディレクトリ

      • I.はじめに
      • 2. プロセス
        • 1. 開発者アカウントを申請する
        • 2. アプリケーションを作成する
        • 3.SDKをダウンロードする
        • 4.Unityへのインポート
        • 5. Objective-C コードを書く
          • 5.1、CustomAppController.mm
          • 5.2、WXApiManager.h
          • 5.3、WXApiManager.mm
          • 5.4. コールバックオブジェクトの登録
          • 5.5. パッケージ初期化インターフェース
          • 5.6、カプセル化ログインインターフェイス
          • 5.7. その他のインターフェースのカプセル化
        • 6、XCodeAPI
        • 7.ユニバーサルリンクについて
        • 8. iOSノッチ画面適応について
      • 3つ、終わった

I.はじめに

皆さんこんにちは、私は新人です。
小さな友人が、Unity で WeChat ログインにアクセスする方法を私に尋ねました。

答えは、WeChat SDK にアクセスすることです。しかし、WeChat オープン プラットフォームのドキュメントはあまり親切ではありません。ここでは、そのプロセスについて説明します。質問があります。(注: 手元に Mac コンピューターがないため、テストするのが不便です。この記事では主にプロセスについて説明します。)
注: この記事では、iOS プラットフォームを例として取り上げます。

2. プロセス 1. 開発者アカウントを申請する

まず、WeChat オープン プラットフォームのエンタープライズ開発者アカウントが必要です。WeChat オープン プラットフォームのアドレス: https://open.weixin.qq.com/。登録プロセスは

非常に簡単なので、ここでは説明しません詳細に入ります。

2. アプリケーションを作成する

上記の開発者アカウントを申請した後、ログインできるようになります。開発者アカウントにログインした後、管理センターに入り、モバイル アプリケーションを選択して、[モバイル アプリケーションの作成] をクリックし、関連情報を入力して送信し、審査を待ち

ます

。 . レビューに合格すると、アプリケーションを取得できます。AppID と AppSecret、これら 2 つの値は、後で SDK インターフェイスを呼び出すときに必要になります。

3.SDKをダウンロードする

まず、WeChat オープン プラットフォームのドキュメントをご覧ください。これは iOS アクセス ガイド ドキュメントです:
https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html SDK を導入するには 2 つの方法があります:
1. CocoaPods 統合による (Android Gradle 構成の依存関係、依存ファイルの自動ダウンロードに似ています)
2. 手動統合。(SDK ライブラリ ファイルを手動でダウンロードし、プロジェクトにインポートします)

通常、イントラネット上で開発を行うため、ここでは手動での統合方法について説明します。
iOS プラットフォーム SDK ライブラリ ファイルのダウンロード ページ: https://developers.weixin.qq.com/doc/oplatform/Downloads/iOS_Resource.html
iOS 開発キットをクリックして、SDK ライブラリ ファイルをダウンロードします。デモの例を見たい場合は、 、次のように [サンプル コード] をクリックできます。

4.Unityへのインポート

iOS 開発キットをダウンロードしたら、解凍します。中には .a ライブラリ ファイル 1 つと .h ヘッダー ファイル 3 つが含まれており、

これらを次のように Unity プロジェクトの Assets/Plugins/iOS/WeChatSDK ディレクトリにコピーします。

5. Objective-C コードを書く

C# で SDK インターフェイスを呼び出すには、中間層 (Objective-C で記述) を記述する必要があります。

5.1、CustomAppController.mm

iOS プラットフォーム上の SDK に接続する場合、SDK のライフサイクルを維持するために独自の AppController を実装する必要がありますが、デフォルトは UnityAppController であり、これを継承してロジックを書き換えることができます。
次のように、Assets/Plugins/iOS/ ディレクトリに CustomAppController.mm ファイルを作成します
(注: ファイル名は xxxxAppController.mm である必要があります。プレフィックス xxxx はカスタマイズできますが、省略できません。たとえば、私はこれを CustomAppController と呼びます) .mm )

内容は次のとおりです。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// CustomAppController.mm

#import  "UnityAppController.h"

@interface CustomAppController : UnityAppController

@end

IMPL_APP_CONTROLLER_SUBCLASS (CustomAppController)

@implementation CustomAppController

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

{<!-- -->

    [super application:application didFinishLaunchingWithOptions:launchOptions];

    // TODO

    return YES;

}

@end

注: 上記のコードにはマクロ IMPL_APP_CONTROLLER_SUBCLASS があり、Unity は IMPL_APP_CONTROLLER_SUBCLASS を通じてデフォルトの UnityAppController の代わりにカスタム CustomAppController を使用することを認識しています。

さて、プロセスを続けてください。

5.2、WXApiManager.h

Assets/Plugins/iOS/ ディレクトリに WeChatUnity フォルダーを作成し、WXApiManager.h ヘッダー ファイルを作成します。内容は次のとおりです。非常に単純です。WXApi.h ヘッダー ファイルをインポートし、WXApiDelegate を継承して

、シングルトンオブジェクトsharedManager、

1

2

3

4

5

6

7

8

9

10

11

// WXApiManager.h

#import <foundation foundation.h="">

#import "WXApi.h"

@interface WXApiManager : NSObject<wxapidelegate>

+ (instancetype)sharedManager;

@end

</wxapidelegate></foundation>

5.3、WXApiManager.mm

特定のロジックを実装するには、WXApiManager.h と同じディレクトリに WXApiManager.mm ファイルを作成します。

内容は以下の通り、

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#import "WXApiManager.h"

@implementation WXApiManager

// 单例

+(instancetype)sharedManager {<!-- -->

    static dispatch_once_t onceToken;

    static WXApiManager *instance;

    dispatch_once(&onceToken, ^{<!-- -->

        instance = [[WXApiManager alloc] init];

    });

    return instance;

}

- (void)onResp:(BaseResp *)resp {<!-- -->

    // TODO 微信回调,调用微信SDK的sendReq,会回调此方法,登录、分享等都是回调到这里

}

- (void)onReq:(BaseReq *)req {<!-- -->

    // TODO 微信回调,从微信端主动发送过来的请求

}

@end

まずはTODOの内容を押さえて、プロセスを進めていきましょう。

5.4. コールバックオブジェクトの登録

WeChat に WXApiManager オブジェクトの onResp メソッドにコールバックさせたい場合は、最初に WeChat に指示する必要があります。そうしないと、どこにコールバックすればよいかわかりません。
CustomAppController.mm ファイルに戻り、最初にヘッダー ファイルを紹介します。

1

#import "WXApiManager.h"

添加如下的调用,

1

2

3

4

5

6

7

8

9

10

11

12

13

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {<!-- -->

    return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];

}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {<!-- -->

    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];

}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<uiuseractivityrestoring>> * __nullable restorableObjects))restorationHandler

{<!-- -->

    return [WXApi handleOpenUniversalLink:userActivity delegate:[WXApiManager sharedManager]];

}

</id<uiuseractivityrestoring>

5.5、封装初始化接口

微信SDK的初始化调用是

1

[WXApi registerApp:@"你的APPID" universalLink:@"你的UniversalLink"];

你可以把它放在CustomAppController.mm的didFinishLaunchingWithOptions方法中,如下:

1

2

3

4

5

6

7

8

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

{<!-- -->

    [super application:application didFinishLaunchingWithOptions:launchOptions];

     

    [WXApi registerApp:@"你的APPID" universalLink:@"你的UniversalLink"];

     

    return YES;

}

它是程序启动时最先执行的地方,如果你不想在这么前的位置执行,想推迟到在C#层去执行,则可以封装一个接口出来,然后由C#层来调用。
我们在Assets/Plugns/iOS/WeChatUnity文件夹中创建WeChatUnity.mm文件,如下,

内容如下,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

// WeChatUnity.mm

#import <foundation foundation.h="">

#import "WXApiManager.h"

#define UNITY_CS_API extern "C"

static NSString *mWXAppid = nil;

// 将c字符串const char* 转为 oc字符串NSString

static inline NSString * str_c2ns(const char*s)

{<!-- -->

    if (s)

        return [NSString stringWithUTF8String: s];

    else

        return [NSString stringWithUTF8String: ""];

}

// 初始化

UNITY_CS_API void UnityWeChatInit(const char* appId, const char* universalLink)

{<!-- -->

    mWXAppid = str_c2ns(appId);

    [WXApi registerApp:mWXAppid universalLink:str_c2ns(universalLink)];

}

</foundation>

接着,我们就可以在C#层声明这个接口并调用了,我们新建一个C#脚本,名叫WeChatSDK.cs,如下

内容如下,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

// WeChatSDK.cs

using UnityEngine;

public class WeChatSDK

{<!-- -->

    public static void Init()

    {<!-- -->

#if UNITY_IOS

        UnityWeChatInit("你的APPID""你的UniversalLink");

#elif UNITY_ANDROID

        // TODO Android的调用

#endif

    }

#if UNITY_IOS

        [DllImport("__Internal")]

        static extern void UnityWeChatInit(string appId, string universalLink);

#endif

}

然后你就可以在你的C#入口脚本那里调用WeChatSDK.Init()了。

5.6、封装登录接口

同理,我们继续在WeChatUnity.mm中封装登录接口,

1

2

3

4

5

6

7

8

9

10

11

12

// WeChatUnity.mm

UNITY_CS_API void UnityWeChatLogin(const char* state)

{<!-- -->

    NSLog(@"UnityWeChatLogin");

    SendAuthReq* req = [[SendAuthReq alloc] init];

    req.scope = @"snsapi_userinfo";;

    req.state = str_c2ns(state);

    [WXApi sendReq:req completion:nil];

    // 此时会拉起微信,授权后会回调WXApiManager的onResp方法

}

回到WeChatSDK.cs脚本,添加Login接口,如下,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// WeChatSDK.cs

public static void Login()

{<!-- -->

#if UNITY_IOS

    // "app_wechat"后期改为随机数加session来校验

    UnityWeChatLogin("app_wechat");

#elif UNITY_ANDROID

    // TODO Android的调用

#endif

}

     

#if UNITY_IOS

        [DllImport("__Internal")]

        static extern void UnityWeChatLogin(string state);

#endif

当你在游戏中点击微信登录按钮时,即可调用WeChatSDK.Login啦。
接着,我们去WXApiManager.mm的onResp添加回调的响应逻辑,如下,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

// WXApiManager.mm

- (void)onResp:(BaseResp *)resp {<!-- -->

    if ([resp isKindOfClass:[SendAuthResp class]]) {<!-- -->

        NSLog(@"微信授权回调");

        if (resp.errCode == 0) {<!-- -->

            // 通过code去交换token,此步需要用到APPSecret,这个字段非常敏感

            // 实际项目此步是放在服务端执行,这里仅作为客户端演示

            [self requestWxToken:((SendAuthResp *)resp).code];

        }

        else

        {<!-- -->

            // 失败,回调给Unity

            UnitySendMessage("SDKCallBack""WeChatLoginCallback""");

        }

    }

}

// 通过code换取token,此步实际项目是放在服务端执行

-(void)requestWxToken:(NSString*)code {<!-- -->

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code", mWXAppid, "你的APPSecret", code]];

     

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLSession *session = [NSURLSession sharedSession];

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {<!-- -->

        if (error == nil) {<!-- -->

            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

             

            [self requestWxUserInfo:[dict valueForKey:@"access_token"]];

        }

    }];

     

    [dataTask resume];

}

// 通过token查询用户信息,此步实际项目是放在服务端执行

-(void)requestWxUserInfo:(NSString*)token{<!-- -->

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",token, mWXAppid]];

     

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLSession *session = [NSURLSession sharedSession];

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {<!-- -->

        if (error == nil) {<!-- -->

            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

            NSString *jsonStr = [self DataTOjsonString:dict];

            // 回调给Unity

            UnitySendMessage("SDKCallBack""WeChatLoginCallback",[jsonStr UTF8String]);

        }

    }];

     

    [dataTask resume];

}

上面的结果我们是通过UnitySendMessage接口给Unity发送消息的,会查找名字为SDKCallBack的物体上的脚本,调用脚本中的WeChatLoginCallback方法。
我们在场景中创建一个空物体,重命名为SDKCallBack,

然后创建一个SDKCallBack.cs脚本,并将其挂到SDKCallBack物体上,

我们在SDKCallBack脚本中实现WechatLoginCallback方法,如下,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

// SDKCallBack.cs

using UnityEngine;

public class SDKCallBack : MonoBehaviour

{<!-- -->

    /// <summary>

    /// 登录回调

    /// </summary>

    /// <param name="callBackInfo">

    public void WechatLoginCallback(string callBackInfo)

    {<!-- -->

        // openid       普通用户的标识,对当前开发者帐号唯一

        // nickname     普通用户昵称

        // sex          普通用户性别,1为男性,2为女性

        // province     普通用户个人资料填写的省份

        // city         普通用户个人资料填写的城市

        // country      国家,如中国为CN

        // headimgurl    用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空

        // privilege        用户特权信息,json数组,如微信沃卡用户为(chinaunicom)

        // unionid      用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。多app数据互通保存该值

        // access_token  用户当前临时token值,自主添加的值

        if(string.IsNullOrEmpty(callBackInfo))

        {<!-- -->

            // TODO 登录失败,请重试

        }

        else

        {<!-- -->

            // 解析字段,登录进游戏服务器

        }

    }

}

5.7、其他接口封装

其他接口流程同理,在WeChatUnity.mm中封装C接口,调用微信SDK的API,
在WeChatSDK.cs中声明[DllImport("__Internal")],封装C#层接口,在WXApiManager.mm的onResp中处理响应,通过UnitySendMessage发消息给Unity,在SDKCallBack.cs中处理回调。
画个图方便大家理解,

流程懂了之后,大家应该就知道怎么封装接口和调用了,我这里就不往下写了~

6、XCodeAPI

我们知道,Unity打包iOS平台是导出XCode工程,我们还需要在XCode工程中做一些设置,最后再导出ipa,事实上,这个过程也可以写成自动化处理,我之前写过一篇文章讲过XCodeAPI,推荐大家看下,《Unity打iOS包之xcodeapi的使用》

7、关于Universal Link

关于Universal Link我之前写过一篇文章,也推荐大家看下,《微信分享显示“未验证应用”问题(辅助标签:Universal Link)》

8、关于iOS刘海屏适配

关于iOS刘海屏适配的问题,我之前写过一篇文章,也推荐大家看下,《Unity适配iphone刘海屏》

三、完毕

文章转自 林新发的博客_CSDN博客-Unity3D,android,C#领域博主

おすすめ

転載: blog.csdn.net/Chenzan524/article/details/129837911