diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m index e5e6dc5fb1..16e5c5d1b7 100644 --- a/ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m +++ b/ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m @@ -84,34 +84,20 @@ - (void)addRule:(NSString*)type rule:(NSDictionary *)rule return; } [fontFamily setObject:fontSrc forKey:@"src"]; - if ([fontURL isFileURL]) { - // local font file will be added directly if existed - if ([WXUtility isFileExist:[fontURL path]]) { - [fontFamily setObject:fontURL forKey:@"localSrc"]; - [_fontStorage setObject:fontFamily forKey:rule[@"fontFamily"]]; - } else { - WXLogWarning(@"font file %@ is not exist", fontSrc); - } - return; - } + [_fontStorage setObject:fontFamily forKey:rule[@"fontFamily"]]; // remote font file NSString *fontfile = [NSString stringWithFormat:@"%@/%@",WX_FONT_DOWNLOAD_DIR,[WXUtility md5:fontURL.path]]; if ([WXUtility isFileExist:fontfile]) { // if has been cached, load directly [fontFamily setObject:[NSURL fileURLWithPath:fontfile] forKey:@"localSrc"]; - [_fontStorage setObject:fontFamily forKey:rule[@"fontFamily"]]; return; } - - [_fontStorage setObject:fontFamily forKey:rule[@"fontFamily"]]; - __weak typeof(self) weakSelf = self; [WXUtility getIconfont:fontURL completion:^(NSURL * _Nonnull url, NSError * _Nullable error) { if (!error && url) { // load success NSMutableDictionary * dictForFontFamily = [weakSelf.fontStorage objectForKey:rule[@"fontFamily"]]; [dictForFontFamily setObject:url forKey:@"localSrc"]; - [weakSelf.fontStorage setObject:url forKey: dictForFontFamily]; } else { //there was some errors during loading WXLogError(@"load font failed %@",error.description); diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m index d07132031f..4ad8be5cb1 100644 --- a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m +++ b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m @@ -350,19 +350,15 @@ + (UIFont *)fontWithSize:(CGFloat)size textWeight:(WXTextWeight)textWeight textS if (fontFamilyDic[@"localSrc"]){ NSString *fpath = [((NSURL*)fontFamilyDic[@"localSrc"]) path]; if ([self isFileExist:fpath]) { - CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fpath UTF8String]); - CGFontRef customfont = CGFontCreateWithDataProvider(fontDataProvider); - + // if the font file is not the correct font file. it will crash by singal 9 + CFURLRef fontURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (__bridge CFStringRef)fpath, kCFURLPOSIXPathStyle, false); + CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL(fontURL); + CFRelease(fontURL); + CGFontRef graphicFont = CGFontCreateWithDataProvider(fontDataProvider); CGDataProviderRelease(fontDataProvider); - NSString *fontName = (__bridge NSString *)CGFontCopyFullName(customfont); - CFErrorRef error; - CTFontManagerRegisterGraphicsFont(customfont, &error); - if (error){ - CTFontManagerUnregisterGraphicsFont(customfont, &error); - CTFontManagerRegisterGraphicsFont(customfont, &error); - } - CGFontRelease(customfont); - font = [UIFont fontWithName:fontName size:fontSize]; + CTFontRef smallFont = CTFontCreateWithGraphicsFont(graphicFont, size, NULL, NULL); + CFRelease(graphicFont); + font = (__bridge UIFont*)smallFont; }else { [[WXRuleManager sharedInstance] removeRule:@"fontFace" rule:@{@"fontFamily": fontFamily}]; } @@ -396,12 +392,23 @@ + (UIFont *)fontWithSize:(CGFloat)size textWeight:(WXTextWeight)textWeight textS + (void)getIconfont:(NSURL *)url completion:(void(^)(NSURL *url, NSError *error))completionBlock { + if ([url isFileURL]) { + // local file url + NSError * error = nil; + if (![WXUtility isFileExist:url.absoluteString]) { + error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:-1 userInfo:@{@"errMsg":[NSString stringWithFormat:@"local font %@ is't exist", url.absoluteString]}]; + } + completionBlock(url, error); + return; + } + + // remote font url NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSURL * downloadPath = nil; - if (!error && location) { + NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse*)response; + if (200 == httpResponse.statusCode && !error && location) { NSString *file = [NSString stringWithFormat:@"%@/%@",WX_FONT_DOWNLOAD_DIR,[WXUtility md5:[url path]]]; - downloadPath = [NSURL fileURLWithPath:file]; NSFileManager *mgr = [NSFileManager defaultManager]; NSError * error ; @@ -413,6 +420,10 @@ + (void)getIconfont:(NSURL *)url completion:(void(^)(NSURL *url, NSError *error) if (!result) { downloadPath = nil; } + } else { + if (200 != httpResponse.statusCode) { + error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:-1 userInfo:@{@"ErrorMsg": [NSString stringWithFormat:@"can not load the font url %@ ", url.absoluteString]}]; + } } completionBlock(downloadPath, error); }];