使用新的Meteor Mobile平台将推送通知的本机代码放在何处

时间:2014-11-20 22:58:38

标签: meteor

在使用最新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);
}

1 个答案:

答案 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'
});
     

source: meteor cordova wiki

虽然我们正在使用它,但限制我们的代码仅在客户端上运行,并导出我们的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