Я следую за Spotify SDK tutorial и пытаюсь сделать модуль RN для своего приложения. Это мой SpotifyModule.m код:ReactNative iOS Spotify SDK
#import "SpotifyModule.h"
#import "React/RCTLog.h"
#import "React/RCTBridge.h"
@implementation SpotifyModule
RCT_EXPORT_MODULE()
+ (id)sharedManager {
static SpotifyModule *sharedManager = nil;
@synchronized(self) {
if (sharedManager == nil)
sharedManager = [[self alloc] init];
}
return sharedManager;
}
RCT_EXPORT_METHOD(authenticate:(RCTResponseSenderBlock)callback)
{
// Your implementation here
RCTLogInfo(@"authenticate");
self.auth = [SPTAuth defaultInstance];
// The client ID you got from the developer site
self.auth.clientID = @"8fff6cbb84d147e383060be62cec5dfa";
// The redirect URL as you entered it at the developer site
self.auth.redirectURL = [NSURL URLWithString:@"my-android-auth://callback"];
// Setting the `sessionUserDefaultsKey` enables SPTAuth to automatically store the session object for future use.
self.auth.sessionUserDefaultsKey = @"current session";
// Set the scopes you need the user to authorize. `SPTAuthStreamingScope` is required for playing audio.
self.auth.requestedScopes = @[SPTAuthPlaylistReadPrivateScope, SPTAuthUserReadPrivateScope];
//save the login callback
SpotifyModule *spotifyModule = (SpotifyModule *)[SpotifyModule sharedManager];
spotifyModule.loginCallback = callback;
//setup event dispatcher
spotifyModule.eventDispatcher = [[RCTEventDispatcher alloc] init];
[spotifyModule.eventDispatcher setValue:self.bridge forKey:@"bridge"];
// Start authenticating when the app is finished launching
dispatch_async(dispatch_get_main_queue(), ^{
[self startAuthenticationFlow];
});
}
- (void)startAuthenticationFlow
{
// Check if we could use the access token we already have
if ([self.auth.session isValid]) {
// Use it to log in
SpotifyModule *spotifyModule = (SpotifyModule *)[SpotifyModule sharedManager];
NSString *accessToken = self.auth.session.accessToken;
spotifyModule.loginCallback(@[accessToken]);
} else {
// Get the URL to the Spotify authorization portal
NSURL *authURL = [self.auth spotifyWebAuthenticationURL];
// Present in a SafariViewController
self.authViewController = [[SFSafariViewController alloc] initWithURL:authURL];
UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
[rootViewController presentViewController:self.authViewController animated:YES completion:nil];
}
}
- (BOOL) application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary *)options
{
// If the incoming url is what we expect we handle it
if ([self.auth canHandleURL:url]) {
// Close the authentication window
[self.authViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
self.authViewController = nil;
// Parse the incoming url to a session object
[self.auth handleAuthCallbackWithTriggeredAuthURL:url callback:^(NSError *error, SPTSession *session) {
if (session) {
// Send auth token
SpotifyModule *spotifyModule = (SpotifyModule *)[SpotifyModule sharedManager];
NSString *accessToken = session.accessToken;
spotifyModule.loginCallback(@[accessToken]); }
}];
return YES;
}
return NO;
}
@end
Я так хочу, чтобы использовать его с конца RN, является вызов Аутентифицировать с обратным вызовом для маркеров доступа. Я получил эту работу на Android отлично.
Native.authenticate(function(token) {
store.dispatch(actions.loginSuccess(token));
});
КСН, с выше кодой, я получаю приложенный экран, и при нажатии кнопки Ok, я получаю следующее сообщение об ошибке:
SpotiFind[5475:29641] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[SpotifyModule application:openURL:sourceApplication:annotation:]: unrecognized selector sent to class 0x10cb406f8'
Так что с моим минимальной ObjectiveC понимания, его пытаюсь вызвать другой метод, чем тот, который инструктаж дает указание реализовать. Любые рекомендации о том, как сделать эту работу?
Если его какой-либо делу, я строй против прошивки 10 и использовать последнюю Spotify iOS SDK
PS Я понимаю, что имя может быть против некоторого копирайтинга, его просто темп развития :)
Привет @Giannis, вы нашли решение своей проблемы? Я точно такой же, как и ты. – TimothePearce
Не использовал код учебника, вот что я использовал: https://pastebin.com/yFKiqV2Z – Giannis
Эй, @Giannis, спасибо за ваш фрагмент! Я работаю с TimothePearce и пытаюсь использовать ваш код. Я абсолютный манекен в Objective-C (и он тоже), и я не могу получить обратный вызов, чтобы его уволили после входа в Spotify. Webview открывается, я показываю страницу авторизации Spotify, но когда я возвращаюсь в приложение, ничего не происходит. Я тестирую простой console.log (токен), и он не работает. Я видел из вашего кода, что обратный вызов ObjC должен регистрировать события в отладчике (например, @ "authenticate"), но этого также не происходит. У вас есть идея, почему? – rgehan