Xamarin.Forms - 推送通知 - iOS

时间:2016-04-26 18:12:25

标签: ios xamarin xamarin.ios apple-push-notifications xamarin.forms

我尝试添加到我的项目GCM for iOS (https://components.xamarin.com/view/googleiosgcm

This is my code:
[Register ("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IInstanceIdDelegate, IReceiverDelegate
{
public Google.Core.Configuration Configuration { get; set; }

    NSData DeviceToken { get; set; }
    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {

        NSError err;
        Google.Core.Context.SharedInstance.Configure (out err);
        if (err != null)
            Console.WriteLine ("Failed to configure Google: {0}", err.LocalizedDescription);
        Configuration = Google.Core.Context.SharedInstance.Configuration;


        // Configure and Start GCM
        var gcmConfig = Google.GoogleCloudMessaging.Config.DefaultConfig;
        gcmConfig.ReceiverDelegate = this;
        Service.SharedInstance.Start (gcmConfig);

        // Register for remote notifications
        var notTypes = UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge;
        var settings = UIUserNotificationSettings.GetSettingsForTypes (notTypes, null);
        UIApplication.SharedApplication.RegisterUserNotificationSettings (settings);
        UIApplication.SharedApplication.RegisterForRemoteNotifications ();

        global::Xamarin.Forms.Forms.Init ();

        LoadApplication (new App ());

        return base.FinishedLaunching (app, options);
    }

    public override void RegisteredForRemoteNotifications (UIApplication application, NSData deviceToken)
    {          

        // Save our token in memory for future calls to GCM
            DeviceToken = deviceToken;

        // Configure and start Instance ID
        var config = Google.InstanceID.Config.DefaultConfig;
        InstanceId.SharedInstance.Start (config);

        // Get a GCM token
        GetToken ();
    }

    void GetToken ()
    {
        // Register APNS Token to GCM
        var options = new NSDictionary ();
        options.SetValueForKey (DeviceToken, Constants.RegisterAPNSOption);
        options.SetValueForKey (new NSNumber(true), Constants.APNSServerTypeSandboxOption);

        // Get our token
        InstanceId.SharedInstance.Token (
            "1055xxxx" ,//My sender id here,
            Constants.ScopeGCM,
            options,
            (token, error) => Console.WriteLine ("GCM Registration ID: " + token));
    }

    public override void DidReceiveRemoteNotification (UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
    {
        // Your own notification handling logic here

        // Notify GCM we received the message
        Service.SharedInstance.AppDidReceiveMessage (userInfo);
    }

    public override void OnActivated (UIApplication application)
    {
        Service.SharedInstance.Connect (error => {
            if (error != null)
                Console.WriteLine ("Could not connect to GCM: {0}", error.LocalizedDescription);
            else
                Console.WriteLine ("Connected to GCM");
        });
    }

    public override void DidEnterBackground (UIApplication application)
    {
        Service.SharedInstance.Disconnect ();
    }

    public void DeleteToken ()
    {
        InstanceId.SharedInstance.DeleteToken (
            "1055xxxx" ,//My sender id here
            Constants.ScopeGCM,
            error => {
                // Callback, non-null error if there was a problem
                if (error != null)
                    Console.WriteLine ("Deleted Token");
                else 
                    Console.WriteLine ("Error deleting token");
            });
    }

    int messageId = 1;

    // We can send upstream messages back to GCM
    public void SendUpstreamMessage ()
    {            
        var msg = new NSDictionary ();
        msg.SetValueForKey (new NSString ("1234"), new NSString ("userId"));
        msg.SetValueForKey (new NSString ("hello world"), new NSString ("msg"));

        var to = "1055xxxxxx" + "@gcm.googleapis.com";

        Service.SharedInstance.SendMessage (msg, to, (messageId++).ToString ());
    }

    [Export ("didDeleteMessagesOnServer")]
    public void DidDeleteMessagesOnServer ()
    {
        // ...
    }

    [Export ("didSendDataMessageWithID:")]
    public void DidSendDataMessage (string messageID)
    {
        // ...
    }

    [Export ("willSendDataMessageWithID:error:")]
    public void WillSendDataMessage (string messageID, NSError error)
    {
        // ...
    }

这是控制台:

You have enabled the CloudMessaging service in Developer Console, but it appears as though your Podfile is missing the line: 'pod "Google/CloudMessaging" or you may need to run pod update in your project directory.

2016-04-26 20:54:43.197 xxxx.iOS[2072:94709] Failed to configure Google: Missing expected subspaces.

GCM | GCM registration is not ready with auth credentials
2016-04-26 20:54:47.712 xxxxxxxx.iOS[2072:94709] Could not connect to GCM: The operation couldn’t be completed. (com.google.gcm error 501.)

我是从Xamarin.Forms做的 - 也许这是问题???

我从一开始就做了所有步骤,但遇到了这个问题

任何想法的家伙是什么问题??? 当然 - 我将文件从谷歌添加到资源文件夹添加确实构建操作 - BundleResource

并在info.plist中选中了remove-notification module

1 个答案:

答案 0 :(得分:1)

根据gcm documentation,你应该有 cocoa pods 来整合他们的框架。

因此请确保使用cocoa pod添加/更新gcm。 根据日志,广告连播不会更新。