Question

I have a app that works when I run it on my iPad from xcode, but when I prepare it for AdHoc distribution, it will not function correctly.

My thread is:

[NSThread detachNewThreadSelector:@selector(wifiBackground) toTarget:self withObject:nil];

The wifiBackground is:

-(void)wifiBackground
{

[self setupSocket];
[NSThread sleepForTimeInterval:1.0f];

while (YES) {
    [NSThread sleepForTimeInterval:3.0f];
    if (mNetAlive == [NSNumber numberWithInt:TCP_PORT_OK]) //is connected (can send messages through internet)
    {
        //setup for sending tcp msg, grab network info
        NSString *mWifiname = [self fetchSSIDInfo];
        NSLog(@"mWifiname %@", mWifiname);
        [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"mWifiname %@,,,,",mWifiname] :YES :YES];


        //send messages if new or changed
        if ((wifi_name == nil || wifi_name == (id)[NSNull null] || ([wifi_name length] == 0)) ) { //is null
             NSLog(@"is null");
            [self sendMsgType:WIFI_UDP_CX msgArg1:WIFI_CX_NEW msgArg2:[NSNumber numberWithInt:0] wifiName:mWifiname buffer:nil];
        } else if ([wifi_name containsString:mWifiname]) {
            [self sendMsgType:WIFI_UDP_CX msgArg1:WIFI_CX_CHANGE msgArg2:[NSNumber numberWithInt:0] wifiName:mWifiname buffer:nil];
        }

        wifi_name = mWifiname;
        mTcpState = [NSNumber numberWithInt:TCP_PORT_OPEN];
        retrycount = 0;
        [NSThread sleepForTimeInterval:1.0f];


        while (mTcpState == [NSNumber numberWithInt:TCP_PORT_OPEN] && ([mWifiname containsString:mCurrentSSID])) {
            [self setupSocket];
            [NSThread sleepForTimeInterval:2.0f];

            mTcpAlive = [NSNumber numberWithInt:TCP_PORT_OK];
            mWifiAlert = [NSNumber numberWithInt:0];

            [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"connected %d,mwifiName %@,current ssid %@,,",[asyncSocket isConnected],mWifiname,mCurrentSSID] :YES :YES];
            while ([asyncSocket isConnected] && ([mWifiname containsString:mCurrentSSID])) {
                if (reading == NO) {
                    NSMutableArray *mytx = tx;
                    [self send:mytx];
                }

                //recieve info
                reading = YES;
                [self startRead];
                while (reading == YES) {} //wait
            }
            retrycount++;
            if (retrycount >= 3) {
                NSLog(@"in retry");
                [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"in retry,,,,"] :YES :YES];

                if (([mWifiAlert intValue] == 0) && ![mWifiname containsString:mCurrentSSID]) { mWifiAlert = [NSNumber numberWithInt:1]; }

                [asyncSocket disconnect];
                [NSThread sleepForTimeInterval:1.5f];
                //obviously not connected to internet so shut down
                mTcpAlive =  [NSNumber numberWithInt:TCP_PORT_OFF];
                [self sendMsgType:WIFI_UDP_CX msgArg1:WIFI_CX_RX_ERROR msgArg2:[NSNumber numberWithInt:0] wifiName:mWifiname buffer:nil];
                break; //breaks out of while
            }
        }

        if (!([mWifiname containsString:mCurrentSSID])) {
            NSLog(@"not correct wifi");
            [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"not correct wifi,,,,"] :YES :YES];
            if ([mWifiAlert intValue] == 0) {
                mWifiAlert = [NSNumber numberWithInt:1];
            }

            [NSThread sleepForTimeInterval:5.0f];
        }

     } else {
         noWifiOn++;

         NSLog(@"in else mNetAlive");
         [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"in else mNetAlive,,,,"] :YES :YES];
         if (noWifiOn >= 5) {
             if ([mWifiAlert intValue] == 0) {
                 mWifiAlert = [NSNumber numberWithInt:2];
             }

             NSLog(@"alert view");
             noWifiOn = 0;
             [NSThread sleepForTimeInterval:5.0f];
         }
         mTcpAlive = [NSNumber numberWithInt:TCP_PORT_FAIL];

     }
    [NSThread sleepForTimeInterval:2.0f];
 }
}

The socketDidRead:

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tags
{
reading = YES;
const unsigned char *dataBytes = [data bytes];
NSUInteger dataLength = [data length];

if (buf_ptr == 0) {
    TCP_size = [self strintvalue:[NSString stringWithFormat:@"%02x%02x",dataBytes[2],dataBytes[1]]];
}

buf_ptr = buf_ptr + (int)dataLength;
//NSLog(@"buf ptr = %i",buf_ptr);

if ((buf_ptr < TCP_size) && (TCP_size <=12000)) {
    [ds appendData:data];
    [self startRead];
} else if (buf_ptr == TCP_size){
    [ds appendData:data]; //append the final bit for this package
    //NSLog(@"ds = %@",ds);
    [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"socketDidRead,,,,"] :YES :YES];
    NSLog(@"tcp size = buf_ptr");
    [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"tcp size = buf_ptr,,,,"] :YES :YES];
    const unsigned char *allDataBytes = [ds bytes];
    [self processRead:allDataBytes];
    reading = NO;
    mTcpAlive = [NSNumber numberWithInt:TCP_PORT_OK];
    retrycount = 0;
    buf_ptr = 0;
    [ds setLength:0];
} else {
    [self sendMsgType:WIFI_UDP_CX msgArg1:WIFI_CX_RX_ERROR msgArg2:0 wifiName:wifi_name buffer:nil];
    buf_ptr = 0;
    [ds setLength:0];
}
}

In essence: wifiBackground checks to see if connected to the internet,connect a socket, sends a packet to the network(timeout of 5s), waits for reading to be done(timeout of 5s), and then repeats with the packet sent being updated. If the network closes, it should retry connecting.

When I run it as AdHoc, it will loop around if it can't connect right away, but it will stop (the entire thread) once a read is done without going to processRead. eg)

socketDidDisconnect
socketDidDisconnect
socketDidRead
tcp size = but_ptr
socketDidDisconnect (error = null)

Why is processRead never called? This works from xcode and I am unsure as to why it doesn't work now.

I have tried:

dispatch_async(dispatch_get_main_queue(), ^{
        [self processRead:allDataBytes];
    });

but the same thing as above happens.

I was going to try performSelectorOnMainThread but since processRead uses const unsigned char it give me an error that it isn't correct object.

Was it helpful?

Solution

My problem was with these lines:

//recieve info
reading = YES;
[self startRead];
while (reading == YES) {} //wait

It would get stuck in the while loop. I removed it and changed some of the logic surrounding it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top