2012年10月4日 星期四

iOS與Facebook SDK連結,以及簡單貼文

第一步必須在AppDelegate的地方接住http近來之Handler,並將此url遞給Facebook物件:

//=====In appDelegate.m=======

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    // attempt to extract a token from the url
   
    //利用rootViewController來取得擁有Facebook物件之viewController
    UINavigationController* testing = (UINavigationController*)self.window.rootViewController;
    IndexViewController *controller = (IndexViewController*)[testing.viewControllers objectAtIndex:1];

    //將url遞給facebook物件,之後facebook之Delegate才會驅動fbDidLogin與fbDidLogout
    return [controller.facebook handleOpenURL:url];
}

接著在擁有Facebook物件之ViewController初始化facebook,並使用NSUserDefault來記錄登入的狀態:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Facebook物件初始化,並登入AppID
    facebook = [[Facebook alloc] initWithAppId:AppID andDelegate:self];

    //使用NSUserDefault來記錄登入狀態
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    //檢查是否有用過
    if ([defaults objectForKey:@"FBAccessToken"]
        &&[defaults objectForKey:@"FBExpirationDate"]) {
        //如果沒有重新開一個
        facebook.accessToken = [defaults objectForKey:@"FBAccessToken"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDate"];
    }
}


登入程序:

-(void)login
{
     //檢查Facebokk是否連線還在
     if (![facebook isSessionValid]) {

        //如果已經不再連線狀態,重新連線
        //定義需要的權限
        NSArray *permissions =  [NSArray arrayWithObjects:
                                 @"user_hometown", @"read_stream", @"user_birthday",
                                 @"user_about_me", @"publish_stream", @"offline_access", nil];
        //登入
        [facebook authorize:permissions];
    }else{
        //如果已經在登入狀態的話,擷取使用者資訊
        [facebook requestWithGraphPath:@"me" andDelegate:self];
    }

}

貼文程序:

-(void)postToWall
{
    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   AppID, @"app_id",
                                   @"http://www.google.com.tw/", @"link",
                                   @"http://www.google.com.tw/pic.jpg", @"picture",
                                   @"Facebook test", @"name",
                                   @"caption", @"caption",
                                   @"", @"description",
                                   @""@"message",
                                   nil];
    [facebook dialog:@"stream.publish" andParams:params andDelegate:self];

}

剩下一些FB之Delegate:

#pragma mark - FBRequestDelegate

- (void)requestLoading:(FBRequest *)request
{
    
}

- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"received response:%@",response);
}

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error
{
    
}

- (void)request:(FBRequest *)request didLoad:(id)result
{
    //利用Facebook物件request之資訊會傳遞到result,可以從這邊去收資料
    if ([result isKindOfClass:[NSArray class]] && [result count]>0) {
        result = [result objectAtIndex:0];
    }
    if ([result objectForKey:@"name"]){
        userName = [result objectForKey:@"name"];
    }
}

- (void)request:(FBRequest *)request didLoadRawResponse:(NSData *)data
{
    
}

//如果登入成功會呼叫此function
- (void)fbDidLogin {

    //擷取個人資訊,回饋資訊回從- (void)request:(FBRequest *)request didLoad:(id)result接收
    [facebook requestWithGraphPath:@"me" andDelegate:self];

    //將成功登入之資訊傳到NSUserDefault
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessToken"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDate"];
    [defaults synchronize];
}
-(void)fbDidLogout
{
    //登出時,清除帳戶資訊
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessToken"]) {
        [defaults removeObjectForKey:@"FBAccessToken"];
        [defaults removeObjectForKey:@"FBExpirationDate"];
        [defaults synchronize];
    }
}










2012年10月1日 星期一

ios HTTP post and get


在ios使用http post方法:

      NSString *post = @"did=abc&uid=王大明&score=0.3,0.4,0.5,1.1,1.4";
        NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
        
        NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
        
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:[NSURL URLWithString:@"http://greenevent2.sunlight.tw/putdata2.asp"]];
        [request setHTTPMethod:@"POST"];
        [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
        [request setHTTPBody:postData];
        NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self];
        if (conn)
        {
            receivedData = [NSMutableData data];
        }
        else
        {    
        }


在ios使用http get方法:

NSMutableURLRequest *request = [[NSMutableURLRequest allocinit];
[request setURL: apiUrl];
[request setHTTPMethod:@"GET"];


NSURLConnection *conn=[[NSURLConnection allocinitWithRequest:request delegate:self];
if (conn)
{
   receivedData = [NSMutableData data];
}



Delegate方法:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"response");
    [receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
    [receivedData appendData:d];
    NSLog(@"didReceiveData");
    NSString* newStr = [[NSString alloc] initWithData:receivedData
                                             encoding:NSUTF8StringEncoding];
    NSLog(@"returnData:%@",newStr);

    //NSLog(@"receivedData:%@",receivedData);
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"")
                                 message:[error localizedDescription]
                                delegate:nil
                       cancelButtonTitle:NSLocalizedString(@"OK", @"")
                       otherButtonTitles:nil] show];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"connectionDidFinishLoading");
    /*
    NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];
    
    // Do anything you want with it
    
    [responseText release];
     */
}

// Handle basic authentication challenge if needed
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    NSString *username = @"username";
    NSString *password = @"password";
    
    NSURLCredential *credential = [NSURLCredential credentialWithUser:username
                                                             password:password
                                                          persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}

同步方式


  1. NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];           

  2. [request setURL:[NSURL URLWithString:urlStr]];  

  3. [request setHTTPMethod:@"GET"];  

  4. NSData *returnData = [NSURLConnection sendSynchronousRequest:request   
  5.                                            returningResponse:nil error:nil];   
  6.   
  7. [request release];