简体   繁体   English

Xamarin.Forms-推送通知-iOS

[英]Xamarin.Forms - Push Notification - iOS

I try to add to my project GCM for iOS ( https://components.xamarin.com/view/googleiosgcm ) 我尝试将iOS的GCM添加​​到我的项目中( 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)
    {
        // ...
    }

and this is console: 这是控制台:

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.)

I do it from Xamarin.Forms - maybe this is problem??? 我从Xamarin.Forms完成-也许这是问题???

I did ALL step from getting start but got this problem 我从开始就做了所有步骤,但是遇到了这个问题

Any idea guys what is problem??? 你们有什么想法吗??? For sure - I added file from google to resource folder add did build action - BundleResource 当然-我从谷歌添加文件到资源文件夹添加确实生成操作-BundleResource

and in info.plist checked remove-notification module 并在info.plist中检查了删除通知模块

As per the gcm documentation , you should have cocoa pods to integrate their framework. 根据gcm文档 ,您应该具有可可豆荚来集成其框架。

So make sure you added/update gcm with cocoa pod. 因此,请确保您使用可可豆荚添加/更新了gcm。 As per the log, pod is not updated. 根据日志,pod不会更新。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM