在使用最新1.0版本的Meteor查看新的移动功能后,我没有看到我将修改Cordova代码以添加自定义功能的位置。例如,我想在iOS和Android上为我的应用程序实现推送通知。在这两种情况下,我都需要编写一些本机代码,以便我可以注册设备并接受推送通知消息。
目前,我使用MeteorRider来完成此操作并且效果很好。我有2个独立的项目,分别用于Meteor,Android和iOS。在后两种情况下,我将本机代码放在必要的位置来完成此任务。有一件事是肯定的,你必须更新Cordova中的bootstrap类以允许注册工作。
在Meteor 1.0中,我如何通过开箱即用的移动功能来实现这一目标?
这里是用于接受Cordova的AppDelegate所需的推送通知注册响应的Objective-C代码:
- (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog( @"Device token is: %@", deviceToken);
// Convert to string that can be stored in DB
NSString *regId = [[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""];
regId = [regId stringByReplacingOccurrencesOfString:@">" withString:@""];
regId = [regId stringByReplacingOccurrencesOfString: @" " withString: @""];
[[ApplePushNotificationService sharedInstance] application:application uploadDeviceToken:regId];
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@"Failed to get token, error: %@", error);
}
答案 0 :(得分:2)
TL; DR:Cordova项目位于.meteor/local/cordova-build
子文件夹中。
默认AppDelegate.m
在.meteor/local/cordova-build/platforms/ios/***YOUR_APP_NAME***/Classes
子文件夹中创建。
如果您将一个名为cordova-build-override
的顶级文件夹添加到您的meteor项目中,它所包含的目录树将在构建和编译步骤之前添加到.meteor/local/cordova-build
文件夹中。
因此,将您的自定义AppDelegate.m放在名为cordova-build-override/platforms/ios/***YOUR_APP_NAME***/Classes
的新文件夹中。
mkdir -p cordova-build-override/platforms/ios/foo/Classes
cp .meteor/local/cordova-build/platforms/ios/foo/Classes/AppDelegate.m cordova-build-override/platforms/ios/foo/Classes
到目前为止Meteor-Cordova integration page on the GitHub Meteor wiki是查找使用流星进行科尔多瓦发展的详细信息的最佳位置。
您将特定于cordova的代码放在普通的javascript中。如果可能的话,最好不要修改本机代码;相反,看看你是否可以编写自己的cordova插件并从你的流星应用程序中使用它。 The cordova PushPlugin plugin可以做你想要的,但如果没有,你可以用它作为参考。
下面的示例将创建一个新的iOS应用程序,从头开始使用非流星线索插件。
注意: 这是一个最基本的例子。查看meteor cordova camera plugin以获取完整示例。以下代码基于该插件。
# create a meteor app foo
meteor create foo
cd foo
# add the iOS cordova platform
meteor add-platform ios
# create a new meteor package, foo-camera.
# NOTE: You need to substitute your own meteor.com developer ID here
meteor create --package your_meteor_developer_id:foo-camera
现在,编辑packages/your_meteor_developer_id:foo-camera/package.js
文件以添加以下内容:
// Add the camera cordova plugin at version 0.3.3
Cordova.depends({
'org.apache.cordova.camera': '0.3.3'
});
编辑1 :这会导致插件下载到您的cordova插件文件夹中。 您可以参考git tarball而不是版本号,例如:
Cordova.depends({ 'com.phonegap.plugins.facebookconnect': 'https://github.com/Wizcorp/phonegap-facebook-plugin/tarball/0e61babb65bc1716b957b6294c7fdef3ce6ace79' });
虽然我们正在使用它,但限制我们的代码仅在客户端上运行,并导出我们的FooCamera对象,以便它可以在我们的其他流星javascript中使用:
Package.onUse(function(api) {
api.versionsFrom('1.0');
api.export('FooCamera');
api.addFiles('your_meteor_developer_id:foo-camera.js','client');
});
编辑2 : 如果您的cordova插件需要特殊配置,您可以在流星应用程序中定义 mobile configuration file。它将被复制到 你的应用程序的config.xml。
E.g。
// ===== mobile-config.js ====== // Set PhoneGap/Cordova preferences App.setPreference('SOME_SPECIFIC_PLUGIN_KEY','SOME_SPECIFIC_PLUGIN_VAL');
您的应用程序的config.xml最终将导致以下结果:
<preference name="SOME_SPECIFIC_PLUGIN_KEY" value="SOME_SPECIFIC_PLUGIN_VAL"/>
接下来,编辑包中的JavaScript文件(packages/your_meteor_developer_id:foo-camera/your_meteor_developer_id:foo-camera.js
),以类似流星的方式显示cordova功能。使用official meteor mobile package examples作为参考。
(下面的代码是从meteor github repo无耻地偷走的):
FooCamera = {};
FooCamera.getPicture = function (options, callback) {
// if options are not passed
if (! callback) {
callback = options;
options = {};
}
var success = function (data) {
callback(null, "data:image/jpeg;base64," + data);
};
var failure = function (error) {
callback(new Meteor.Error("cordovaError", error));
};
// call the cordova plugin here, and pass the result to our callback.
navigator.camera.getPicture(success, failure,
_.extend(options, {
quality: options.quality || 49,
targetWidth: options.width || 640,
targetHeight: options.height || 480,
destinationType: Camera.DestinationType.DATA_URL
})
);
};
现在,将新的(本地)软件包添加到您的meteor应用程序中。
meteor add your_meteor_developer_id:foo-camera
编辑应用程序的主HTML和JS以使用新的meteor包。
在foo.html
中,将hello模板替换为:
<template name="hello">
<button>Take a Photo</button>
{{#if photo}}
<div>
<img src={{photo}} />
</div>
{{/if}}
</template>
在foo.js
中,将按钮单击事件处理程序替换为:
Template.hello.helpers({
photo: function () {
return Session.get("photo");
}
});
Template.hello.events({
'click button': function () {
var cameraOptions = {
width: 800,
height: 600
};
FooCamera.getPicture(cameraOptions, function (error, data) {
Session.set("photo", data);
});
}
});
现在,插入您的设备,确保它与您的计算机在同一网络上,并启动meteor服务器和ios应用程序。
meteor run ios-device
# If you want to just use the emulator, use the following instead.
# but of course the camera won't work on the emulator.
#meteor run ios
XCode将会打开。在运行应用程序之前,您可能需要设置证书和配置文件(来自XCode)。
在另一个终端中,拖尾日志:
tail -f .meteor/local/cordova-build/platforms/ios/cordova/console.log
最后,发布您的优秀流星线插件,以便其他人都可以使用它。编辑package.js as per the meteor docs。然后:
cd packages/your_meteor_developer_id\:foo-camera
meteor publish