我正在尝试运行可用的推送通知示例GitHub。
不幸的是,配置如概述here不起作用。
文件说:
在你的顶部AppDelegate.m
:
#import "[your-project-name]-Swift.h"
如果您的项目名称包含空格或连字符,请在导入语句中将其替换为下划线。
Example:
// Project name is "Test Project" or "Test-Project"
#import "Test_Project-Swift.h"
所以我对样本做了:
#import "bms_samples_cordova_push-Swift.h"
ObjC 桥接标头设置为:
bms-samples-cordova-push/Plugins/ibm-mfp-core/Bridging-Header.h
运行路径设置为:
@executable_path/Frameworks
但是 Xcode 会抛出上面的错误。我做错了什么?
我能够得到bms-samples-cordova-hellopush
使用以下步骤运行示例应用程序:
-
克隆样本:
git clone https://github.com/ibm-bluemix-mobile-services/bms-samples-cordova-hellopush
-
添加了我的应用程序_路由 and 应用程序_GUID in my [your-directory]/www/js/index.js
(在 Bluemix 上为我的 Mobile Services Starter 应用程序配置推送通知后
-
将 iOS 平台添加到我的应用程序中:
cordova platform add [email protected]
-
添加了 Cordova 插件:
cordova plugin add ibm-mfp-push
-
打开我的[your-app-name].xcodeproj
文件在我的[your-app-name]/platforms/ios
Xcode 的目录(当提示我时:转换为最新的 Swift 语法,我点击了Cancel)
-
添加了桥接头。去了Build settings > Swift Compiler - Code Generation > Objective-C Bridging Header
并添加以下路径:
[your-project-name]/Plugins/ibm-mfp-core/Bridging-Header.h
-
添加框架参数。去了Build Settings > Linking > Runpath Search Paths
并添加了以下参数:
@executable_path/Frameworks
-
建成项目
-
取消注释我的桥接标头中的以下 Push import 语句。去了[your-project-name]/Plugins/ibm-mfp-core/Bridging-Header.h
:
- 更新了我的客户端应用程序以使用 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 <Cordova/CDVPlugin.h>
@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 <content src='foo.html' /> 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
- 在 iOS 设备上运行示例以实际注册和接收推送通知
希望我没有错过任何东西:0)
我已经联系了 Cordova 团队并提出了一些问题,以提高此示例的质量,使其更易于设置。
Edit:另外,正如下面 Sebastian 所指出的,您需要禁用位码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)