初学objective-c,发现有c/c++基础入门太容易了,于是写了个设置必应壁纸桌面来练手
//
// main.m
// OCTest
//
// Created by ddc on 16/1/3.
// Copyright © 2016年 ddc. All rights reserved.
//
@import AppKit;
@interface BingImage : NSObject
{
}
@property NSString* api_;
+ (id) initWithApiUrl:(NSString*)apiUrl;
- (nullable NSString*) getImageUrl:(int)dayIndex dateStr:(NSString**)date;
- (bool) downloadImage:(NSString**)filename date:(int)dayIndex;
@end
@implementation BingImage
+ (id) initWithApiUrl:(NSString *)apiUrl {
BingImage* image = [[BingImage alloc] init];
image.api_ = apiUrl;
return image;
}
- (nullable NSString*) getImageUrl:(int)dayIndex dateStr:(NSString**)dateStr {
NSURL* url = [NSURL URLWithString:self.api_];
NSData* data = [NSData dataWithContentsOfURL:url];
if(data) {
id json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
if(json) {
id day = [[json objectForKey:@"images"] objectAtIndex:dayIndex];
if(dateStr) {
*dateStr=[day objectForKey:@"enddate"];
}
return [day objectForKey:@"url"];
}
}
return nil;
}
- (bool) downloadImage:(NSString**)filename date:(int)dayIndex {
NSString* dateStr = nil;
NSURL* url = [NSURL URLWithString:[self getImageUrl:dayIndex dateStr:&dateStr]];
NSData* data = [NSData dataWithContentsOfURL:url];
if(data){
if(filename) {
*filename = [NSString stringWithFormat:@"/tmp/bing_wallpaper_%@.jpg", dateStr];
}
[data writeToFile:*filename atomically:YES];
return YES;
}
return NO;
}
@end
void setDesktopImage(NSString* filename){
NSError *err = nil;
NSWorkspace* space = [NSWorkspace sharedWorkspace];
bool ret = [space setDesktopImageURL:[NSURL fileURLWithPath:filename] forScreen:[NSScreen mainScreen] options: nil error: &err];
if(ret) {
NSLog(@"setDesktopImage succeeded");
} else{
NSLog(@"setDesktopImage failed: %@", err);
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
@try {
NSString *filename = nil;
BingImage* bing = [BingImage initWithApiUrl:@"http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=8&mkt=en-US"];
if(![bing downloadImage:&filename date:0]) {
@throw [[NSException alloc] initWithName:@"" reason:@"download file error" userInfo: nil];
}
setDesktopImage(filename);
}
@catch (NSException *exception) {
NSLog(@"excepted: %@", exception);
return 1;
}
}
return 0;
}