Objective c Snapchat';s SnapKit addLoginStatusObserver未侦听事件
我目前正在为Snapchat的SnapKit SDK开发一个React本机插件 我似乎无法让Objective c Snapchat';s SnapKit addLoginStatusObserver未侦听事件,objective-c,react-native,snapchat,Objective C,React Native,Snapchat,我目前正在为Snapchat的SnapKit SDK开发一个React本机插件 我似乎无法让addLoginStatusObserver方法正常工作(此处详述),我怀疑这是因为我缺乏使用Objective C的协议/接口/实现功能的经验 下面是代码的精简版本: ... @interface RNSnapSDKListener : NSObject<SCSDKLoginStatusObserver> { ... } - (void)scsdkLoginLinkDidSucceed;
addLoginStatusObserver
方法正常工作(此处详述),我怀疑这是因为我缺乏使用Objective C的协议/接口/实现功能的经验
下面是代码的精简版本:
...
@interface RNSnapSDKListener : NSObject<SCSDKLoginStatusObserver> {
...
}
- (void)scsdkLoginLinkDidSucceed;
- (void)scsdkLoginLinkDidFail;
- (void)scsdkLoginDidUnlink;
...
@end
@implementation RNSnapSDKListener
- (void)scsdkLoginLinkDidSucceed{
NSLog(@"[RNSnapSDKListener] Snapchat Did Login!");
}
- (void)scsdkLoginLinkDidFail{
NSLog(@"[RNSnapSDKListener] Snapchat Did Fail!");
}
- (void)scsdkLoginDidUnlink{
NSLog(@"[RNSnapSDKListener] Snapchat Did Unlink!");
}
- (void)setDelegate: (RCTEventEmitter*) eventEmitter{
NSLog(@"[RNSnapSDKListener] Delegate Set!");
}
@end
@implementation RNSnapSDK
...
RCT_EXPORT_MODULE()
RCT_EXPORT_METHOD(initialize){
RNSnapSDKListener *listener = [[RNSnapSDKListener alloc] init];
[listener setDelegate:self];
[SCSDKLoginClient addLoginStatusObserver:listener];
}
RCT_EXPORT_METHOD(login)
{
[SCSDKLoginClient loginFromViewController:[UIApplication sharedApplication].delegate.window.rootViewController completion:^(BOOL success, NSError * _Nullable error) {
}];
}
RCT_EXPORT_METHOD(logout: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
[SCSDKLoginClient unlinkAllSessionsWithCompletion:^(BOOL success) {
NSLog(@"Logout %s", success ? "true" : "false");
resolve(NULL);
}];
}
RCT_EXPORT_METHOD(getUserData: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
NSString *graphQLQuery = @"{me{externalId, displayName, bitmoji{avatar}}}";
NSDictionary *variables = @{@"page": @"bitmoji"};
[SCSDKLoginClient fetchUserDataWithQuery:graphQLQuery
variables:variables
success:^(NSDictionary *resources) {
NSDictionary *data = resources[@"data"];
resolve(data);
} failure:^(NSError * error, BOOL isUserLoggedOut) {
NSLog(@"%@",[error localizedDescription]);
NSLog(@" %s", isUserLoggedOut ? "true" : "false");
if(isUserLoggedOut){
[SCSDKLoginClient loginFromViewController:[UIApplication sharedApplication].delegate.window.rootViewController completion:^(BOOL success, NSError * _Nullable error) {
}];
}else{
reject(@"error", [error localizedDescription], error);
}
}];
}
NSURL *saved;
RCT_EXPORT_METHOD(authenticateDeepLink: (NSString *)url)
{
NSURL *finalUrl = [NSURL URLWithString:url];
saved = finalUrl;
[SCSDKLoginClient application:[UIApplication sharedApplication] openURL:finalUrl options:[NSMutableDictionary dictionary]];
}
...
@end
。。。
@接口RNSnapSDKListener:NSObject{
...
}
-(无效)SCSDKloginlinkDidSuccess;
-(无效)scsdkLoginLinkDidFail;
-(无效)scsdkLoginDidUnlink;
...
@结束
@实现RNSnapSDKListener
-(无效)SCSDKloginLinkDidSuccess{
NSLog(@“[RNSnapSDKListener]Snapchat确实登录了!”);
}
-(无效)scsdkLoginLinkDidFail{
NSLog(@“[RNSnapSDKListener]快照聊天失败!”);
}
-(无效)scsdkLoginDidUnlink{
NSLog(@“[RNSnapSDKListener]Snapchat未取消链接!”);
}
-(void)setDelegate:(RCTEventMitter*)事件发射器{
NSLog(@“[RNSnapSDKListener]委托集!”);
}
@结束
@snapsdk的实现
...
RCT_导出_模块()
RCT\u导出\u方法(初始化){
RNSnapSDKListener*listener=[[RNSnapSDKListener alloc]init];
[listener setDelegate:self];
[SCSDKLoginClient addLoginStatusObserver:listener];
}
RCT\u导出\u方法(登录)
{
[SCSDKLoginClient loginFromViewController:[UIApplication sharedApplication].delegate.window.rootViewController完成:^(布尔成功,N错误*_可为空错误){
}];
}
RCT_导出_方法(注销:(RCTPromiseResolveBlock)解析拒绝程序:(RCTPromiseResolveBlock)拒绝)
{
[SCSDKLoginClient取消链接会话并完成:^(BOOL success){
NSLog(@“注销%s”,成功?“真”:“假”);
解析(空);
}];
}
RCT_导出_方法(getUserData:(RCTPromiseResolveBlock)解析拒绝程序:(RCTPromiseRejectBlock)拒绝)
{
NSString*graphQLQuery=@“{me{externalId,displayName,bitmoji{avatar}}}”;
NSDictionary*变量=@{@“page”:@“bitmoji”};
[SCSDKLoginClient fetchUserDataWithQuery:graphQLQuery
变量:变量
成功:^(NSDictionary*资源){
NSDictionary*数据=资源[@“数据”];
解析(数据);
}失败:^(N错误*错误,BOOL isUserLoggedOut){
NSLog(@“%@,[错误本地化描述]);
NSLog(@“%s”,isUserLoggedOut?“真”:“假”);
if(isUserLoggedOut){
[SCSDKLoginClient loginFromViewController:[UIApplication sharedApplication].delegate.window.rootViewController完成:^(布尔成功,N错误*_可为空错误){
}];
}否则{
拒绝(@“错误”,[error localizedDescription],错误);
}
}];
}
NSURL*已保存;
RCT\u导出\u方法(authenticateDeepLink:(NSString*)url)
{
NSURL*finalUrl=[NSURL URLWithString:url];
保存=最终结果;
[SCSDKLoginClient应用程序:[UIApplication sharedApplication]openURL:finalUrl选项:[NSMutableDictionary]];
}
...
@结束
.initialize()在React-Native模块内调用,并且成功调用了setDelegate()方法(打印出“委托集”-这是React-Native事件桥的委托集),但是其他[RNSnapSDKListener]不会在应该打印的时候打印(在登录或注销之后)
这是我在objective-c上犯的错误还是对Snapchat SDK的其他滥用
谢谢 问题是,
RNSnapSDKListener*监听器
需要声明为全局变量,并在initialize()内初始化-但不完全确定原因-可能是垃圾收集的问题