iOS分享图片到Flickr

最近公司有需求做Flickr分享功能,现将分享过程中遇到的问题做下总结。
相对于国内的主流平台分享(微信,微博等等),Flickr官方并未提供移动端分享的SDK。还好有万能的googlegithub。通过google我找到了国外大牛写的FlickrKit。FlickrKit的基本原理就是封装了Flick的http请求,具体实现可以参照代码。此文只分享实现分享图片的流程。当然Flick在国内是禁止访问的,所以一下所有操作的前提是你能翻墙。
首先你需要注册一个Flick账号,然后访问Flick开发人员指南。Flick貌似没有简体中文版的,我访问的是繁体中文版的网站。首先需要为APP注册請求 API Key。Flick的API key有商业和非商业用途的,具体参照网站说明,我申请的是非商业用途的Key。
然后会要求你填入一些必要信息
ios_flick_share_demo_info
点击完成会声称APP需要的key和密钥。
剩下的操作就全部依赖Xcode开发工具了。首先FlickrKit本身已经集成在CocoaPods中,需要通过Pod下载相关代码。对于FlickrKit代码调用流程,主要由一下几个部分组成:
首先需要增加URL Type:
ios_flickr_share_url_type
同时由于iOS 9增加了打开应用程序的权限,同时需要在info.plist中增加打开自身应用程序权限,如下图所示:
ios_flickr_share_query_scheme
然后需要在AppDelegate.m中添加如下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [[FlickrKit sharedFlickrKit] initializeWithAPIKey:kFlickrApiKey sharedSecret:kFlickrApiSecret];
    return YES;
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    NSString *scheme = [url scheme];
    if ([scheme isEqualToString:@"FlickrShareDemo"]) {
        [[NSNotificationCenter defaultCenter] postNotificationName:kFlickrAuthCallBackNotificationName object:url userInfo:nil];
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    NSString *scheme = [url scheme];
    if ([scheme isEqualToString:@"FlickrShareDemo"]) {
        [[NSNotificationCenter defaultCenter] postNotificationName:kFlickrAuthCallBackNotificationName object:url userInfo:nil];
        return YES;
    }
    return YES;
}

代码说明:

  • 首先需要在application didFinishLaunchingWithOptions:中初始化FlickrKit,需要输入网站中注册APP的key和密钥;
  • 对于下面openURL,handleOpenURL代码,首先判断了url scheme的类型,然后post自定义通知;
  • 然后需要增加FlickrAuthViewController,同时在Storyboard中增加相应的视图。此操作主要是为了做Flickr登录验证操作。关键代码如下:

        // This must be defined in your Info.plist
        // Flickr will call this back. Ensure you configure your flickr app as a web app
        NSString *callbackURLString = @"FlickrShareDemo://auth";
        
        // Begin the authentication process
        self.authOperation = [[FlickrKit sharedFlickrKit] beginAuthWithCallbackURL:[NSURL URLWithString:callbackURLString] permission:FKPermissionDelete completion:^(NSURL *flickrLoginPageURL, NSError *error) {
            dispatch_async(dispatch_get_main_queue(), ^{
                if (!error) {
                    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:flickrLoginPageURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
                    [self.webView loadRequest:urlRequest];
                } else {
                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
                    [alert show];
                }
            });
        }];
    

    具体可以参照我上传github的代码,此处不再详细说明。基本原理就是内嵌webview,通过webview访问Flickr网站做登录验证。验证结束后通过openURL调用自身应用程序,根据AppDelegate中的代理通知应用程序做进一步操作。
    下一步就是上传图片到Flickr上了,有别于国内的上传图片方式,Flickr上传图片支持原图上传,不需要压缩质量。具体上传代码参照我上传github上的demo就可以了。