1

FacebookとTwitterの統合にソーシャルフレームワークを使用しています。このために私はこのリンクをたどり ました。アプリがACAccountStoreDidChangeNotificationを受信した場合を除いて、すべてが正常に機能しています。クラッシュします。アプリがクラッシュすると

1)初めてアプリをインストールしましたが、ユーザーは[設定]でFacebook/Twitterアカウントを構成していません。

2)Facebook / Twitterのいずれかのメソッドを呼び出すと、正しいアカウントが構成されていないため、エラーコード6が表示されます。

3)HOMEボタンをクリックして、アプリがバックグラウンドに入り、Settigsにアカウントを追加します。

4)アカウントを構成してアプリに戻ると、アプリがバックグラウンドで起動し、ACAccountStoreDidChangeNotificationを受け取ります。

5)ACAccountStoreDidChangeNotificationのセレクターで、アカウントオブジェクトがnilであるため、アプリがクラッシュします。だから私はnilをチェックしました

これが私のコードです

    #pragma mark - Request Facebook Account Access

-(void)requestFacebookAccountAccess
{
    requestType = kNoOpRequest;
    //  Register for Account Change notification
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(accountChanged:) name:ACAccountStoreDidChangeNotification object:nil];

    self.accountStore = [[ACAccountStore alloc]init];
    ACAccountType *FBaccountType= [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

    // Set facebook permissions
    NSArray *permissions = nil;

    // We need to ask for Basic permission first
    if (![kUserDefaults boolForKey:FACEBOOK_BASIC_PERMISSION]) {
        permissions = @[@"email",@"user_about_me",@"user_location",@"friends_about_me"];
        self.isBasicFacebookPermissionsRequested = YES;
    }
    else {
        permissions = @[@"email",@"user_about_me",@"user_location",@"friends_about_me",@"publish_stream"];
    }

    //use ACAccountStore to help create your dictionary
    NSDictionary *dictFacebook = @{
        ACFacebookAppIdKey: kFacebookAppIDKey,
        ACFacebookPermissionsKey: permissions,
        ACFacebookAudienceKey: ACFacebookAudienceFriends
    };

    [self.accountStore requestAccessToAccountsWithType:FBaccountType options:dictFacebook completion:^(BOOL granted, NSError *error) {
        if (granted) {

            if (self.isBasicFacebookPermissionsRequested) {
                self.isBasicFacebookPermissionsRequested = NO;
                [kUserDefaults saveBasicFacebookPermissionsGrantedStatus:YES];
                //[self requestFacebookAccountAccess];
            }

            // User granted permission to Accout
            NSArray *accountsArray = [self.accountStore accountsWithAccountType:FBaccountType];

            if ([accountsArray count]>0) {
                //It will always be the last object with SSO
                self.facebookAccount = [accountsArray lastObject];
                NSLog(@"In %s::IS MAIN THREAD:- %@",__PRETTY_FUNCTION__,[NSThread isMainThread]?@"YES":@"NO");

                if ([self.delegate respondsToSelector:@selector(didFacebookAccountAccessGranted)]) {
                        dispatch_async(dispatch_get_main_queue(),^{
                            [self.delegate didFacebookAccountAccessGranted];
                        });
                }
            }
            else {
                [self showAlertWithTitle:@"Error" andMessage:@"You don't have any Facebook accounts set up yet.Please set a Facebbok account and try again."];
            }
        }
        else {
            DLog(@"User denied permission to Accout::Localized Error:- %@",error.localizedDescription);
            if([error code]==6) {
                [self showAlertWithTitle:@"Error" andMessage:@"Please setup facebook account from Settings"];
                if ([self.delegate respondsToSelector:@selector(didFacebookAccountAccessDenied:)]) {
                    dispatch_async(dispatch_get_main_queue(),^{
                        [self.delegate didFacebookAccountAccessDenied:error];
                    });
                }
            }
            else if ([self.delegate respondsToSelector:@selector(didFacebookAccountAccessDenied:)]) {
                dispatch_async(dispatch_get_main_queue(),^{
                    [self.delegate didFacebookAccountAccessDenied:error];
                });
            }

            else {
                // User denied permission to Account
                [self showAlertWithTitle:@"Error" andMessage:[NSString stringWithFormat:@"User denied permission to Accout::Error:- %@",error.localizedDescription]];
            }
        }
    }];
}



#pragma mark - Get Logged In User Info

-(void)getLoggedInUserInfo
{
    NSURL *requestURL = [NSURL URLWithString:@"https://graph.facebook.com/fql"];
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"SELECT current_location,uid,name,sex,birthday,email,pic FROM user WHERE uid=me()",@"q", nil];
    requestType = kGetLoggedInUserInfoRequest;
    [self requestDataUsingURL:requestURL parameters:dict requestMethod:SLRequestMethodGET];
}

#pragma mark - Request Data From Facebook

-(void)requestDataUsingURL:(NSURL*)requestURL parameters:(NSDictionary*)params requestMethod:(SLRequestMethod)reuqestMethod
{

    SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                            requestMethod:reuqestMethod
                                                      URL:requestURL
                                               parameters:params];
    request.account = self.facebookAccount;

    [request performRequestWithHandler:^(NSData *data,
                                         NSHTTPURLResponse *response,
                                         NSError *error)
     {
         NSDictionary *dictData =[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
         if(!error)
         {
             if([dictData objectForKey:@"error"]!=nil)
             {
                 DLog(@"Request Data From Facebook Errro:- %@",dictData);
                 [self attemptRenewCredentials];
                 if ([self.delegate respondsToSelector:@selector(didGetFacebookError:)]) {
                     dispatch_async(dispatch_get_main_queue(),^{
                         [self.delegate didGetFacebookError:dictData];
                     });
                 }
             }
             else {
                // Process the response
                //NSLog(@"Response Dictionary contains: %@", dictData );
                if ([self.delegate respondsToSelector:@selector(didPostToFacebook:)]) {
                     dispatch_async(dispatch_get_main_queue(),^{
                         [self.delegate didPostToFacebook:dictData];
                     });
                }
             }
         }
         else{
             if ([self.delegate respondsToSelector:@selector(didGetFacebookError:)]) {
                 dispatch_async(dispatch_get_main_queue(),^{
                     [self.delegate didGetFacebookError:dictData];
                 });
             }
             else {
                 [self showAlertWithTitle:@"Error" andMessage:@"Some error occured while processing Facebook request"];
             }
         }

     }];
}

-(void)accountChanged:(NSNotification *)notif
{
    if (self.facebookAccount!=nil) {
        [self attemptRenewCredentials];
    }
    else {
        [self requestFacebookAccountAccess];
    }
}

#pragma mark - Attempt to Renew Credentials

-(void)attemptRenewCredentials
{
    [self.accountStore renewCredentialsForAccount:(ACAccount *)self.facebookAccount completion:^(ACAccountCredentialRenewResult renewResult, NSError *error){
        if(!error)
        {
            switch (renewResult) {
                case ACAccountCredentialRenewResultRenewed:
                    NSLog(@"Good to go");
                    [self againRequestFacebook];
                    break;
                case ACAccountCredentialRenewResultRejected:
                    NSLog(@"User declined permission");
                    break;
                case ACAccountCredentialRenewResultFailed:
                    NSLog(@"non-user-initiated cancel, you may attempt to retry");
                    break;
                default:
                    break;
            }

        }
        else{
            //handle error gracefully
            NSLog(@"error from renew credentials%@",error);
        }
    }];
}

-(void)againRequestFacebook
{
    switch (requestType) {
        case kGetLoggedInUserInfoRequest:
            [self getLoggedInUserInfo];
            break;
        case kGetFriendsInfoRequest:
            [self getFacebookFriendsInfo];
            break;
        case kPostToWallRequest:
            [self postToFacebookWallInBackgroundForUserId:fbUserIdForPost withParams:paramsToPost];
            break;
        default:
            break;
    }
}

#pragma mark - Remove Observer for Notification

-(void)dealloc
{
    requestType = kNoOpRequest;
    [[NSNotificationCenter defaultCenter] removeObserver:ACAccountStoreDidChangeNotification];
}

ただし、accountChangedメソッドは複数回呼び出されます。これの何が問題になっていますか?この状況にどのように対処できますか?どんな種類の助けも大歓迎です。

前もって感謝します。

4

1 に答える 1

-1

私は同じ問題に直面しています...そのため、NSUserDefaultsにBOOL値を設定してaccountChangedメソッドを1回だけ実行するという回避策を使用しました

-(void)accountChanged:(NSNotification *)notif
{
    BOOL calledAccountChanged =[[[NSUserDefaults standardUserDefaults] objectForKey:DidAccountChanged] boolValue];
    if(!calledAccountChanged)
    {
        if (self.facebookAccount!=nil) {
            [self attemptRenewCredentials];
        }
        else {
            [self requestFacebookAccountAccess];
        }
    }
}

次に、コードの後半で DidAccountChanged 値を変更できます...

より良い解決策がある場合は、投稿してください...

于 2013-02-22T07:13:41.317 に答える