无法运行bms-samples-cordova-hellopush – 找不到bms_samples_cordova_push-Swift.h文件

我正在尝试运行GitHub上提供的推送通知示例。 不幸的是, 这里概述的配置不起作用。

文档说:在AppDelegate.m的顶部:

 #import "[your-project-name]-Swift.h" 

如果项目名称包含空格或连字符,请在import语句中将其替换为下划线。

例:

 // Project name is "Test Project" or "Test-Project" #import "Test_Project-Swift.h" 

所以我为样本做了:

 #import "bms_samples_cordova_push-Swift.h" 

ObjC Bridging Header设置为:

bms-samples-cordova-push/Plugins/ibm-mfp-core/Bridging-Header.h

Runpath设置为:

@executable_path/Frameworks

但是Xcode抛出了上面的错误。 我做错了什么?

我能够使用以下步骤运行bms-samples-cordova-hellopush示例应用程序:

  1. 克隆样本:

    git clone https://github.com/ibm-bluemix-mobile-services/bms-samples-cordova-hellopush

  2. 在我的[your-directory]/www/js/index.js添加了我的APPLICATION_ROUTEAPPLICATION_GUID (在[your-directory]/www/js/index.js为我的Mobile Services Starter应用程序配置推送通知之后)

  3. 在我的应用程序中添加了iOS平台:

    cordova platform add ios@3.9

  4. 添加了Cordova插件:

    cordova plugin add ibm-mfp-push

  5. 使用Xcode在我的[your-app-name]/platforms/ios目录中打开我的[your-app-name].xcodeproj文件(当我收到提示时: 转换为最新的Swift语法 ,我点击取消

  6. 添加了桥接标头。 去Build settings > Swift Compiler - Code Generation > Objective-C Bridging Header并添加以下路径:

    [your-project-name]/Plugins/ibm-mfp-core/Bridging-Header.h

桥头

  1. 添加Frameworks参数。 去Build Settings > Linking > Runpath Search Paths并添加以下参数:

    @executable_path/Frameworks

可执行路径

  1. 建成项目

  2. 在我的桥接头中取消注释以下Push import语句。 去[your-project-name]/Plugins/ibm-mfp-core/Bridging-Header.h

桥头

  1. 更新了我的客户端应用程序以使用Push SDK

这是我更新的AppDelegate.m

 /* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you 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. */ // // AppDelegate.m // bms-samples-cordova-push // // Created by ___FULLUSERNAME___ on ___DATE___. // Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. // #import "AppDelegate.h" #import "MainViewController.h" #import "bms_samples_cordova_push-Swift.h" #import  @implementation AppDelegate @synthesize window, viewController; - (id)init { /** If you need to do any extra app-specific initialization, you can do it here * -jm **/ NSHTTPCookieStorage* cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; int cacheSizeMemory = 8 * 1024 * 1024; // 8MB int cacheSizeDisk = 32 * 1024 * 1024; // 32MB #if __has_feature(objc_arc) NSURLCache* sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; #else NSURLCache* sharedCache = [[[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"] autorelease]; #endif [NSURLCache setSharedURLCache:sharedCache]; self = [super init]; return self; } #pragma mark UIApplicationDelegate implementation /** * This is main kick off after the app inits, the views and Settings are setup here. (preferred - iOS4 and up) */ - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { CGRect screenBounds = [[UIScreen mainScreen] bounds]; #if __has_feature(objc_arc) self.window = [[UIWindow alloc] initWithFrame:screenBounds]; #else self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease]; #endif self.window.autoresizesSubviews = YES; #if __has_feature(objc_arc) self.viewController = [[MainViewController alloc] init]; #else self.viewController = [[[MainViewController alloc] init] autorelease]; #endif // Set your app's start page by setting the  tag in config.xml. // If necessary, uncomment the line below to override it. // self.viewController.startPage = @"index.html"; // NOTE: To customize the view's frame size (which defaults to full screen), override // [self.viewController viewWillAppear:] in your view controller. [[CDVMFPPush sharedInstance] didReceiveRemoteNotificationOnLaunch:launchOptions]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; return YES; } // this happens while we are running ( in the background, or from within our own app ) // only valid if bms-samples-cordova-push-Info.plist specifies a protocol to handle - (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation { if (!url) { return NO; } // all plugins will get the notification, and their handlers will be called [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLNotification object:url]]; return YES; } // repost all remote and local notification using the default NSNotificationCenter so multiple plugins may respond - (void) application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)notification { // re-post ( broadcast ) [[NSNotificationCenter defaultCenter] postNotificationName:CDVLocalNotification object:notification]; } #if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000 - (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window #else - (UIInterfaceOrientationMask)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window #endif { // iPhone doesn't support upside down by default, while the iPad does. Override to allow all orientations always, and let the root view controller decide what's allowed (the supported orientations mask gets intersected). NSUInteger supportedInterfaceOrientations = (1 << UIInterfaceOrientationPortrait) | (1 << UIInterfaceOrientationLandscapeLeft) | (1 << UIInterfaceOrientationLandscapeRight) | (1 << UIInterfaceOrientationPortraitUpsideDown); return supportedInterfaceOrientations; } - (void)applicationDidReceiveMemoryWarning:(UIApplication*)application { [[NSURLCache sharedURLCache] removeAllCachedResponses]; } // Register device token with Bluemix Push Notification Service - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ [[CDVMFPPush sharedInstance] didRegisterForRemoteNotifications:deviceToken]; } // Handle error when failed to register device token with APNs - (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error { [[CDVMFPPush sharedInstance] didFailToRegisterForRemoteNotifications:error]; } // Handle receiving a remote notification -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { [[CDVMFPPush sharedInstance] didReceiveRemoteNotification:userInfo]; } @end 
  1. 在iOS设备上运行示例以实际注册和接收推送通知

希望我没有错过任何东西:0)

我与Cordova团队联系并提出了一些问题,以提高此样本的质量,使其更易于设置。

编辑:另外,如下面的塞巴斯蒂安所说,你需要禁用bitcode。