2016-11-26 56 views
2

我是一名Web开发人员,我第一次构建了一个React Native应用程序。 该应用程序正在工作并编译,直到我添加了对推送通知的FCM支持。React本机iOS构建失败“无法执行命令:分割错误:11”

我遵循使用CocoaPods从React-Native-FCM的所有说明。

现在,通过在Xcode中创建与此错误失败:

clang: error: unable to execute command: Segmentation fault: 11 
clang: error: linker command failed due to signal (use -v to see invocation) 

我的AppDelegate文件看起来像这样:

 
// 
// Copyright (c) 2016 Google Inc. 
// 
// Licensed under the Apache License, Version 2.0 (the "License"); 
// you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at 
// 
// http://www.apache.org/licenses/LICENSE-2.0 
// 
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and 
// limitations under the License. 
// 

#import "AppDelegate.h" 

#import "RCTBundleURLProvider.h" 
#import "RCTRootView.h" 
#import "RNFIRMessaging.h" 

// Copied from Apple's header in case it is missing in some cases (e.g. pre-Xcode 8 builds). 
#ifndef NSFoundationVersionNumber_iOS_9_x_Max 
#define NSFoundationVersionNumber_iOS_9_x_Max 1299 
#endif 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    NSURL *jsCodeLocation; 

    jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 

    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 
                 moduleName:@"Mamaz" 
               initialProperties:nil 
                launchOptions:launchOptions]; 
    rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    UIViewController *rootViewController = [UIViewController new]; 
    rootViewController.view = rootView; 
    self.window.rootViewController = rootViewController; 
    [self.window makeKeyAndVisible]; 

    [FIRApp configure]; 

    #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 
    [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self]; 
    #endif 

    return YES; 

} 

#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:FCMNotificationReceived object:self userInfo:notification.request.content.userInfo]; 
    if([[notification.request.content.userInfo valueForKey:@"show_in_foreground"] isEqual:@YES]){ 
    completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound); 
    }else{ 
    completionHandler(UNNotificationPresentationOptionNone); 
    } 

} 

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler 
{ 
    NSDictionary* userInfo = [[NSMutableDictionary alloc] initWithDictionary: response.notification.request.content.userInfo]; 
    [userInfo setValue:@YES forKey:@"opened_from_tray"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:FCMNotificationReceived object:self userInfo:userInfo]; 
} 
#else 
//You can skip this method if you don't want to use local notification 
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 
    [[NSNotificationCenter defaultCenter] postNotificationName:FCMNotificationReceived object:self userInfo:notification.userInfo]; 
} 
#endif 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:FCMNotificationReceived object:self userInfo:userInfo]; 
    completionHandler(UIBackgroundFetchResultNoData); 
} 

@end 

而且我PodFile这样的:

 
target 'App' do 
    use_frameworks! 

    # Pods for App 
    pod 'Firebase/Core' 
    pod 'Firebase/Messaging' 

    target 'AppTests' do 
    inherit! :search_paths 
    # Pods for testing 
    end 

end 

有任何人遇到过这样的问题?我什至不明白是什么原因造成的(因为错误信息不是很具描述性)

回答

1

有了一般性的错误信息,你可能会得到一般性的答案。

尝试:

一)删除#define NSFoundationVersionNumber_iOS_9_x_Max 1299得到一个提示,如果你的工具链是否正确。

b)关闭Xcode 8.1(完全关闭,就像使用cmd + q),删除DerivedData文件夹,清空垃圾箱。在最后一步之后只能重新打开Xcode,才能正确地重新构建缓存。

c)确保你使用的是CocoaPods 1.1.1。毫无疑问,你也可以更新其他工具。例如:sudo gem update -n /usr/local/bin --system && sudo gem update -n /usr/local/bin

d)use_frameworks!target之前,因为这就是我们通常做的

E)pod deintegrate && pod install,重新整合的豆荚正确

F)最后,克隆你的项目,并尝试从建筑克隆的回购:如果有效,删除旧的回购并使用新的回购:)。如果它仍然失败,那么你可以开始删除代码片段,尝试使用一个最小的测试用例来获得配置,然后你可以在CocoaPods问题跟踪器上共享该调查用于调查。

+0

这实际上是一个很好的答案,我不得不做所有的建议,但它的工作,谢谢! –

相关问题