最近接Android,IOS的Facebook登录,分享 以及Google登录,分享流程以及遇到的问题整理。
一. Android接入
google登录
第一步,前往
- [ firebase] https://console.firebase.google.com/u/0/?hl=zh-cn&pli=1
创建自己的应用,根据流程添加项目
下载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登录
- [ firebase] https://console.firebase.google.com/u/0/?hl=zh-cn&pli=1
创建自己的应用,根据流程添加项目
相对比较轻松只需要输入报名即可若上架需要填写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;
}