(unity)新手接入Facebook登录,分享以及google登录,Android,IOS,OC接入篇

   最近接Android,IOS的Facebook登录,分享 以及Google登录,分享流程以及遇到的问题整理。

一. Android接入

google登录
第一步,前往

在这里插入图片描述下载google-services.json文件
着重注意:SHA证书指纹,首先你需要一个当前应用密匙生成的SHA-1类型的指纹,第二个指纹则是google Play https://play.google.com/console在这里插入图片描述此指纹是为了firebase,关联google Play使用 在这里插入图片描述
接下来就开始正式Android Studio接入

1.导入相关库文件在这里插入图片描述2.将下载的google-services.json文件拖入项目中
在这里插入图片描述
接入代码如下

private void GoogleLogin() {
        this.loginType = LoginType.GoogleLogin;
        Log.i("unity","谷歌登录");
        GoogleSignInOptions gso = (new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)).requestIdToken("填写自己应用的token此token为web token非Android token").requestEmail().build();
        GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
        mGoogleSignInClient.signOut();
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        this.startActivityForResult(signInIntent, 1);
    }
    String  token=null;
    private void firebaseAuthWithGoogle(String idToken) {
        token=idToken;
        AuthCredential credential = GoogleAuthProvider.getCredential(idToken, (String)null);
        FirebaseAuth.getInstance().signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    Log.d("Unity", "signInWithCredential:success");

                    FirebaseUser var2 = FirebaseAuth.getInstance().getCurrentUser();
                    if (token!=null)
                    UnityPlayer.UnitySendMessage("SudokuManager","GoogleToken",token);
                } else {
                    Log.w("Unity", "signInWithCredential:failure", task.getException());
                }

            }
        });
    }
      @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (this.loginType==LoginType.GoogleLogin){
            // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
            if (requestCode == 1) {
                Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
                try {
                    // Google Sign In was successful, authenticate with Firebase
                    GoogleSignInAccount account = task.getResult(ApiException.class);
                    Log.d("Unity", "firebaseAuthWithGoogle:" + account.getId());
                    firebaseAuthWithGoogle(account.getIdToken());
                } catch (ApiException e) {
                    // Google Sign In failed, update UI appropriately
                    Log.w("Unity", "Google sign in failed", e);
                    // ...
                }
            }
        }else if (this.loginType==LoginType.FaceBook)
        {
            callbackManager.onActivityResult(requestCode, resultCode, data); //facebook;

        }
    }

注:GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)).requestIdToken(“填写自己应用的token此token为web token非Android token”)

token获取方式在firebase控制台中找到Authentication,Sign-in method
在这里插入图片描述
打开后配置相关信息
前往Google Cloud Platfrom https://console.cloud.google.com/apis/credentials?pli=1&project=hi-sodoku&authuser=0
在这里插入图片描述
复制此ID到GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)).requestIdToken(“‘内容’”)
PS:这个问题找了好久真的很坑。
Android接入Google登录完成。
Facebook登录
前往facebook开发者平台https://developers.facebook.com/?locale=zh_CN
根据流程创建应用 选择快速启动,配置您的应用
在这里插入图片描述
配置完成后添加依赖
implementation ‘com.facebook.android:facebook-android-sdk:[7,8)’
在AndroidManifest.xml中配置facebook相关内容

<provider android:authorities="com.facebook.app.FacebookContentProvider" android:name="com.facebook.FacebookContentProvider" android:exported="true" />
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />
    <activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:label="@string/app_name" />
    <activity android:name="com.facebook.CustomTabActivity" android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="@string/fb_login_protocol_scheme" />
      </intent-filter>
    </activity>

在sttrings.xml中配置facebook 来源在Facebook开发者平台配置的信息
在这里插入图片描述
开始写相关代码,facebook有两种代码方式
1.使用facebook提供的登录图标 接入facebook点击回调(不推荐:由于要使用android原生界面,对于unity项目而言不好修改界面)
2.直接点击进入方法完成登录
所需导入improt

import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.appevents.AppEventsLogger;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.share.Sharer;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.model.SharePhoto;
import com.facebook.share.model.SharePhotoContent;
import com.facebook.share.widget.ShareDialog;
```java
  public void  FaceBookLogin(){
        Log.d("Unity", "进入facebook" );
        LoginManager.getInstance().logOut();
        this.loginType = LoginType.FaceBook;
        LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile","user_friends"));
        LoginManager.getInstance().registerCallback(callbackManager,new  FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d("Unity", "facebook:onSuccess:" + loginResult);
//                handleFacebookAccessToken(loginResult.getAccessToken());//发送给服务器token
                Log.d("Unity", "facebook登录成功");
                UnityPlayer.UnitySendMessage("SudokuManager","FacebookToken",loginResult.getAccessToken().getToken());
                Toast.makeText(getApplicationContext(), "facebook onSuccess", Toast.LENGTH_SHORT) .show();
            }
            @Override
            public void onCancel() {
                Log.d("Unity", "facebook:onCancel");
                // ...
                Toast.makeText(getApplicationContext(), "facebook onCancel", Toast.LENGTH_SHORT) .show();
            }
            @Override
            public void onError(FacebookException error) {
                Log.d("Unity", "facebook:onError", error);
                // ...
                Toast.makeText(getApplicationContext(), "facebook onError", Toast.LENGTH_SHORT) .show();
            }
        });

    }

facebook分享

这里分享两种
1.分享本地图片到facebook
2.分享链接到facebook

 public  void FacebookShare(String filepath){ //FacebookShare

        File file = new File(filepath);
        if (!file.exists()) {

            Toast.makeText(this, "图片不存在", Toast.LENGTH_LONG).show();
            return;
        }
        else {
        }
        Bitmap  image = BitmapFactory.decodeFile(filepath);
        SharePhoto photo = new SharePhoto.Builder()
                .setBitmap(image)
                .build();
        SharePhotoContent content = new SharePhotoContent.Builder()
                .addPhoto(photo)
                .build();
        shareDialog.registerCallback(callbackManager,new FacebookCallback<Sharer.Result>() {
            @Override
            public void onCancel() {
                UnityPlayer.UnitySendMessage("SudokuManager","SendTextResult","ShareCancel");
                Toast.makeText(getApplicationContext(), "ShareCancel", Toast.LENGTH_SHORT) .show();
//            Log.d("Facebook", "Canceled");
            }
            @Override
            public void onError(FacebookException error) {
//            Log.d("Facebook", String.format("Error: %s",error.toString()));
                UnityPlayer.UnitySendMessage("SudokuManager","SendTextResult","ShareError");
                Toast.makeText(getApplicationContext(), "ShareError", Toast.LENGTH_SHORT) .show();
            }

            @Override
            public void onSuccess(Sharer.Result result) {
//            Log.d("HelloFacebook", "Success!");
                Toast.makeText(getApplicationContext(), "ShareSuccess", Toast.LENGTH_SHORT) .show();
                UnityPlayer.UnitySendMessage("SudokuManager","SendTextResult","ShareSuccess");
            }
        });
        shareDialog.show(content);

    }
    public  void FacebookshareLink(String url){
        ShareLinkContent content = new ShareLinkContent.Builder()
                .setContentUrl(Uri.parse(url))
                .build();
        shareDialog.registerCallback(callbackManager,new FacebookCallback<Sharer.Result>() {
            @Override
            public void onCancel() {
                UnityPlayer.UnitySendMessage("SudokuManager","SendTextResult","ShareCancel");
                Toast.makeText(getApplicationContext(), "ShareCancel", Toast.LENGTH_SHORT) .show();
//            Log.d("Facebook", "Canceled");
            }
            @Override
            public void onError(FacebookException error) {
//            Log.d("Facebook", String.format("Error: %s",error.toString()));
                UnityPlayer.UnitySendMessage("SudokuManager","SendTextResult","ShareError");
                Toast.makeText(getApplicationContext(), "ShareError", Toast.LENGTH_SHORT) .show();
            }

            @Override
            public void onSuccess(Sharer.Result result) {
//            Log.d("HelloFacebook", "Success!");
                Toast.makeText(getApplicationContext(), "ShareSuccess", Toast.LENGTH_SHORT) .show();
                UnityPlayer.UnitySendMessage("SudokuManager","SendTextResult","ShareSuccess");
            }
        });
        shareDialog.show(content);
    }

二.IOS接入

google登录

在这里插入图片描述
相对比较轻松只需要输入报名即可若上架需要填写App store ID
同样需要设置启用google登录
在这里插入图片描述
下载googleService-info.plist 将其添加到xcode工程中
在info.Plist中配置

<dict>
			<key>CFBundleIdentifier</key>
			<string></string>
			<key>CFBundleTypeRole</key>
			<string></string>
			<key>CFBundleURLName</key>
			<string></string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>com.googleusercontent.apps.********(googleService-info.plist中的配置)</string>
			</array>
		</dict>

得到如图
在这里插入图片描述
第三方库
选中的文件夹前往官网下载
在这里插入图片描述
还需要ios自带库LocalAuthentication.framework

xcode相关代码
Appdelegate
若是unity项目Appdelegate指UnityAppController
需要

@interface MUAppController(自命名脚本):UnityAppController{
    
}
//Appdelegate
#import <GoogleSignIn/GoogleSignIn.h>
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    if ([[WXApiManager sharedManager] LoginType]==2) { //facebook
          return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey] ];
    }else if ([[WXApiManager sharedManager] LoginType]==3){//Google
         return [[GIDSignIn sharedInstance] handleURL:url];
    }
   WXApiManager *wxApi = [WXApiManager sharedManager];
    return [WXApi handleOpenURL:url delegate:wxApi];
}


- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
    [super application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
    
    if([[WXApiManager sharedManager] LoginType]==2){ //facebook
         BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation ]; // Add any custom logic here.
         return handled;
    }
    else if([[WXApiManager sharedManager] LoginType]==3){//Google
        return   [[GIDSignIn sharedInstance] handleURL:url];
    }
     WXApiManager *wxApi = [WXApiManager sharedManager];

           return [WXApi handleOpenURL:url delegate:wxApi];
    
}


- (void)signIn:(GIDSignIn *)signIn
didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {
  // ...
  if (error == nil) {
      GIDAuthentication *authentication = user.authentication;
      FIRAuthCredential *credential =
      [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                     accessToken:authentication.accessToken];
      [[WXApiManager sharedManager] setLoginType:3];
      //处理得到的token
        UnitySendMessage("SudokuManager", "GoogleToken",[authentication.idToken UTF8String]);
  } else {
    // ...
      [MsgToolBox showAlert:@"Alain" content:@"Login Fail Please Try Again"];
  }
}

- (void)signIn:(GIDSignIn *)signIn
didDisconnectWithUser:(GIDGoogleUser *)user
     withError:(NSError *)error {//断开链接时回调
  // Perform any operations when the user disconnects from app here.
  // ...
}

使用的是extend “C”

void googleLogin(){ //GoogleLogin

                [[GIDSignIn sharedInstance] signOut];
           UIViewController *viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
          [GIDSignIn sharedInstance].presentingViewController =viewController;
                [[GIDSignIn sharedInstance] signIn]; //Muapp 处理回调发送token
       }
    

facebook登录
前往facebook开发者平台https://developers.facebook.com/?locale=zh_CN
根据流程创建应用 选择快速启动,配置您的应用
在这里插入图片描述
在info.Plist中配置

<dict>
			<key>CFBundleIdentifier</key>
			<string></string>
			<key>CFBundleTypeRole</key>
			<string></string>
			<key>CFBundleURLName</key>
			<string></string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>fb+facebook开发者平台所得到的id</string>
			</array>
		</dict>
	</array>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>FacebookAppID</key>
	<string>facebook开发者平台所得到的id</string>
	<key>FacebookDisplayName</key>
	<string>Hi Sudoku</string>
	<key>LSApplicationQueriesSchemes</key>
	<array>
		<string>weixin</string>
		<string>weixinULAPI</string>
		<string>fbapi</string>
		<string>fbapi20130214</string>
		<string>fbapi20130410</string>
		<string>fbapi20130702</string>
		<string>fbapi20131010</string>
		<string>fbapi20131219</string>
		<string>fbapi20140410</string>
		<string>fbapi20140116</string>
		<string>fbapi20150313</string>
		<string>fbapi20150629</string>
		<string>fbapi20160328</string>
		<string>fbauth</string>
		<string>fb-messenger-share-api</string>
		<string>fbauth2</string>
		<string>fbshareextension</string>
	</array>

得到如图
在这里插入图片描述
第三方库
这里使用传统导入库的方式,
请前往https://github.com/facebook/facebook-ios-sdk 下载第三方库
在这里插入图片描述

下载git文件后需要打开相应工程如图
在这里插入图片描述
点击build后会出现如图
在这里插入图片描述
重要:FBSDKLoginGit白文件为编译所需文件(坑:需要自己制作framework 对于unity开发来讲很坑)
若不进行此操作,products中没有FBSDkLoginGit文件,当然不会影响接sdk也可jump到framework中但是在编译时会提示错误不能成功编译运行
xcode相关代码
Appdelegate
若是unity项目Appdelegate指UnityAppController
需要

@interface MUAppController(自命名脚本):UnityAppController{
    
}
//Appdelegate
#import <FirebaseCore/FirebaseCore.h>
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
#import <FirebaseAuth/FirebaseAuth.h>
#import <FBSDKShareKit/FBSDKShareKit.h>
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    if ([[WXApiManager sharedManager] LoginType]==2) { //facebook
          return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey] ];
    }else if ([[WXApiManager sharedManager] LoginType]==3){//Google
         return [[GIDSignIn sharedInstance] handleURL:url];
    }
   WXApiManager *wxApi = [WXApiManager sharedManager];
    return [WXApi handleOpenURL:url delegate:wxApi];
}


- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
    [super application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
    
    if([[WXApiManager sharedManager] LoginType]==2){ //facebook
         BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation ]; // Add any custom logic here.
         return handled;
    }
    else if([[WXApiManager sharedManager] LoginType]==3){//Google
        return   [[GIDSignIn sharedInstance] handleURL:url];
    }
     WXApiManager *wxApi = [WXApiManager sharedManager];

           return [WXApi handleOpenURL:url delegate:wxApi];
    
}

使用的是extend “C”


      void facebookLogin (){    //脸书登陆  facebookLogin
            
               FBSDKAccessToken *cur_asscessToken =[FBSDKAccessToken currentAccessToken];
				UIViewController *viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
              [loginManager logOut];
             [FBSDKSettings setAppID:kFacebookAppID];
               if(cur_asscessToken){//已经登录了
                   NSLog(@"facebookLogin cur_asscessToken=%@",cur_asscessToken.userID);
                   
//                    getUserInfoWithResult(cur_asscessToken.userID,cur_asscessToken.tokenString);
               }else{//拉起facebook 授权
                 [[WXApiManager sharedManager]setLoginType:2];
                    loginManager = [[FBSDKLoginManager alloc] init];
                   NSArray<NSString*>*permissions =@[@"public_profile"];
                   [loginManager logInWithPermissions:permissions fromViewController:viewController handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
                       if (error) {
                           NSLog(@"loginManager error=%@",error);
                       } else if (result.isCancelled) {
    //                       [loginManager logOut];
                           NSLog(@"loginManager 1 result=%@",result);
                       } else {
                           NSLog(@"loginManager 2 result=%@",result.token.userID);
 //                           result.token.currentAccessToken
                         
                            UnitySendMessage("SudokuManager", "FacebookToken",[result.token.tokenString UTF8String]);
//                           getUserInfoWithResult(result.token.userID,result.token.tokenString);
                       }
                   }];
               }
           }
    void getUserInfoWithResult(NSString *userId,NSString *token)  //facebook
           {
               NSDictionary*params= @{@"fields":@"id,name,picture"};
               FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
                                             initWithGraphPath:userId
                                             parameters:params
                                             HTTPMethod:@"GET"];
               [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                   NSLog(@"FBSDKGraphRequest = %@",result);
                   NSDictionary *resultDict = (NSDictionary *)result;
                   NSString *userName = resultDict[@"name"];
                   NSString *url = resultDict[@"picture"][@"data"][@"url"];
                   NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
                   [dictionary setValue:userId forKey:@"facebook_id"];
                   [dictionary setValue:userName forKey:@"facebook_name"];
                   [dictionary setValue:url forKey:@"facebook_photo"];
                   [dictionary setValue:url forKey:@"facebook_photo"];
                   NSError *errors = nil;
                    //转成JSON
                   NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&errors];
                   if (errors)
                     {
                       NSLog(@"dic->%@",error);
                        }
                     NSString *jsonString =  [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
                    UnitySendMessage("SudokuManager", "FacebookToken",[jsonString UTF8String]);
               }];
           }
    

facebook分享
重要:
facebook分享注意事项
1.登录过facebook则分享时无需调用登录
2.未登录分享需要调用登录facebook登录登录成功后调用分享
facebook分享方式
facebook分享选择自动匹配分享方式
1.若装facebook则会跳出分享框
2.若未装facebook则会跳web界面进行分享操作
facebook分享在这里介绍两种
1.分享图片
2.分享图片链接
须看上文facebook登录
extend “C”代码

void ShareFaceBookImage(const char *filepath){ //FaceBook 分享
           [[WXApiManager sharedManager]setLoginType:2];
             NSString *aPath = [NSString stringWithUTF8String:filepath];
               UIImage *imgwithfile = [[UIImage alloc] initWithContentsOfFile:aPath];
               UIImage *img = [WXApiManager compressImage:imgwithfile toByte:32678];
               FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc] init];
               photo.image = img;// you can edit it by your choice
               photo.userGenerated = YES;
               FBSDKSharePhotoContent *content = [[FBSDKSharePhotoContent alloc] init];
               content.photos = @[photo];
                 UIViewController *viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
                BOOL isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fbauth2:/"]];
                if (isInstalled) {
                 [FBSDKShareDialog showFromViewController:viewController withContent:content delegate:nil];
                } else {
                    FBSDKAccessToken *cur_asscessToken =[FBSDKAccessToken currentAccessToken];
                    if(cur_asscessToken){//已经登录了
                         [FBSDKShareDialog showFromViewController:viewController withContent:content delegate:nil];
                    }else{//拉起facebook 授权
                         loginManager = [[FBSDKLoginManager alloc] init];
                        NSArray<NSString*>*permissions =@[@"public_profile"];
                        [loginManager logInWithPermissions:permissions fromViewController:viewController handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
                            if (error) {
                                NSLog(@"loginManager error=%@",error);
                            } else if (result.isCancelled) {
                                NSLog(@"loginManager 1 result=%@",result);
                            } else {
                                 [[WXApiManager sharedManager]setLoginType:2];
//                                NSLog(@"loginManager 2 result=%@",result.token.userID);
                                [FBSDKShareDialog showFromViewController:viewController withContent:content delegate:nil];
                               
                            }
                        }];
                    }
                }
           }

        void ShareFaceBookLink(const char *url){ //FaceBook 分享
           [[WXApiManager sharedManager]setLoginType:2];
             NSString *aPath = [NSString stringWithUTF8String:url];
             FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
               content.contentURL = [NSURL URLWithString:url];
            UIViewController *viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
                BOOL isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fbauth2:/"]];
                if (isInstalled) {
                 [FBSDKShareDialog showFromViewController:viewController withContent:content delegate:nil];
                } else {
                    FBSDKAccessToken *cur_asscessToken =[FBSDKAccessToken currentAccessToken];                 
                    if(cur_asscessToken){//已经登录了
                       [FBSDKShareDialog showFromViewController:viewController withContent:content delegate:nil];
                    }else{//拉起facebook 授权
                         loginManager = [[FBSDKLoginManager alloc] init];
                        NSArray<NSString*>*permissions =@[@"public_profile"];
                        [loginManager logInWithPermissions:permissions fromViewController:viewController handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
                            if (error) {
                                NSLog(@"loginManager error=%@",error);
                            } else if (result.isCancelled) {
                                NSLog(@"loginManager 1 result=%@",result);
                            } else {
                                 [[WXApiManager sharedManager]setLoginType:2];
//                                NSLog(@"loginManager 2 result=%@",result.token.userID);
                                [FBSDKShareDialog showFromViewController:viewController withContent:content delegate:nil];
                               
                            }
                        }];
                    }
                }
           }
//压缩图片,可参考http://www.cnblogs.com/silence-cnblogs/p/6346729.html//32678
+ (UIImage *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength {
    // Compress by quality
    //压缩图片质量的优点在于,尽可能保留图片清晰度,图片不会明显模糊,缺点在于当图片质量低于一定程度时,继续压缩没有效果(强行继续压缩效率极低),所以不能确保压缩后的大小;
    CGFloat compression = 1;
    NSData *data = UIImageJPEGRepresentation(image, compression);
    if (data.length < maxLength) return image;
    
    CGFloat max = 1;
    CGFloat min = 0;
    for (int i = 0; i < 6; ++i) {
        compression = (max + min) / 2;
        data = UIImageJPEGRepresentation(image, compression);
        if (data.length < maxLength * 0.9) {
            min = compression;
        } else if (data.length > maxLength) {
            max = compression;
        } else {
            break;
        }
    }
    UIImage *resultImage = [UIImage imageWithData:data];
    if (data.length < maxLength) return resultImage;
    
    // Compress by size
    //压缩图片尺寸可以使图片小于指定大小,但会使图片明显模糊(比压缩图片质量模糊)。
    NSUInteger lastDataLength = 0;
    while (data.length > maxLength && data.length != lastDataLength) {
        lastDataLength = data.length;
        CGFloat ratio = (CGFloat)maxLength / data.length;
        CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),
                                 (NSUInteger)(resultImage.size.height * sqrtf(ratio))); // Use NSUInteger to prevent white blank
        UIGraphicsBeginImageContext(size);
        [resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
        resultImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        data = UIImageJPEGRepresentation(resultImage, compression);
    }
    
    return resultImage;
}


评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值