2017-01-16 32 views
3

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の上級で動作させました。 iOSの上で

Native.authenticate(function(token) { 
    store.dispatch(actions.loginSuccess(token)); 
    }); 

、上記のコードで、私は、添付の画面に取得し、クリックすると[OK]を、私は次のエラーを取得:そのを呼び出そうとし、私の最小限のObjectiveCの理解からそう

SpotiFind[5475:29641] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[SpotifyModule application:openURL:sourceApplication:annotation:]: unrecognized selector sent to class 0x10cb406f8'

をチュートリアルで実装するよう指示するものとは別の方法です。 この作業を行う方法に関する推奨事項はありますか?

そのいずれかの関連する場合、私はiOSの10に対して、構築、私は名前がいくつかの版権、開発のためのちょうど一時:)

enter image description here

+0

こんにちは@Giannis、問題を解決しますか?私はまさにあなたと同じ状況にいます。 – TimothePearce

+2

チュートリアルコードを使用していない、これは私が使用したものです: https://pastebin.com/yFKiqV2Z – Giannis

+0

ちょっと@ジニアニス、あなたのスニペットのおかげで!私はTimothePearceと一緒に作業していて、コードを使用しようとしています。私はObjective-Cの絶対ダミーです(そして彼もそうです)、Spotifyでログインした後にコールバックを開始することはできません。 Webviewが開き、Spotify認証ページが表示されますが、アプリに戻ると何も起こりません。私は単純なconsole.log(トークン)でテストしていますが、動作しません。あなたのコードから、ObjCコールバックが(@ "authenticate"のような)デバッガに物事を記録することになっていることがわかりましたが、それも起こりません。なぜアイデアはありますか? – rgehan

答えて

3
に対してかもしれません実現する最新 Spotify iOS SDK

PSを使用

あなたのヒント(コメント内)のおかげで、私たちはSpotify認証をReact-nativeで動作させることができました。

誰も時間を無駄にしないように、再利用可能なモジュールを作成するためにPastebinのコードを使用しました。

あなたはここにモジュールを見つけることができます。emphaz/react-native-ios-spotify-sdk

あり、セットアップのためのチュートリアルがあると私たちもboilerplate project

どうもありがとうGiannisを作成しました!

関連する問題