2014-07-17 50 views
0

我已經成功地在Facebook應用程序的iOS應用程序的深度鏈接。但我想將Facebook帖子打開的鏈接重定向到iOS應用中的特定屏幕。iOS的Facebook的應用程序鏈接問題

對於這個我下面這個鏈接:https://developers.facebook.com/docs/applinks/ios

所以的OpenURL看起來是這樣的:

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation { 


    NSString *callingUrl=[[NSUserDefaults standardUserDefaults] stringForKey:@"url"]; 
    if ([callingUrl isEqualToString:@"fb"]) { 
     BOOL urlWasHandled = 
     [FBAppCall handleOpenURL:url 
       sourceApplication:sourceApplication 
       fallbackHandler: 
     ^(FBAppCall *call) { 
      // Parse the incoming URL to look for a target_url parameter 

      NSString *query = [url query]; // **query is nil here** 
      NSDictionary *params = [self parseURLParams:query]; 
      // Check if target URL exists 
      NSString *appLinkDataString = [params valueForKey:@"al_applink_data"]; 
      if (appLinkDataString) { 
       NSError *error = nil; 
       NSDictionary *applinkData = 
       [NSJSONSerialization JSONObjectWithData:[appLinkDataString dataUsingEncoding:NSUTF8StringEncoding] 
               options:0 
                error:&error]; 
       if (!error && 
        [applinkData isKindOfClass:[NSDictionary class]] && 
        applinkData[@"target_url"]) { 
        NSString *targetURLString = applinkData[@"target_url"]; 
        // Show the incoming link in an alert 
        // Your code to direct the user to the 
        // appropriate flow within your app goes here 
        [[[UIAlertView alloc] initWithTitle:@"Received link:" 
               message:targetURLString 
               delegate:nil 
             cancelButtonTitle:@"OK" 
             otherButtonTitles:nil] show]; 
       } 
      } 
     }]; 
     return urlWasHandled; 
} 

parseURLParams:

- (NSDictionary*)parseURLParams:(NSString *)query { 
    NSArray *pairs = [query componentsSeparatedByString:@"&"]; 
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; 
    for (NSString *pair in pairs) { 
     NSArray *kv = [pair componentsSeparatedByString:@"="]; 
     NSString *val = [[kv objectAtIndex:1] 
         stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     [params setObject:val forKey:[kv objectAtIndex:0]]; 
    } 
    return params; 
} 

的問題是,該網址是沒有得到解析。我在上面的代碼中提到:querynil

[url query] - 在這裏,網址爲:fb654127854605525://authorize/#target_url=http%3A%2F%2FmyDomain%2FmyApp%2Fregister.php%3Fcampaign_id%3D999%26l_id%3D133%26share%3Dtrue%26customer_id%3DNDQ1%26domain%3D1

當我收到錯了嗎?網址有什麼問題嗎?

回答

1

我有同樣的問題。

替換:

NSString *query = [url query]; 

有了:

NSString *query = [url absoluteString]; 

你應該再有要解析的URL。

0

使用Bolts框架來解析URL。因爲第4版

+0

希望能看到如何做到這一點的例子。 – RobP

0

的例子這個框架包括在FBSDK代碼解析用螺栓SDK(爲RobP評論)FB網址: ``

- (void)openURL:(NSURL *)url fromSource:(NSString *)source 
{ 
    NSString *s = [url resourceSpecifier]; 
    if (([url query] == nil) && (s != nil)) 
    { 
     NSRange r = [s rangeOfString:@"target_url="]; 
     if (r.location != NSNotFound) 
     { 
      url = [NSURL URLWithString:[[s substringFromIndex:(r.location + r.length)] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
     } 
    } 
    BFURL *parsedUrl = [BFURL URLWithInboundURL:url sourceApplication:source]; 
    if (parsedUrl != nil) 
    { 
     NSLog(@"APP DATA=%@\nTARGET QUERY=%@\n",[[parsedUrl appLinkData] debugDescription],[[parsedUrl targetQueryParameters] debugDescription]); 
     if ([parsedUrl targetQueryParameters] != nil) 
     { 
      NSString *objectId = [parsedUrl targetQueryParameters][@"action_object_map"]; 
      if (objectId == nil) 
      { 
       NSString *actionId = [parsedUrl targetQueryParameters][@"fb_action_ids"]; 
       if (actionId != nil) 
       { 
// Do something with FB Action Id 
       } 
      } 
      else 
      { 
       objectId = [objectId substringWithRange:NSMakeRange(1, [objectId length] - 2)]; 
// Do something with FB Object Id 
      } 
     } 
    } 
} 
相關問題