├── .gitignore ├── README.md ├── android └── FacebookSdk.java ├── ios ├── FacebookSdk.h └── FacebookSdk.mm └── ts └── Facebook.ts /.gitignore: -------------------------------------------------------------------------------- 1 | *.DS_Store 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cocos_creator_facebook_sdk 2 | cocos creator 2.2.2 android和ios原生平台接入facebook登录和分享 3 | -------------------------------------------------------------------------------- /android/FacebookSdk.java: -------------------------------------------------------------------------------- 1 | package com.example.myapp; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.graphics.Bitmap; 6 | import android.graphics.BitmapFactory; 7 | import android.net.Uri; 8 | import android.os.Bundle; 9 | import android.util.Log; 10 | 11 | import com.facebook.AccessToken; 12 | import com.facebook.CallbackManager; 13 | import com.facebook.FacebookCallback; 14 | import com.facebook.FacebookException; 15 | import com.facebook.GraphRequest; 16 | import com.facebook.GraphResponse; 17 | import com.facebook.login.LoginManager; 18 | import com.facebook.login.LoginResult; 19 | import com.facebook.share.Sharer; 20 | import com.facebook.share.model.ShareLinkContent; 21 | import com.facebook.share.model.SharePhoto; 22 | import com.facebook.share.model.SharePhotoContent; 23 | import com.facebook.share.widget.ShareDialog; 24 | 25 | import org.cocos2dx.lib.Cocos2dxHelper; 26 | import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge; 27 | import org.json.JSONException; 28 | import org.json.JSONObject; 29 | 30 | import java.util.Arrays; 31 | import java.util.Collection; 32 | 33 | //AndroidManifest.xml 34 | // 35 | // 38 | // 39 | // 43 | // 46 | // 47 | // 48 | // 49 | // 50 | // 51 | // 52 | // 53 | // 54 | // 55 | // 56 | // 57 | // 61 | // 62 | 63 | public class FacebookSdk { 64 | private static String TAG = "FacebookSdk"; 65 | private static FacebookSdk mInstance = null; 66 | private Activity mActivity = null; 67 | private CallbackManager mCallbackManager = null; 68 | private ShareDialog mShareDialog = null; 69 | 70 | public static FacebookSdk getInstance() { 71 | if (null == mInstance) { 72 | mInstance = new FacebookSdk(); 73 | } 74 | return mInstance; 75 | } 76 | 77 | /** 78 | * 监听 onActivityResult 79 | */ 80 | public void onActivityResult(int requestCode, int resultCode, Intent data) { 81 | Log.i(TAG, "onActivityResult data = " + data.toString()); 82 | 83 | if (mCallbackManager != null) { 84 | mCallbackManager.onActivityResult(requestCode, resultCode, data); 85 | } 86 | } 87 | 88 | /** 89 | * 初始化 90 | */ 91 | public void initSdk(Activity activity) { 92 | Log.i(TAG, "initSdk"); 93 | 94 | mActivity = activity; 95 | mCallbackManager = CallbackManager.Factory.create(); 96 | 97 | initLogin(); 98 | initShare(); 99 | } 100 | 101 | /** 102 | * 初始化登录 103 | */ 104 | private void initLogin() { 105 | Log.i(TAG, "initLogin"); 106 | 107 | LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback() { 108 | @Override 109 | public void onSuccess(LoginResult loginResult) { 110 | Log.e(TAG, "login onSuccess loginResult = " + loginResult.toString()); 111 | 112 | //获取授权信息 113 | requestAuthInfo(); 114 | } 115 | 116 | @Override 117 | public void onCancel() { 118 | Log.e(TAG, "login onCancel"); 119 | 120 | //通知js 121 | final String eval = String.format("cc.onFacebookLoginCancel()"); 122 | Cocos2dxHelper.runOnGLThread(new Runnable() { 123 | @Override 124 | public void run() { 125 | try { 126 | Cocos2dxJavascriptJavaBridge.evalString(eval); 127 | } catch (Exception e) { 128 | e.printStackTrace(); 129 | } 130 | } 131 | }); 132 | } 133 | 134 | @Override 135 | public void onError(FacebookException error) { 136 | Log.e(TAG, "login onError error = " + error.toString()); 137 | 138 | //通知js 139 | final String eval = String.format("cc.onFacebookLoginError('%s')", error.toString()); 140 | Cocos2dxHelper.runOnGLThread(new Runnable() { 141 | @Override 142 | public void run() { 143 | try { 144 | Cocos2dxJavascriptJavaBridge.evalString(eval); 145 | } catch (Exception e) { 146 | e.printStackTrace(); 147 | } 148 | } 149 | }); 150 | } 151 | }); 152 | } 153 | 154 | /** 155 | * 登录 156 | */ 157 | public void login() { 158 | Log.i(TAG, "login"); 159 | 160 | if (isAuthorization()) { 161 | //已经授权 162 | requestAuthInfo(); 163 | return; 164 | } 165 | 166 | Collection permissions = Arrays.asList("public_profile", "email"); 167 | LoginManager.getInstance().logInWithReadPermissions(mActivity, permissions); 168 | } 169 | 170 | /** 171 | * 是否授权 172 | */ 173 | private boolean isAuthorization(){ 174 | AccessToken accessToken = AccessToken.getCurrentAccessToken(); 175 | if (accessToken == null) { 176 | return false; 177 | } 178 | 179 | return !accessToken.isExpired(); 180 | } 181 | 182 | /** 183 | * 获取授权信息 184 | */ 185 | private void requestAuthInfo() { 186 | Log.i(TAG, "requestAuthInfo"); 187 | 188 | AccessToken accessToken = AccessToken.getCurrentAccessToken(); 189 | GraphRequest graphRequest = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() { 190 | @Override 191 | public void onCompleted(JSONObject object, GraphResponse response) { 192 | Log.e(TAG, "requestAuthInfo onCompleted object = " + object.toString() + " response = " + response.toString()); 193 | 194 | if (response.getError() != null) { 195 | //授权错误 196 | //通知js 197 | final String eval = String.format("cc.onFacebookLoginError('%s')", response.getError().getErrorMessage()); 198 | Cocos2dxHelper.runOnGLThread(new Runnable() { 199 | @Override 200 | public void run() { 201 | try { 202 | Cocos2dxJavascriptJavaBridge.evalString(eval); 203 | } catch (Exception e) { 204 | e.printStackTrace(); 205 | } 206 | } 207 | }); 208 | return; 209 | } 210 | 211 | //id:1565455221565 212 | String id = object.optString("id"); 213 | //昵称:Zhang San 214 | String name = object.optString("name"); 215 | //性别:比如 male (男) female (女) 216 | String gender = object.optString("gender"); 217 | //邮箱:比如:56236545@qq.com 218 | String email = object.optString("email"); 219 | //头像 220 | String picture = ""; 221 | JSONObject objPicture = object.optJSONObject("picture"); 222 | if (objPicture != null) { 223 | JSONObject objPictureData = objPicture.optJSONObject("data"); 224 | if (objPictureData != null) { 225 | picture = objPictureData.optString("url"); 226 | } 227 | } 228 | //头像 229 | String avatar = String.format("https://graph.facebook.com/%s/picture?type=large", id); 230 | String authInfo = String.format("{\"id\":\"%s\",\"name\":\"%s\",\"gender\":\"%s\",\"email\":\"%s\",\"picture\":\"%s\",\"avatar\":\"%s\"}", 231 | id, name, gender, email, picture, avatar); 232 | 233 | //通知js 234 | final String eval = String.format("cc.onFacebookLoginSuccess('%s')", authInfo); 235 | Cocos2dxHelper.runOnGLThread(new Runnable() { 236 | @Override 237 | public void run() { 238 | try { 239 | Cocos2dxJavascriptJavaBridge.evalString(eval); 240 | } catch (Exception e) { 241 | e.printStackTrace(); 242 | } 243 | } 244 | }); 245 | } 246 | }); 247 | 248 | Bundle param = new Bundle(); 249 | param.putString("fields", "id,name,gender,email,picture"); 250 | graphRequest.setParameters(param); 251 | graphRequest.executeAsync(); 252 | } 253 | 254 | /** 255 | * 登出 256 | */ 257 | public void logout() { 258 | Log.i(TAG, "logout"); 259 | 260 | LoginManager.getInstance().logOut(); 261 | } 262 | 263 | /** 264 | * 初始化分享 265 | */ 266 | private void initShare() { 267 | Log.i(TAG, "initShare"); 268 | 269 | mShareDialog = new ShareDialog(mActivity); 270 | mShareDialog.registerCallback(mCallbackManager, new FacebookCallback() { 271 | @Override 272 | public void onSuccess(Sharer.Result result) { 273 | Log.e(TAG, "share onSuccess result = " + result.toString()); 274 | 275 | //通知js 276 | final String eval = String.format("cc.onFacebookShareSuccess('%s')", result.toString()); 277 | Cocos2dxHelper.runOnGLThread(new Runnable() { 278 | @Override 279 | public void run() { 280 | try { 281 | Cocos2dxJavascriptJavaBridge.evalString(eval); 282 | } catch (Exception e) { 283 | e.printStackTrace(); 284 | } 285 | } 286 | }); 287 | } 288 | 289 | @Override 290 | public void onCancel() { 291 | Log.e(TAG, "share onCancel"); 292 | 293 | //通知js 294 | final String eval = String.format("cc.onFacebookShareCancel()"); 295 | Cocos2dxHelper.runOnGLThread(new Runnable() { 296 | @Override 297 | public void run() { 298 | try { 299 | Cocos2dxJavascriptJavaBridge.evalString(eval); 300 | } catch (Exception e) { 301 | e.printStackTrace(); 302 | } 303 | } 304 | }); 305 | } 306 | 307 | @Override 308 | public void onError(FacebookException error) { 309 | Log.e(TAG, "share onError error = " + error.toString()); 310 | 311 | //通知js 312 | final String eval = String.format("cc.onFacebookShareError('%s')", error.toString()); 313 | Cocos2dxHelper.runOnGLThread(new Runnable() { 314 | @Override 315 | public void run() { 316 | try { 317 | Cocos2dxJavascriptJavaBridge.evalString(eval); 318 | } catch (Exception e) { 319 | e.printStackTrace(); 320 | } 321 | } 322 | }); 323 | } 324 | }); 325 | } 326 | 327 | /** 328 | * 分享 329 | */ 330 | public void share(String shareInfo) { 331 | Log.i(TAG, "share shareInfo = " + shareInfo); 332 | 333 | try { 334 | JSONObject json = new JSONObject(shareInfo); 335 | int shareType = json.getInt("shareType"); 336 | String shareUrl = json.getString("shareUrl"); 337 | String imgPath = json.getString("imgPath"); 338 | 339 | if (shareType == 0) { 340 | //链接 341 | if (ShareDialog.canShow(ShareLinkContent.class)) { 342 | ShareLinkContent content = new ShareLinkContent.Builder() 343 | .setContentUrl(Uri.parse(shareUrl)) 344 | .build(); 345 | mShareDialog.show(content); 346 | } 347 | } else if (shareType == 1) { 348 | //图片 349 | if (ShareDialog.canShow(SharePhotoContent.class)) { 350 | Bitmap img = BitmapFactory.decodeFile(imgPath); 351 | SharePhoto photo = new SharePhoto.Builder() 352 | .setBitmap(img) 353 | .build(); 354 | SharePhotoContent content = new SharePhotoContent.Builder() 355 | .addPhoto(photo) 356 | .build(); 357 | mShareDialog.show(content); 358 | } 359 | } 360 | } catch (JSONException e) { 361 | e.printStackTrace(); 362 | } 363 | } 364 | } 365 | -------------------------------------------------------------------------------- /ios/FacebookSdk.h: -------------------------------------------------------------------------------- 1 | #ifndef FacebookSdk_h 2 | #define FacebookSdk_h 3 | 4 | #import 5 | #import "RootViewController.h" 6 | 7 | @interface FacebookSdk : NSObject 8 | 9 | + (instancetype)getInstance; 10 | 11 | /** 12 | 初始化 13 | */ 14 | - (void)initSdk:(RootViewController *)viewController; 15 | 16 | /** 17 | 登录 18 | */ 19 | - (void)login; 20 | 21 | /** 22 | 登出 23 | */ 24 | - (void)logout; 25 | 26 | /** 27 | 分享 28 | @param shareInfo 分享信息 29 | */ 30 | - (void)share:(NSString *)shareInfo; 31 | 32 | @end 33 | 34 | #endif /* FacebookSdk_h */ 35 | -------------------------------------------------------------------------------- /ios/FacebookSdk.mm: -------------------------------------------------------------------------------- 1 | #import "FacebookSdk.h" 2 | 3 | #import 4 | #import 5 | #import 6 | 7 | #include "cocos/scripting/js-bindings/jswrapper/SeApi.h" 8 | 9 | //Info.plist 10 | //CFBundleURLTypes 11 | // 12 | // 13 | // CFBundleURLSchemes 14 | // 15 | // fb{你的应用id} 16 | // 17 | // 18 | // 19 | //FacebookAppID 20 | //{你的应用id} 21 | //FacebookDisplayName 22 | //{你的应用名称} 23 | //LSApplicationQueriesSchemes 24 | // 25 | // fbapi 26 | // fbapi20130214 27 | // fbapi20130410 28 | // fbapi20130702 29 | // fbapi20131010 30 | // fbapi20131219 31 | // fbapi20140410 32 | // fbapi20140116 33 | // fbapi20150313 34 | // fbapi20150629 35 | // fbapi20160328 36 | // fbauth 37 | // fb-messenger-share-api 38 | // fbauth2 39 | // fbshareextension 40 | // 41 | 42 | /** 43 | 结果类型 44 | */ 45 | typedef NS_ENUM(NSInteger, ResultType) { 46 | ResultTypeLoginSuccess, //登录成功 47 | ResultTypeLoginCancel, //登录取消 48 | ResultTypeLoginError, //登录错误 49 | ResultTypeShareSuccess, //分享成功 50 | ResultTypeShareCancel, //分项取消 51 | ResultTypeShareError, //分享错误 52 | }; 53 | 54 | @interface FacebookSdk() { 55 | 56 | } 57 | 58 | @property (nonatomic, strong) RootViewController *viewController; 59 | 60 | @property (nonatomic, strong) FBSDKLoginManager *loginManager; 61 | 62 | @end 63 | 64 | @implementation FacebookSdk 65 | 66 | #pragma mark - 单例方法 67 | 68 | static FacebookSdk *mInstace = nil; 69 | 70 | + (instancetype)getInstance { 71 | static dispatch_once_t onceToken; 72 | dispatch_once(&onceToken, ^{ 73 | mInstace = [[FacebookSdk alloc] init]; 74 | }); 75 | return mInstace; 76 | } 77 | 78 | #pragma mark - 初始化 79 | 80 | /** 81 | 初始化 82 | */ 83 | - (void)initSdk:(RootViewController *)viewController { 84 | NSLog(@"%s", __FUNCTION__); 85 | 86 | self.viewController = viewController; 87 | 88 | [self initLogin]; 89 | [self initShare]; 90 | } 91 | 92 | #pragma mark - 登录 93 | 94 | /** 95 | 初始化登录 96 | */ 97 | - (void)initLogin { 98 | NSLog(@"%s", __FUNCTION__); 99 | 100 | self.loginManager = [[FBSDKLoginManager alloc] init]; 101 | } 102 | 103 | /** 104 | 登录 105 | */ 106 | - (void)login { 107 | NSLog(@"%s", __FUNCTION__); 108 | 109 | if ([self isAuthorization]) { 110 | //已经授权 111 | [self requestAuthInfo]; 112 | return; 113 | } 114 | 115 | [self.loginManager logInWithPermissions:@[@"public_profile", @"email"] 116 | fromViewController:self.viewController handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 117 | NSLog(@"%s, FBSDKLoginManagerLoginResult, result: %@, error: %@", __FUNCTION__, result, error); 118 | 119 | if (error) { 120 | //登录错误 121 | NSLog(@"%s, FBSDKLoginManagerLoginResult error", __FUNCTION__); 122 | 123 | [self notifyToJs:ResultTypeLoginError params:[NSString stringWithFormat:@"%ld", (long)error.code]]; 124 | return; 125 | } 126 | 127 | if (result) { 128 | if (result.isCancelled) { 129 | //登录取消 130 | NSLog(@"%s, FBSDKLoginManagerLoginResult cancel", __FUNCTION__); 131 | 132 | [self notifyToJs:ResultTypeLoginCancel params:@"login cancel"]; 133 | return; 134 | } 135 | 136 | //登录成功 137 | NSLog(@"%s, FBSDKLoginManagerLoginResult success", __FUNCTION__); 138 | 139 | //获取授权信息 140 | [self requestAuthInfo]; 141 | } 142 | }]; 143 | } 144 | 145 | /** 146 | 是否授权 147 | */ 148 | - (BOOL)isAuthorization { 149 | NSLog(@"%s", __FUNCTION__); 150 | 151 | FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken]; 152 | if (accessToken == nil) { 153 | return NO; 154 | } 155 | 156 | return !accessToken.isExpired; 157 | } 158 | 159 | /** 160 | 获取授权信息 161 | */ 162 | - (void)requestAuthInfo { 163 | NSLog(@"%s", __FUNCTION__); 164 | 165 | FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken]; 166 | NSDictionary *params = @{@"fields":@"id,name,gender,email,picture"}; 167 | FBSDKGraphRequest *graphRequest = [[FBSDKGraphRequest alloc] 168 | initWithGraphPath:accessToken.userID 169 | parameters:params]; 170 | [graphRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, 171 | id result, 172 | NSError *error) { 173 | NSLog(@"%s, FBSDKGraphRequestConnection, result: %@, error: %@", __FUNCTION__, result, error); 174 | 175 | if (error) { 176 | //授权错误 177 | NSLog(@"%s, FBSDKGraphRequestConnection error", __FUNCTION__); 178 | 179 | [self notifyToJs:ResultTypeLoginError params:[NSString stringWithFormat:@"%ld", (long)error.code]]; 180 | return; 181 | } 182 | 183 | if (result) { 184 | //授权成功 185 | NSLog(@"%s, FBSDKGraphRequestConnection success", __FUNCTION__); 186 | 187 | NSString *NSid = [result objectForKey:@"id"]; 188 | NSString *name = [result objectForKey:@"name"]; 189 | NSString *gender = [result objectForKey:@"gender"]; 190 | NSString *email = [result objectForKey:@"email"]; 191 | NSString *picture = @""; 192 | NSDictionary *objPicture = [result objectForKey:@"picture"]; 193 | if (objPicture) { 194 | NSDictionary *objPictureData = [objPicture objectForKey:@"data"]; 195 | if (objPictureData) { 196 | NSString *NSpictureDataUrl = [objPictureData objectForKey:@"url"]; 197 | if (NSpictureDataUrl) { 198 | picture = NSpictureDataUrl; 199 | } 200 | } 201 | } 202 | NSString *avatar = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", NSid]; 203 | NSString *authInfo = [NSString stringWithFormat:@"{\"id\":\"%@\",\"name\":\"%@\",\"gender\":\"%@\",\"email\":\"%@\",\"picture\":\"%@\",\"avatar\":\"%@\"}", 204 | NSid, name, gender, email, picture, avatar]; 205 | 206 | [self notifyToJs:ResultTypeLoginSuccess params:authInfo]; 207 | } 208 | }]; 209 | } 210 | 211 | /** 212 | 登出 213 | */ 214 | - (void)logout { 215 | NSLog(@"%s", __FUNCTION__); 216 | 217 | [self.loginManager logOut]; 218 | } 219 | 220 | #pragma mark - 分享 221 | 222 | /** 223 | 初始化分享 224 | */ 225 | - (void)initShare { 226 | NSLog(@"%s", __FUNCTION__); 227 | } 228 | 229 | /** 230 | 分享 231 | @param shareInfo 分享信息 232 | */ 233 | - (void)share:(NSString *)shareInfo { 234 | NSLog(@"%s, shareInfo: %@", __FUNCTION__, shareInfo); 235 | 236 | NSData *data = [shareInfo dataUsingEncoding:NSUTF8StringEncoding]; 237 | NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 238 | NSNumber *shareType = [dictionary objectForKey:@"shareType"]; 239 | NSString *shareUrl = [dictionary objectForKey:@"shareUrl"]; 240 | NSString *imgPath = [dictionary objectForKey:@"imgPath"]; 241 | 242 | if ([shareType intValue] == 0) { 243 | //链接 244 | FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init]; 245 | content.contentURL = [NSURL URLWithString:shareUrl]; 246 | 247 | [FBSDKShareDialog showFromViewController:self.viewController 248 | withContent:content 249 | delegate:self]; 250 | } else if ([shareType intValue] == 1) { 251 | //图片 252 | UIImage *image = [[UIImage alloc] initWithContentsOfFile:imgPath]; 253 | 254 | FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc] init]; 255 | photo.image = image; 256 | photo.userGenerated = YES; 257 | 258 | FBSDKSharePhotoContent *content = [[FBSDKSharePhotoContent alloc] init]; 259 | content.photos = @[photo]; 260 | 261 | [FBSDKShareDialog showFromViewController:self.viewController 262 | withContent:content 263 | delegate:self]; 264 | } 265 | } 266 | 267 | #pragma mark - FBSDKSharingDelegate 268 | 269 | /** 270 | Sent to the delegate when the share completes without error or cancellation. 271 | @param sharer The FBSDKSharing that completed. 272 | @param results The results from the sharer. This may be nil or empty. 273 | */ 274 | - (void)sharer:(id)sharer didCompleteWithResults:(NSDictionary *)results { 275 | NSLog(@"%s, results: %@", __FUNCTION__, results); 276 | 277 | [self notifyToJs:ResultTypeShareSuccess params:@"share success"]; 278 | } 279 | 280 | /** 281 | Sent to the delegate when the sharer encounters an error. 282 | @param sharer The FBSDKSharing that completed. 283 | @param error The error. 284 | */ 285 | - (void)sharer:(id)sharer didFailWithError:(NSError * _Nullable)error { 286 | NSLog(@"%s, error: %@", __FUNCTION__, error); 287 | 288 | [self notifyToJs:ResultTypeShareError params:[NSString stringWithFormat:@"%ld", (long)error.code]]; 289 | } 290 | 291 | /** 292 | Sent to the delegate when the sharer is cancelled. 293 | @param sharer The FBSDKSharing that completed. 294 | */ 295 | - (void)sharerDidCancel:(id)sharer { 296 | NSLog(@"%s", __FUNCTION__); 297 | 298 | [self notifyToJs:ResultTypeShareCancel params:@"share cancel"]; 299 | } 300 | 301 | #pragma mark - 通知js 302 | 303 | /** 304 | 通知js 305 | @param resultType 类型 306 | @param params 透传参数 307 | */ 308 | - (void)notifyToJs:(ResultType)resultType params:(NSString *)params { 309 | NSLog(@"%s, resultType: %ld, params: %@", __FUNCTION__, (long)resultType, params); 310 | 311 | NSString *funcName = @""; 312 | switch (resultType) { 313 | case ResultTypeLoginSuccess: 314 | funcName = @"cc.onFacebookLoginSuccess"; 315 | break; 316 | case ResultTypeLoginCancel: 317 | funcName = @"cc.onFacebookLoginCancel"; 318 | break; 319 | case ResultTypeLoginError: 320 | funcName = @"cc.onFacebookLoginError"; 321 | break; 322 | case ResultTypeShareSuccess: 323 | funcName = @"cc.onFacebookShareSuccess"; 324 | break; 325 | case ResultTypeShareCancel: 326 | funcName = @"cc.onFacebookShareCancel"; 327 | break; 328 | case ResultTypeShareError: 329 | funcName = @"cc.onFacebookShareError"; 330 | break; 331 | default: 332 | funcName = nil; 333 | break; 334 | } 335 | 336 | if (funcName == nil) { 337 | NSLog(@"%s, error: %@", __FUNCTION__, @"funcName is nil"); 338 | return; 339 | } 340 | 341 | if (params == nil) { 342 | params = @""; 343 | } 344 | 345 | NSString *eval = [NSString stringWithFormat:@"%@('%@')", funcName, params]; 346 | const char *c_eval = [eval UTF8String]; 347 | se::ScriptEngine::getInstance()->evalString(c_eval); 348 | } 349 | 350 | @end 351 | -------------------------------------------------------------------------------- /ts/Facebook.ts: -------------------------------------------------------------------------------- 1 | export default class Facebook { 2 | 3 | /** 4 | * 分享类型 5 | */ 6 | public static SHARE_TYPE = { 7 | /** 8 | * 链接 9 | */ 10 | LINK: 0, 11 | /** 12 | * 图片 13 | */ 14 | PHOTO: 1 15 | } 16 | 17 | /** 18 | * 登录 19 | */ 20 | public static login() { 21 | console.log("Facebook login"); 22 | 23 | if (cc.sys.isNative) { 24 | if (cc.sys.os == cc.sys.OS_ANDROID) { 25 | let className = "com/util/BridgeUtil"; 26 | let methodName = "facebookLogin"; 27 | let methodSignature = "()V"; 28 | jsb.reflection.callStaticMethod(className, methodName, methodSignature); 29 | } else if (cc.sys.os == cc.sys.OS_IOS) { 30 | let className = "BridgeUtil"; 31 | let methodName = "facebookLogin"; 32 | jsb.reflection.callStaticMethod(className, methodName); 33 | } 34 | } else { 35 | let authInfo = '{"id":"1111111111111111","name":"Test","gender":"","email":"123456@qq.com","picture":"https://platform-lookaside.fbsbx.com/platform/profilepic/?asid=xxx&height=50&width=50&ext=xxx","avatar":"https://graph.facebook.com/xxx/picture?type=large"}'; 36 | cc.onFacebookLoginSuccess(authInfo); 37 | } 38 | } 39 | 40 | /** 41 | * 登出 42 | */ 43 | public static logout() { 44 | console.log("Facebook logout"); 45 | 46 | if (cc.sys.isNative) { 47 | if (cc.sys.os == cc.sys.OS_ANDROID) { 48 | let className = "com/util/BridgeUtil"; 49 | let methodName = "facebookLogout"; 50 | let methodSignature = "()V"; 51 | jsb.reflection.callStaticMethod(className, methodName, methodSignature); 52 | } else if (cc.sys.os == cc.sys.OS_IOS) { 53 | let className = "BridgeUtil"; 54 | let methodName = "facebookLogout"; 55 | jsb.reflection.callStaticMethod(className, methodName); 56 | } 57 | } 58 | } 59 | 60 | /** 61 | * 分享 62 | * @param shareType 分享类型 SHARE_TYPE 63 | * @param shareUrl 分享链接 64 | * @param imgPath 图片路径 65 | * @example 66 | * Facebook.share(Facebook.SHARE_TYPE.LINK, 'https://www.cocos.com/', ''); 67 | */ 68 | public static share(shareType: number, shareUrl: string, imgPath: string) { 69 | console.log("Facebook share shareType = " + shareType + ", shareUrl = " + ", imgPath = " + imgPath); 70 | ß 71 | let data = { 72 | shareType: shareType, 73 | shareUrl: shareUrl, 74 | imgPath: imgPath 75 | }; 76 | let shareInfo = JSON.stringify(data); 77 | console.log('Facebook share shareInfo = ' + shareInfo); 78 | 79 | if (cc.sys.isNative) { 80 | if (cc.sys.os == cc.sys.OS_ANDROID) { 81 | let className = "com/util/BridgeUtil"; 82 | let methodName = "facebookShare"; 83 | let methodSignature = "(Ljava/lang/String;)V"; 84 | jsb.reflection.callStaticMethod(className, methodName, methodSignature, shareInfo); 85 | } else if (cc.sys.os == cc.sys.OS_IOS) { 86 | let className = "BridgeUtil"; 87 | let methodName = "facebookShare:"; 88 | jsb.reflection.callStaticMethod(className, methodName, shareInfo); 89 | } 90 | } else { 91 | cc.onFacebookShareSuccess('test'); 92 | } 93 | } 94 | } 95 | 96 | /** 97 | * 登录成功 98 | */ 99 | cc.onFacebookLoginSuccess = function (authInfo) { 100 | console.log("onFacebookLoginSuccess authInfo = " + authInfo); 101 | //处理登录逻辑 102 | }; 103 | 104 | /** 105 | * 登录取消 106 | */ 107 | cc.onFacebookLoginCancel = function () { 108 | console.log("onFacebookLoginCancel"); 109 | }; 110 | 111 | /** 112 | * 登录错误 113 | */ 114 | cc.onFacebookLoginError = function (error) { 115 | console.log("onFacebookLoginError error = " + error); 116 | }; 117 | 118 | /** 119 | * 分享成功 120 | */ 121 | cc.onFacebookShareSuccess = function (result) { 122 | console.log("onFacebookShareSuccess result = " + result); 123 | //处理分享逻辑 124 | }; 125 | 126 | /** 127 | * 分享取消 128 | */ 129 | cc.onFacebookShareCancel = function () { 130 | console.log("onFacebookShareCancel"); 131 | }; 132 | 133 | /** 134 | * 分享错误 135 | */ 136 | cc.onFacebookShareError = function (error) { 137 | console.log("onFacebookShareError error = " + error); 138 | }; 139 | --------------------------------------------------------------------------------