-1

私のアプリの機能を紹介させてください、私はプッシュ通知とアドレス帳とCoreTelephonyフレームワークを使用しています。

私がアプリケーションで行っていることは、プッシュ通知を受け取ったら、ペイロードから番号を Appdelegate Variable(Incoming_NO) に保存することです。この番号のような連絡先がない場合は、新しい連絡先を作成して保存します。通話を受信すると、以前に追加したのと同じ連絡先名が表示されます。後で、ユーザーが連絡先を保存または削除したい場合は、連絡先を編集できるようにしています。連絡先を編集したとき、後でプッシュを受信したとき同じ番号の通知 (Incoming_NO) へのexc_bad_accessを取得しています ゾンビを有効にしましたが、同じ場所でブレークポイント エラーが発生しました ..

何が問題なのか誰でも助けてくれますか。

    Received notification: {
        aps =     {
            alert = "Please help me-+918884718240";
            sound = "beep.caf";
        };
    }

コード :

 NSString* alertValue = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];

 NSRange range=[alertValue rangeOfString:@":"];
    NSString *param,*msg;
    NSRange range1=[alertValue rangeOfString:@":"];
    if (range1.location != NSNotFound)
    {
        param = [alertValue substringFromIndex:range1.location + range1.length];

        msg=[alertValue substringToIndex:range.location + range.length-1];
    }
    else
    {
        range1=[alertValue rangeOfString:@"-"];
        if (range1.location != NSNotFound)
        {
            param = [alertValue substringFromIndex:range1.location + range1.length];

            msg=[alertValue substringToIndex:range1.location + range1.length-1];
        }


    }
if(range.length!=0)
    {
        parts= [NSMutableArray arrayWithArray:[alertValue componentsSeparatedByString:@":"]];

    }else
    {
        parts = [NSMutableArray arrayWithArray:[alertValue componentsSeparatedByString:@"-"]];
    }

incoming_Number =[parts objectAtIndex:1];        

この変数 (incoming_Number) については、連絡先を保存した後にプッシュ通知を受信するとエラーが発生します。

incoming_Number型を NSString および NSMutableString に変更しようとしましたが、それでも同じエラーです。何が起こっているのかは、解放されたオブジェクトを参照しているためだと思います。しかし、デバッガーでは、値があることがわかります。

連絡先コードの追加:

- (void)setContacts:(UIImage *) imgdata :(NSString *)incoming_number {


ABRecordRef person=NULL;
ABRecordRef loopingPerson=NULL;
_Bool vizzical_present=false;
CFErrorRef myError = NULL;
NSArray *allContacts;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &myError);
//    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(nil, nil);

__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
        accessGranted = granted;
        dispatch_semaphore_signal(sema);
    });
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    //dispatch_release(sema);
}
else { // we're on iOS 5 or older
    accessGranted = YES;
}

if (accessGranted) {
   //     int count = (int) ABAddressBookGetPersonCount(addressBook);


   allContacts = (__bridge_transfer NSArray
                            *)ABAddressBookCopyArrayOfAllPeople(addressBook);

  for(CFIndex i = 1; i < allContacts.count; i++)
    {

        loopingPerson = (__bridge ABRecordRef)allContacts[i];

        CFStringRef firstName;
        // char *lastNameString, *firstNameString;
        firstName = ABRecordCopyValue(loopingPerson, kABPersonFirstNameProperty);
        if([(__bridge NSString *)(firstName) isEqualToString:@"VizziCal"]){
            vizzical_present=true;
        }
        ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(loopingPerson, kABPersonPhoneProperty);

        //     NSMutableArray *numbersArray = [[NSMutableArray alloc] init];

       // CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex( phoneNumbers, 0 );
        CFStringRef phoneNumberValue = ABMultiValueCopyValueAtIndex( phoneNumbers, 0 );
        NSString* noSpaces =
        [[(__bridge NSString *)phoneNumberValue componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]componentsJoinedByString:@""];
        if(phoneNumberValue!=NULL){
        NSString* noHypen =
        [noSpaces stringByReplacingOccurrencesOfString:@"-" withString:@""];
       // CFStringRef phoneNumberLocalizedLabel = ABAddressBookCopyLocalizedLabel( phoneNumberLabel );
       // NSString *addPlus=[[NSString alloc]initWithFormat:@"%@",incoming_number] ;

            if([incoming_number isEqual:noHypen] || ([incoming_number rangeOfString:noHypen].location!=NSNotFound)){
       NSLog(@"%@  and %@ and %ld",incoming_number,noHypen,i);
                person=loopingPerson;
            break;

            }
        }

    }

    if(person!=NULL){
    CFErrorRef error = nil;
    CFDataRef imageData = ABPersonCopyImageData(person);
        NSData* imageData1 = (__bridge NSData*)ABPersonCopyImageData(person);


    UIImage *image = [UIImage imageWithData:(__bridge NSData *)(imageData)];

        UIImage *image1 = [UIImage imageWithData:(NSData *)(imageData1)];


    NSData *dataRef;
    UIImage  *mergedImage;
    if(image!=NULL)
    {
        dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   savedImagePath= [self saveImage:image1 forPerson:@"image"];

                 });


        dataRef = UIImagePNGRepresentation(imgdata);

        CFRelease(imageData);
    }
    else{

        if(imgdata.size.height <480 && imgdata.size.width<320)

        {

        UIImage *image = [UIImage imageNamed:@"blank_image.png"];


        mergedImage=[self mergeTwoImages:imgdata :image];


        CGFloat width = imgdata.size.width;
        CGFloat height = imgdata.size.height;

        NSLog(@"Height:%f and Width =%f",width,height);
        dataRef = UIImagePNGRepresentation(mergedImage);
        }

        else{

         dataRef = UIImagePNGRepresentation(imgdata);
        }

    }
    CFDataRef cfDataRef = CFDataCreate(NULL, [dataRef bytes], [dataRef length]);

    if (ABPersonHasImageData(person)) {
        ABPersonRemoveImageData(person, &error);
        ABAddressBookSave(addressBook, &error);

    }
    //ABRecordSetValue(person, kABPersonFirstNameProperty, @"Don Juan", NULL);

    // ABAddressBookAddRecord(addressBook, person, &error);

    if (ABPersonSetImageData(person, cfDataRef, &error)) {
        if (ABAddressBookHasUnsavedChanges(addressBook)) {
            NSLog(@"has unsaved changes");
        } else {
            NSLog(@"nothing to save");
        }
        if (ABAddressBookSave(addressBook, &error)) {
            NSLog(@"saved");
        } else {
            NSLog(@"not saved");
        }
    }

    }

    else{

        if(!vizzical_present)
        {
        ABRecordRef newPerson = ABPersonCreate();

        ABRecordSetValue(newPerson, kABPersonFirstNameProperty, @"VizziCal", &myError);

            CFDataRef dataRef = (__bridge CFDataRef)(UIImagePNGRepresentation(imgdata));
            [prefs setBool:YES forKey:@"contact-created"];


        //Phone number is a list of phone number, so create a multivalue
        ABMutableMultiValueRef phoneNumberMultiValue =
        ABMultiValueCreateMutable(kABPersonPhoneProperty);
        ABMultiValueAddValueAndLabel(phoneNumberMultiValue ,(__bridge CFTypeRef)(incoming_number),kABPersonPhoneMobileLabel, NULL);
   // ...
            // Set other properties
            ABRecordSetValue(newPerson, kABPersonPhoneProperty, phoneNumberMultiValue, &myError);
            // ...
            ABAddressBookAddRecord(addressBook, newPerson, &myError);



        ABAddressBookSave(addressBook, &myError);

        if (myError != NULL)
        {
            CFStringRef errorDesc = CFErrorCopyDescription(myError);
            NSLog(@"Contact not saved: %@", errorDesc);
            CFRelease(errorDesc);        
        }



        if (ABPersonSetImageData(newPerson, dataRef, &myError)) {
            if (ABAddressBookHasUnsavedChanges(addressBook)) {
                NSLog(@"has unsaved changes");
            } else {
                NSLog(@"nothing to save");
            }
            if (ABAddressBookSave(addressBook, &myError)) {
                NSLog(@"saved");
            } else {
                NSLog(@"not saved");
            }
        }

        CFRelease(newPerson);
        CFRelease(addressBook);

        CFRelease(phoneNumberMultiValue);
    }
        else
        {
            ABRecordRef newPerson = ABPersonCreate();


            for(CFIndex i = 1; i < allContacts.count; i++)
            {

                loopingPerson = (__bridge ABRecordRef)allContacts[i];

                CFStringRef firstName;
                // char *lastNameString, *firstNameString;
                firstName = ABRecordCopyValue(loopingPerson, kABPersonFirstNameProperty);
                NSString *name=(__bridge NSString *)(firstName);

                if([name isEqualToString:@"VizziCal"])
                    break;



            }
            if(loopingPerson !=NULL )
            {
                      [prefs setBool:YES forKey:@"contact-created"];

                    CFDataRef dataRef = (__bridge CFDataRef)(UIImagePNGRepresentation(imgdata));


                    //Phone number is a list of phone number, so create a multivalue
                    ABMutableMultiValueRef phoneNumberMultiValue =
                    ABMultiValueCreateMutable(kABPersonPhoneProperty);
                    ABMultiValueAddValueAndLabel(phoneNumberMultiValue ,(__bridge CFTypeRef)(incoming_number),kABPersonPhoneMobileLabel, NULL);
                    // ...
                    // Set other properties
                    ABRecordSetValue(newPerson, kABPersonPhoneProperty, phoneNumberMultiValue, &myError);
                    // ...
                    ABAddressBookAddRecord(addressBook, newPerson, &myError);


                    ABAddressBookSave(addressBook, &myError);

                    if (myError != NULL)
                    {
                        CFStringRef errorDesc = CFErrorCopyDescription(myError);
                        NSLog(@"Contact not saved: %@", errorDesc);
                        CFRelease(errorDesc);
                    }



                    if (ABPersonSetImageData(newPerson, dataRef, &myError)) {
                        if (ABAddressBookHasUnsavedChanges(addressBook)) {
                            NSLog(@"has unsaved changes");
                        } else {
                            NSLog(@"nothing to save");
                        }
                        if (ABAddressBookSave(addressBook, &myError)) {
                            NSLog(@"saved");
                        } else {
                            NSLog(@"not saved");
                        }
                    }

                    CFRelease(newPerson);
                    CFRelease(addressBook);

                    CFRelease(phoneNumberMultiValue);

            }
        }

    }

}
}

ここで私がやっていることは、人が存在するかどうかを確認していることです。そうでない場合は、デフォルトの連絡先「VizziCal」を確認しています。存在しない場合は、新しい連絡先を「VizziCal」として作成しています。

4

1 に答える 1

0

まず、取得のためにこれらすべてを実行するのではなく、このためにカスタム ペイロードをIncoming No試します。

簡単です。

プッシュ通知プログラミングガイドをご覧ください

あなたが試すことができます:

{ "alert": "Please help me", "phone": "9999999999" }

注: これはサーバー側で作成されます。

于 2013-10-17T12:26:27.923 に答える