2017-08-02 12 views
0

Hallo Fellow Programmierer,IOS Push-Benachrichtigungen zwischen den Geräten - GCDAsyncSocket

Ich bin versucht, Benutzern zu ermöglichen, Push-Benachrichtigungen an andere Benutzer zu senden (wie eine Freundesanfrage senden, etc.).

Das Endziel hier ist, dass meine iOS-App kontinuierlich einen bestimmten Hostnamen/Port-URL abhört, sobald sich ein Benutzer bei seinem Konto angemeldet hat (aka eine bestimmte Ansicht geladen hat). Mein Stack ist ein Express-Server, der mit einer MongoDB kommuniziert.

Lässt ein Benutzer sagen mit {account_id} angemeldet, wäre der Weg zu seinem Kundendaten sein. "http://72.89.157.153:3000/accounts/ {account_id}

ich meine App auf alle Anfragen an diese URL senden hören möchte ich bin Verwenden von GCDAsyncSocket-Bibliotheken, um mit der Ursache zu helfen.Wenn ich jedoch zu Testzwecken eine Verbindung zu http://72.89.157.153:3000/ herstelle, wird keine Delegate-Funktion aufgerufen.Ich habe viele Leute mit demselben Problem gesehen, aber ich kann keine Lösung erhalten, die ich gelesen habe.

Code:

SocketCo nnection.h

#ifndef SocketConnection_h 
#define SocketConnection_h 
#import "GCDAsyncSocket.h" // for TCP 

@import CocoaAsyncSocket; 

@interface SocketConnection : NSObject <GCDAsyncSocketDelegate> 

/* GCDAsyncSocket */ 
@property (strong, nonatomic) GCDAsyncSocket *socket; 


// Methods 
+(SocketConnection *)sharedConnection; 

@end 

#endif /* SocketConnection_h */ 

SocketConnection.m

#import <Foundation/Foundation.h> 
#import "SocketConnection.h" 
@implementation SocketConnection 

+(SocketConnection *)sharedConnection { 
    static dispatch_once_t once; 
    static SocketConnection *instance; 

    dispatch_once(&once, ^{ 
     instance = [[SocketConnection alloc] init]; 
    }); 


    return instance; 
} 


-(id)init { 

    _socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 

    NSError *err = nil; 
    if (![_socket connectToHost:@"http://72.89.157.153" onPort:3000 error:&err]) { 
     printf("\nDid Not Return Okay: %s\n", [[err localizedDescription] UTF8String]); 
    } else { 
     printf("\nReturned Okay\n"); // This is printed 
    } 

    return self; 
} 

/* ASNYC DELEGATES */ 

/* I am expecting this method to be called when connectToHost: is called in init.. */ 

- (void)socket:(GCDAsyncSocket *)sender didConnectToHost:(NSString *)host port:(UInt16)port { 
    printf("I'm connected! Host:%s\n", [host UTF8String]); 
} 

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag { 
    printf("I have written That was easy.\n"); 


} 

- (void)socket:(GCDAsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag { 
    printf("I have read That was easy.\n"); 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     @autoreleasepool { 
      [_socket readDataWithTimeout:-1 tag:1]; 
     } 


    }); 

} 

@end 

Hier ist der Ort, in dem Viewcontroller, wo ich eine Instanz von SocketConnection schaffen ...

-(void)viewDidAppear:(BOOL)animated { 
    /* Socket connector */ 
    SocketConnection *s = [SocketConnection sharedConnection]; 
    printf("port: %hu\n" ,s.socket.connectedPort); // prints 0 right now 
} 

Wenn Dies ist nicht der beste Weg, um mein Ziel zu erreichen. Bitte weisen Sie mich in die richtige Richtung (Link Lesungen, andere Frameworks, Bibliotheken etc.) Fragen bitte lass es mich wissen.

Vielen Dank für die Hilfe.

Antwort

2

okey, für Ihr erstes Ziel (Benutzer erlaubt, Push-Benachrichtigungen an anderen Benutzer zu senden und unter der Annahme, dass Sie eine node.js Server-Seite mit Express- und mongodb haben) versuchen, dies zu tun:

Zuerst auf der Server-Seite installieren Apn und Knoten-gcm.

npm i --save apn node-gcm 

werden Diese beiden Pakete verwendet Push-Benachrichtigungen zu iOS- und Android-zu senden.

Sobald Sie diese Pakete installiert haben, erstellen Sie eine Route auf Ihrer Serverseite, um die Benachrichtigungen zu senden.Dies kann mit so etwas wie dies geschehen:

IOS

Objective C

#import <Foundation/Foundation.h> 

NSDictionary *headers = @{ @"content-type": @"application/x-www-form-urlencoded", 
         @"cache-control": @"no-cache" 

NSMutableData *postData = [[NSMutableData alloc] initWithData:[@"token=xxxxx" dataUsingEncoding:NSUTF8StringEncoding]]; 
[postData appendData:[@"&message=xxxxx" dataUsingEncoding:NSUTF8StringEncoding]]; 
[postData appendData:[@"&payload=xxxxx" dataUsingEncoding:NSUTF8StringEncoding]]; 
[postData appendData:[@"&package=xxxxx" dataUsingEncoding:NSUTF8StringEncoding]]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://72.89.157.153:3000/notifications/sendNotification"] 
                 cachePolicy:NSURLRequestUseProtocolCachePolicy 
                timeoutInterval:10.0]; 
[request setHTTPMethod:@"POST"]; 
[request setAllHTTPHeaderFields:headers]; 
[request setHTTPBody:postData]; 

NSURLSession *session = [NSURLSession sharedSession]; 
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request 
              completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
               if (error) { 
                NSLog(@"%@", error); 
               } else { 
                NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
                NSLog(@"%@", httpResponse); 
               } 
              }]; 
[dataTask resume]; 

:

const express = require('express'); 
const path = require('path'); 
const gcm = require('node-gcm'); 
const apn = require('apn'); 

const apnProvider = new apn.Provider({ 
    token: { 
    // YOU CAN FOUND THIS KEYS AND THE CERTIFICATE ON APPLE DEVELOPERS SITE 
    key: path.resolve(__dirname, 'PATH TO YOUR CERTIFICATE.P8'), 
    keyId: YOUR APN KEY ID, 
    teamId: YOUR APN TEAM ID, 
    }, 
    production: false, 
}); 

router.post('/sendNotification', (req, res) => { 
const deviceToken = req.body.token; 
const message = req.body.message; 
const payload = req.body.payload; 
const packages = req.body.package; 

switch (packages) { 
    case 'com.foo.bar': { 
    const notification = new apn.Notification(); 
    notification.topic = 'com.foo.bar'; 
    notification.expiry = Math.floor(Date.now()/1000) + 3600; 
    notification.badge = 1; 
    notification.sound = 'ping.aiff'; 
    notification.alert = { message }; 
    notification.payload = { payload }; 
    apnProvider.send(notification, deviceToken).then((result) => { 
    return result === 200 ? res.sendStatus(200, result) : res.sendStatus(400); 
    }); 
    break; 
} 
case 'com.yourteam.foo.bar': { 
    const androidMessage = new gcm.Message({ 
    priority: 'high', 
    contentAvailable: true, 
    delayWhileIdle: false, 
    timeToLive: 10, 
    restrictedPackageName: 'com.yourteam.foo.bar', 
    dryRun: false, 
    data: { 
     title: 'foo', 
     icon: '@mipmap/logo', 
     notId: parseInt(Math.random() * new Date().getSeconds(), 10), 
     message, 
    }, 
    }); 
    const sender = new gcm.Sender(YOUR_KEY); 
    const registrationTokens = [deviceToken]; 
    sender.send(androidMessage, { registrationTokens }, (err, response) => { 
    return err ? res.send(err) : res.send(response); 
    }); 
    break; 
} 
default: 
    return res.sendStatus(400); 
} 
}); 

Jetzt eine Push-Benachrichtigung Sie eine POST wie diese tun müssen schicken SWIFT

import Foundation 

let headers = [ 
    "content-type": "application/x-www-form-urlencoded", 
    "cache-control": "no-cache" 
] 

let postData = NSMutableData(data: "token=xxxxx".data(using: String.Encoding.utf8)!) 
postData.append("&message=xxxxx".data(using: String.Encoding.utf8)!) 
postData.append("&payload=xxxxx".data(using: String.Encoding.utf8)!) 
postData.append("&package=xxxxx".data(using: String.Encoding.utf8)!) 

let request = NSMutableURLRequest(url: NSURL(string: "http://72.89.157.153:3000/notifications/sendNotification")! as URL, 
             cachePolicy: .useProtocolCachePolicy, 
            timeoutInterval: 10.0) 
request.httpMethod = "POST" 
request.allHTTPHeaderFields = headers 
request.httpBody = postData as Data 

let session = URLSession.shared 
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in 
    if (error != nil) { 
    print(error) 
    } else { 
    let httpResponse = response as? HTTPURLResponse 
    print(httpResponse) 
    } 
}) 

dataTask.resume() 

WEB (AJAX)

var settings = { 
    "async": true, 
    "crossDomain": true, 
    "url": "http://72.89.157.153:3000/notifications/sendNotification", 
    "method": "POST", 
    "headers": { 
    "content-type": "application/x-www-form-urlencoded", 
    "cache-control": "no-cache" 
    }, 
    "data": { 
    "token": "xxxxx", 
    "message": "xxxxx", 
    "payload": "xxxxx", 
    "package": "xxxxx" 
    } 
} 

$.ajax(settings).done(function (response) { 
    console.log(response); 
}); 

JAVA

OkHttpClient client = new OkHttpClient(); 

MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); 
RequestBody body = RequestBody.create(mediaType, "token=xxxxx&message=xxxxx&payload=xxxxx&package=xxxxx"); 
Request request = new Request.Builder() 
    .url("http://72.89.157.153:3000/notifications/sendNotification") 
    .post(body) 
    .addHeader("content-type", "application/x-www-form-urlencoded") 
    .addHeader("cache-control", "no-cache") 
    .build(); 

Response response = client.newCall(request).execute(); 

Jetzt können Sie Push-Benachrichtigungen an alle Geräte senden.

Ihr zweites Ziel kann einfach mit Ihrer Server-Seite erledigt werden, wenn eine Anfrage an Ihre URL gesendet wird, können Sie eine Push-Benachrichtigung senden, zum Beispiel wenn jemand Sie als Freund hinzufügen möchte Sie haben eine Anfrage an http://72.89.157.153:3000/friends/ {account_id}) gemacht. Sie können eine Benachrichtigung an den Benutzer senden, die ihm mitteilt, dass er eine neue Freundschaftsanfrage hat.

Es ist wichtig, das ist auf mongodb Sie speichern das Paket und das Zeichen Ihrer Benutzer, so dass Sie die richtigen Benachrichtigungen senden können.

Ich hoffe, es hilft.

Verwandte Themen